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