From e68d2d2c725fda82ccdbc5993fe69f112a1c1ad0 Mon Sep 17 00:00:00 2001
From: ynwang <ynwang@google.com>
Date: Fri, 1 Jul 2016 12:18:54 -0700
Subject: [PATCH] Storaged permissions for task I/O

Allow storaged to read /proc/[pid]/io
Grant binder access to storaged
Add storaged service
Grant storaged_exec access to dumpstate
Grant storaged binder_call to dumpstate

Bug: 32221677

Change-Id: Iecc9dba266c5566817a99ac6251eb943a0bac630
---
 private/domain.te        |  1 +
 private/dumpstate.te     |  4 ++++
 private/service_contexts |  1 +
 private/storaged.te      | 21 +++++++++++++++++----
 public/service.te        |  1 +
 5 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/private/domain.te b/private/domain.te
index c975ce661..b0c7ac761 100644
--- a/private/domain.te
+++ b/private/domain.te
@@ -5,6 +5,7 @@ neverallow {
   -debuggerd
   -vold
   -dumpstate
+  -storaged
   -system_server
   userdebug_or_eng(`-perfprofd')
 } self:capability sys_ptrace;
diff --git a/private/dumpstate.te b/private/dumpstate.te
index a54591d86..6a6629371 100644
--- a/private/dumpstate.te
+++ b/private/dumpstate.te
@@ -13,3 +13,7 @@ allow dumpstate debugfs_tracing:dir r_dir_perms;
 allow dumpstate debugfs_tracing:file rw_file_perms;
 allow dumpstate debugfs_trace_marker:file getattr;
 allow dumpstate atrace_exec:file rx_file_perms;
+allow dumpstate storaged_exec:file rx_file_perms;
+
+# Allow dumpstate to make binder calls to storaged service
+binder_call(dumpstate, storaged)
diff --git a/private/service_contexts b/private/service_contexts
index 2f3139341..5414f1123 100644
--- a/private/service_contexts
+++ b/private/service_contexts
@@ -133,6 +133,7 @@ simphonebook                              u:object_r:radio_service:s0
 sip                                       u:object_r:radio_service:s0
 soundtrigger                              u:object_r:voiceinteraction_service:s0
 statusbar                                 u:object_r:statusbar_service:s0
+storaged                                  u:object_r:storaged_service:s0
 SurfaceFlinger                            u:object_r:surfaceflinger_service:s0
 task                                      u:object_r:task_service:s0
 telecom                                   u:object_r:telecom_service:s0
diff --git a/private/storaged.te b/private/storaged.te
index e9a959c63..bf5c24292 100644
--- a/private/storaged.te
+++ b/private/storaged.te
@@ -1,5 +1,5 @@
 # storaged daemon
-type storaged, domain;
+type storaged, domain, mlstrustedsubject;
 type storaged_exec, exec_type, file_type;
 
 init_daemon_domain(storaged)
@@ -11,9 +11,22 @@ allow storaged kmsg_device:chr_file { write append };
 allow storaged proc:dir r_dir_perms;
 r_dir_file(storaged, sysfs_type)
 r_dir_file(storaged, proc_net)
+r_dir_file(storaged, domain)
 
-# Read access to debugfs
-allow storaged debugfs_mmc:dir search;
-allow storaged debugfs_mmc:file r_file_perms;
+allow storaged self:capability { setgid setuid sys_nice sys_ptrace };
 
+userdebug_or_eng(`
+  # Read access to debugfs
+  allow storaged debugfs_mmc:dir search;
+  allow storaged debugfs_mmc:file r_file_perms;
+')
 
+# Binder permissions
+allow storaged storaged_service:service_manager add;
+binder_use(storaged)
+binder_call(storaged, system_server)
+
+###
+### neverallow
+###
+neverallow storaged domain:process ptrace;
diff --git a/public/service.te b/public/service.te
index 550f79bb7..376208e4d 100644
--- a/public/service.te
+++ b/public/service.te
@@ -19,6 +19,7 @@ type mediadrmserver_service,    service_manager_type;
 type netd_service,              service_manager_type;
 type nfc_service,               service_manager_type;
 type radio_service,             service_manager_type;
+type storaged_service,          service_manager_type;
 type surfaceflinger_service,    service_manager_type;
 type system_app_service,        service_manager_type;
 type update_engine_service,     service_manager_type;
-- 
GitLab