From b5f5931e8c97a08f2e5d18356739211521c519a8 Mon Sep 17 00:00:00 2001
From: Felipe Leme <felipeal@google.com>
Date: Fri, 28 Oct 2016 15:52:15 -0700
Subject: [PATCH] Added permissions for the dumpstate service.

- Allow dumpstate to create the dumpservice service.
- Allow System Server and Shell to find that service.
- Don't allow anyone else to create that service.
- Don't allow anyone else to find that service.

BUG: 31636879
Test: manual verification
Change-Id: I642fe873560a2b123e6bafde645467d45a5f5711
---
 private/service_contexts |  1 +
 public/dumpstate.te      | 15 ++++++++++++++-
 public/service.te        |  1 +
 public/shell.te          |  5 ++++-
 public/system_app.te     |  3 ++-
 public/system_server.te  |  1 +
 6 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/private/service_contexts b/private/service_contexts
index ff9305b7b..2055cdcb1 100644
--- a/private/service_contexts
+++ b/private/service_contexts
@@ -43,6 +43,7 @@ DockObserver                              u:object_r:DockObserver_service:s0
 dreams                                    u:object_r:dreams_service:s0
 drm.drmManager                            u:object_r:drmserver_service:s0
 dropbox                                   u:object_r:dropbox_service:s0
+dumpstate                                 u:object_r:dumpstate_service:s0
 ethernet                                  u:object_r:ethernet_service:s0
 fingerprint                               u:object_r:fingerprint_service:s0
 android.hardware.fingerprint.IFingerprintDaemon u:object_r:fingerprintd_service:s0
diff --git a/public/dumpstate.te b/public/dumpstate.te
index 57e870367..24e345eb3 100644
--- a/public/dumpstate.te
+++ b/public/dumpstate.te
@@ -174,7 +174,7 @@ userdebug_or_eng(`
   allow dumpstate misc_logd_file:file r_file_perms;
 ')
 
-allow dumpstate { service_manager_type -gatekeeper_service }:service_manager find;
+allow dumpstate { service_manager_type -gatekeeper_service -dumpstate_service }:service_manager find;
 allow dumpstate servicemanager:service_manager list;
 
 allow dumpstate devpts:chr_file rw_file_perms;
@@ -197,3 +197,16 @@ allow dumpstate atrace_exec:file rx_file_perms;
 allow dumpstate media_rw_data_file:dir getattr;
 allow dumpstate proc_interrupts:file r_file_perms;
 allow dumpstate proc_zoneinfo:file r_file_perms;
+
+# Create a service for talking back to system_server
+allow dumpstate dumpstate_service:service_manager add;
+
+###
+### neverallow rules
+###
+
+# only dumpstate can add the dumpstate service
+neverallow { domain -dumpstate } dumpstate_service:service_manager add;
+
+# only system_server and shell can find the dumpstate service
+neverallow { domain -system_server -shell } dumpstate_service:service_manager find;
diff --git a/public/service.te b/public/service.te
index 33ce13fac..9d8563e1e 100644
--- a/public/service.te
+++ b/public/service.te
@@ -3,6 +3,7 @@ type bluetooth_service,         service_manager_type;
 type cameraserver_service,      service_manager_type;
 type default_android_service,   service_manager_type;
 type drmserver_service,         service_manager_type;
+type dumpstate_service,         service_manager_type;
 type gatekeeper_service,        app_api_service, service_manager_type;
 type fingerprintd_service,      service_manager_type;
 type batteryproperties_service, app_api_service, service_manager_type;
diff --git a/public/shell.te b/public/shell.te
index a31b153d1..0e747b73f 100644
--- a/public/shell.te
+++ b/public/shell.te
@@ -91,7 +91,10 @@ allow shell kernel:system syslog_read;
 # allow shell access to services
 allow shell servicemanager:service_manager list;
 # don't allow shell to access GateKeeper service
-allow shell { service_manager_type -gatekeeper_service -netd_service }:service_manager find;
+# TODO: why is this so broad? Tightening candidate? It needs at list:
+# - dumpstate_service (so it can receive dumpstate progress updates)
+allow shell { service_manager_type -gatekeeper_service -netd_service}:service_manager find;
+allow shell dumpstate:binder call;
 
 # allow shell to look through /proc/ for ps, top, netstat
 r_dir_file(shell, proc)
diff --git a/public/system_app.te b/public/system_app.te
index b05bcb9f2..7896ac556 100644
--- a/public/system_app.te
+++ b/public/system_app.te
@@ -49,7 +49,8 @@ allow system_app anr_data_file:file create_file_perms;
 allow system_app asec_apk_file:file r_file_perms;
 
 allow system_app servicemanager:service_manager list;
-allow system_app { service_manager_type -netd_service }:service_manager find;
+# TODO: scope this down? Too broad?
+allow system_app { service_manager_type -netd_service -dumpstate_service }:service_manager find;
 
 allow system_app keystore:keystore_key {
 	get_state
diff --git a/public/system_server.te b/public/system_server.te
index f700a77be..b59aa0596 100644
--- a/public/system_server.te
+++ b/public/system_server.te
@@ -443,6 +443,7 @@ allow system_server sysfs_zram:file r_file_perms;
 allow system_server audioserver_service:service_manager find;
 allow system_server cameraserver_service:service_manager find;
 allow system_server drmserver_service:service_manager find;
+allow system_server dumpstate_service:service_manager find;
 allow system_server batteryproperties_service:service_manager find;
 allow system_server keystore_service:service_manager find;
 allow system_server gatekeeper_service:service_manager find;
-- 
GitLab