From da62cb4dda9c7e77dc67ced441d7ffe6fd3f2f2a Mon Sep 17 00:00:00 2001
From: Mark Salyzyn <salyzyn@google.com>
Date: Wed, 10 Aug 2016 11:10:02 -0700
Subject: [PATCH] logcat: introduce split to logd and logpersist domains

- transition to logpersist from init
- sort some overlapping negative references
- intention is to allow logpersist to be used by vendor
  userdebug logging

Test: gTest liblog-unit-tests, logd-unit-tests & logcat-unit-tests
Bug: 30566487
Change-Id: I7806f5a2548cbe0c1f257a0ba2855f2eb69d8e7c
---
 private/init.te       |  2 +-
 private/logd.te       |  2 +-
 private/logpersist.te | 21 +++++++++++++++++++++
 public/init.te        | 37 +++++++++++++++++++------------------
 public/logd.te        | 18 ------------------
 public/logpersist.te  | 16 ++++++++++++++++
 public/shell.te       |  7 ++-----
 7 files changed, 60 insertions(+), 43 deletions(-)
 create mode 100644 private/logpersist.te
 create mode 100644 public/logpersist.te

diff --git a/private/init.te b/private/init.te
index a42b525fc..d495d5473 100644
--- a/private/init.te
+++ b/private/init.te
@@ -15,5 +15,5 @@ domain_trans(init, init_exec, ueventd)
 domain_trans(init, init_exec, watchdogd)
 # case where logpersistd is actually logcat -f in logd context (nee: logcatd)
 userdebug_or_eng(`
-  domain_auto_trans(init, logcat_exec, logd)
+  domain_auto_trans(init, logcat_exec, logpersist)
 ')
diff --git a/private/logd.te b/private/logd.te
index fcdd6a180..73a3febb4 100644
--- a/private/logd.te
+++ b/private/logd.te
@@ -5,4 +5,4 @@ init_daemon_domain(logd)
 # logd is not allowed to write anywhere other than /data/misc/logd, and then
 # only on userdebug or eng builds
 # TODO: deal with tmpfs_domain pub/priv split properly
-neverallow logd { file_type -logd_tmpfs userdebug_or_eng(` -misc_logd_file -coredump_file ') }:file { create write append };
+neverallow logd { file_type -logd_tmpfs userdebug_or_eng(`-coredump_file') }:file { create write append };
diff --git a/private/logpersist.te b/private/logpersist.te
new file mode 100644
index 000000000..88733de12
--- /dev/null
+++ b/private/logpersist.te
@@ -0,0 +1,21 @@
+# android debug log storage in logpersist domains (eng and userdebug only)
+userdebug_or_eng(`
+
+  r_dir_file(logpersist, cgroup)
+
+  allow logpersist misc_logd_file:file create_file_perms;
+  allow logpersist misc_logd_file:dir rw_dir_perms;
+
+  allow logpersist self:capability sys_nice;
+  allow logpersist pstorefs:dir search;
+  allow logpersist pstorefs:file r_file_perms;
+
+  control_logd(logpersist)
+  unix_socket_connect(logpersist, logdr, logd)
+
+')
+
+# logpersist is allowed to write to /data/misc/log for userdebug and eng builds
+neverallow logpersist { file_type userdebug_or_eng(`-misc_logd_file -coredump_file') }:file { create write append };
+neverallow { domain userdebug_or_eng(`-logpersist -dumpstate') } misc_logd_file:file no_rw_file_perms;
+neverallow { domain userdebug_or_eng(`-logpersist') } misc_logd_file:dir { add_name link relabelfrom remove_name rename reparent rmdir write };
diff --git a/public/init.te b/public/init.te
index bfbf6d163..54a975988 100644
--- a/public/init.te
+++ b/public/init.te
@@ -116,58 +116,59 @@ allow init self:capability { chown fowner fsetid };
 
 allow init {
   file_type
-  -system_file
-  -exec_type
   -app_data_file
+  -exec_type
+  -misc_logd_file
   -system_app_data_file
+  -system_file
 }:dir { create search getattr open read setattr ioctl };
 
 allow init {
   file_type
-  -system_file
+  -app_data_file
   -exec_type
   -keystore_data_file
-  -app_data_file
-  -system_app_data_file
+  -misc_logd_file
   -shell_data_file
+  -system_app_data_file
+  -system_file
   -vold_data_file
-  -misc_logd_file
 }:dir { write add_name remove_name rmdir relabelfrom };
 
 allow init {
   file_type
-  -system_file
+  -app_data_file
   -exec_type
   -keystore_data_file
-  -app_data_file
-  -system_app_data_file
+  -misc_logd_file
   -shell_data_file
+  -system_app_data_file
+  -system_file
   -vold_data_file
-  -misc_logd_file
 }:file { create getattr open read write setattr relabelfrom unlink };
 
 allow init {
   file_type
-  -system_file
+  -app_data_file
   -exec_type
   -keystore_data_file
-  -app_data_file
-  -system_app_data_file
+  -misc_logd_file
   -shell_data_file
+  -system_app_data_file
+  -system_file
   -vold_data_file
-  -misc_logd_file
 }:{ sock_file fifo_file } { create getattr open read setattr relabelfrom unlink };
 
 allow init {
   file_type
-  -system_file
+  -app_data_file
   -exec_type
   -keystore_data_file
-  -app_data_file
-  -system_app_data_file
+  -misc_logd_file
   -shell_data_file
+  -system_app_data_file
+  -system_file
   -vold_data_file
-  -misc_logd_file
 }:lnk_file { create getattr setattr relabelfrom unlink };
 
 allow init {file_type -system_file -exec_type}:dir_file_class_set relabelto;
diff --git a/public/logd.te b/public/logd.te
index c276dd995..e8d38618f 100644
--- a/public/logd.te
+++ b/public/logd.te
@@ -14,17 +14,9 @@ allow logd self:netlink_audit_socket { create_socket_perms_no_ioctl nlmsg_write
 allow logd kernel:system syslog_read;
 allow logd kmsg_device:chr_file w_file_perms;
 allow logd system_data_file:{ file lnk_file } r_file_perms;
-# logpersist is only allowed on userdebug and eng builds
-userdebug_or_eng(`
-  allow logd misc_logd_file:file create_file_perms;
-  allow logd misc_logd_file:dir rw_dir_perms;
-')
-allow logd pstorefs:dir search;
-allow logd pstorefs:file r_file_perms;
 
 # Access device logging gating property
 get_prop(logd, device_logging_prop)
-userdebug_or_eng(`get_prop(logd, logpersistd_logging_prop)')
 
 r_dir_file(logd, domain)
 
@@ -32,11 +24,6 @@ allow logd kernel:system syslog_mod;
 
 control_logd(logd)
 
-# case where logpersistd is actually logcat -f in logd context (nee: logcatd)
-userdebug_or_eng(`
-  unix_socket_connect(logd, logdr, logd)
-')
-
 ###
 ### Neverallow rules
 ###
@@ -56,8 +43,3 @@ neverallow logd system_file:dir_file_class_set write;
 
 # Write to files in /data/data or system files on /data
 neverallow logd { app_data_file system_data_file }:dir_file_class_set write;
-
-# logpersist is only allowed on userdebug/eng builds
-neverallow { domain userdebug_or_eng(`-logd -shell -dumpstate') } misc_logd_file:file no_rw_file_perms;
-neverallow { domain userdebug_or_eng(`-logd') } misc_logd_file:dir { add_name link relabelfrom remove_name rename reparent rmdir write };
-neverallow { domain -init } misc_logd_file:dir create;
diff --git a/public/logpersist.te b/public/logpersist.te
new file mode 100644
index 000000000..86eb0d3be
--- /dev/null
+++ b/public/logpersist.te
@@ -0,0 +1,16 @@
+# android debug logging, logpersist domains
+type logpersist, domain;
+
+###
+### Neverallow rules
+###
+### logpersist should NEVER do any of this
+
+# Block device access.
+neverallow logpersist dev_type:blk_file { read write };
+
+# ptrace any other app
+neverallow logpersist domain:process ptrace;
+
+# Write to files in /data/data or system files on /data except misc_logd_file
+neverallow logpersist { app_data_file system_data_file }:dir_file_class_set write;
diff --git a/public/shell.te b/public/shell.te
index 38a890c62..2fe0fc741 100644
--- a/public/shell.te
+++ b/public/shell.te
@@ -11,11 +11,6 @@ control_logd(shell)
 # logcat -L (directly, or via dumpstate)
 allow shell pstorefs:dir search;
 allow shell pstorefs:file r_file_perms;
-# logpersistd (nee logcatd) files
-userdebug_or_eng(`
-  allow shell misc_logd_file:dir r_dir_perms;
-  allow shell misc_logd_file:file r_file_perms;
-')
 
 # Root fs.
 allow shell rootfs:dir r_dir_perms;
@@ -65,7 +60,9 @@ set_prop(shell, debug_prop)
 set_prop(shell, powerctl_prop)
 set_prop(shell, log_tag_prop)
 set_prop(shell, wifi_log_prop)
+# adjust is_loggable properties
 userdebug_or_eng(`set_prop(shell, log_prop)')
+# logpersist script
 userdebug_or_eng(`set_prop(shell, logpersistd_logging_prop)')
 
 userdebug_or_eng(`
-- 
GitLab