diff --git a/private/file.te b/private/file.te index 58ee0def82540ac88fbc049c5eef678f32235a95..8d18a9084484936839385994ab324ca747a34d8c 100644 --- a/private/file.te +++ b/private/file.te @@ -1,11 +1,6 @@ # /proc/config.gz type config_gz, fs_type, proc_type; -# /data/misc/stats-data, /data/misc/stats-service -type stats_data_file, file_type, data_file_type, core_data_file_type; - -type statsdw_socket, file_type, coredomain_socket, mlstrustedobject; - # /data/misc/storaged type storaged_data_file, file_type, data_file_type, core_data_file_type; diff --git a/private/stats.te b/private/stats.te index be8cfbd25dabac7451790a18e92ace1fa51b57a2..4b29cf37f9ebaadf6fcb2222e78927fddca3b45d 100644 --- a/private/stats.te +++ b/private/stats.te @@ -23,3 +23,29 @@ allow stats stats_service:service_manager find; binder_call(stats, statsd) allow stats statsd:fifo_file write; +# Only statsd can publish the binder service. +add_service(statsd, stats_service) + +# Allow pipes from (and only from) stats. +allow statsd stats:fd use; +allow statsd stats:fifo_file write; + +# Allow statsd to call back to stats with status updates. +binder_call(statsd, stats) + +### +### neverallow rules +### + +# Only system_server, system_app, traceur_app, and stats command can find the stats service. +neverallow { + domain + -dumpstate + -priv_app + -shell + -stats + -statsd + -system_app + -system_server + -traceur_app +} stats_service:service_manager find; diff --git a/private/statsd.te b/private/statsd.te index 834fb8b7784486d088dacfb53912f24caa1056a9..1e4c5b392cb04cffadfe1c3cdb2f80813764c588 100644 --- a/private/statsd.te +++ b/private/statsd.te @@ -1,44 +1,8 @@ -type statsd, domain, mlstrustedsubject; typeattribute statsd coredomain; init_daemon_domain(statsd) -type statsd_exec, exec_type, file_type; -binder_use(statsd) - -# Allow statsd to scan through /proc/pid for all processes. -r_dir_file(statsd, domain) - -# Allow executing files on system, such as running a shell or running: -# /system/bin/toolbox -# /system/bin/logcat -# /system/bin/dumpsys -allow statsd devpts:chr_file { getattr ioctl read write }; -allow statsd shell_exec:file rx_file_perms; -allow statsd system_file:file execute_no_trans; -allow statsd toolbox_exec:file rx_file_perms; - -userdebug_or_eng(` - allow statsd su:fifo_file read; -') - -# Create, read, and write into /data/misc/stats-data, /data/misc/stats-system. -allow statsd stats_data_file:dir create_dir_perms; -allow statsd stats_data_file:file create_file_perms; - -# Allow statsd to make binder calls to any binder service. -binder_call(statsd, appdomain) -binder_call(statsd, healthd) -binder_call(statsd, incidentd) -userdebug_or_eng(` - binder_call(statsd, perfprofd) -') binder_call(statsd, statscompanion_service) -binder_call(statsd, system_server) - -# Allow logd access. -read_logd(statsd) -control_logd(statsd) # Allow to exec the perfetto cmdline client and pass it the trace config on # stdint through a pipe. It allows statsd to capture traces and hand them @@ -48,72 +12,5 @@ domain_auto_trans(statsd, perfetto_exec, perfetto) # Grant statsd with permissions to register the services. allow statsd { - app_api_service - incident_service - userdebug_or_eng(` - perfprofd_service - ') statscompanion_service - system_api_service }:service_manager find; - -# Grant statsd to access health hal to access battery metrics. -allow statsd hal_health_hwservice:hwservice_manager find; - -# Only statsd can publish the binder service. -add_service(statsd, stats_service) - -# Allow pipes from (and only from) stats. -allow statsd stats:fd use; -allow statsd stats:fifo_file write; - -# Allow statsd to send dump info to dumpstate -allow statsd dumpstate:fd use; -allow statsd dumpstate:fifo_file { getattr write }; - -# Allow statsd to call back to stats with status updates. -binder_call(statsd, stats) - -# Allow access to with hardware layer and process stats. -allow statsd proc_uid_cputime_showstat:file { getattr open read }; -hal_client_domain(statsd, hal_health) -hal_client_domain(statsd, hal_power) -hal_client_domain(statsd, hal_thermal) - -# Allow 'adb shell cmd' to upload configs and download output. -allow statsd adbd:fd use; -allow statsd adbd:unix_stream_socket { getattr read write }; -allow statsd shell:fifo_file { getattr read }; - -unix_socket_send(bluetooth, statsdw, statsd) -unix_socket_send(bootstat, statsdw, statsd) -unix_socket_send(lmkd, statsdw, statsd) -unix_socket_send(platform_app, statsdw, statsd) -unix_socket_send(radio, statsdw, statsd) -unix_socket_send(statsd, statsdw, statsd) -unix_socket_send(system_server, statsdw, statsd) - -### -### neverallow rules -### - -# Only system_server, system_app, traceur_app, and stats command can find the stats service. -neverallow { - domain - -dumpstate - -priv_app - -shell - -stats - -statsd - -system_app - -system_server - -traceur_app -} stats_service:service_manager find; - -# Only statsd and the other root services in limited circumstances. -# can get to the files in /data/misc/stats-data, /data/misc/stats-service. -# Other services are prohibitted from accessing the file. -neverallow { domain -statsd -system_server -init -vold } stats_data_file:file *; - -# Limited access to the directory itself. -neverallow { domain -statsd -system_server -init -vold } stats_data_file:dir *; diff --git a/public/app.te b/public/app.te index 3de24fbab3f25f1f4c221f5d372f5ded2af97a49..40a0a00ab76e18ffcb75620918f3894ec5608a97 100644 --- a/public/app.te +++ b/public/app.te @@ -166,6 +166,9 @@ allow appdomain shell_data_file:file { write getattr }; allow appdomain incidentd:fd use; allow appdomain incidentd:fifo_file { write getattr }; +# Allow apps to send information to statsd socket. +unix_socket_send(appdomain, statsdw, statsd) + # Write profiles /data/misc/profiles allow appdomain user_profile_data_file:dir { search write add_name }; allow appdomain user_profile_data_file:file create_file_perms; diff --git a/public/file.te b/public/file.te index 4b0dc2dcbc0e11761ae56efed4e7a2974b68526b..b70c4e2fa544860905c51ec730d93972b454a717 100644 --- a/public/file.te +++ b/public/file.te @@ -267,6 +267,7 @@ type nfc_data_file, file_type, data_file_type, core_data_file_type; type radio_data_file, file_type, data_file_type, core_data_file_type, mlstrustedobject; type recovery_data_file, file_type, data_file_type, core_data_file_type; type shared_relro_file, file_type, data_file_type, core_data_file_type; +type stats_data_file, file_type, data_file_type, core_data_file_type; type systemkeys_data_file, file_type, data_file_type, core_data_file_type; type textclassifier_data_file, file_type, data_file_type, core_data_file_type; type trace_data_file, file_type, data_file_type, core_data_file_type, mlstrustedobject; @@ -345,6 +346,7 @@ type racoon_socket, file_type, coredomain_socket; type recovery_socket, file_type, coredomain_socket; type rild_socket, file_type; type rild_debug_socket, file_type; +type statsdw_socket, file_type, coredomain_socket, mlstrustedobject; type system_wpa_socket, file_type, data_file_type, core_data_file_type, coredomain_socket; type system_ndebug_socket, file_type, data_file_type, core_data_file_type, coredomain_socket, mlstrustedobject; type tombstoned_crash_socket, file_type, coredomain_socket, mlstrustedobject; diff --git a/public/statsd.te b/public/statsd.te new file mode 100644 index 0000000000000000000000000000000000000000..c108805cbdbd9b7a00479d67b27eb460b22990f3 --- /dev/null +++ b/public/statsd.te @@ -0,0 +1,82 @@ +type statsd, domain, mlstrustedsubject; + +type statsd_exec, exec_type, file_type; +binder_use(statsd) + +# Allow statsd to scan through /proc/pid for all processes. +r_dir_file(statsd, domain) + +# Allow executing files on system, such as running a shell or running: +# /system/bin/toolbox +# /system/bin/logcat +# /system/bin/dumpsys +allow statsd devpts:chr_file { getattr ioctl read write }; +allow statsd shell_exec:file rx_file_perms; +allow statsd system_file:file execute_no_trans; +allow statsd toolbox_exec:file rx_file_perms; + +userdebug_or_eng(` + allow statsd su:fifo_file read; +') + +# Create, read, and write into /data/misc/stats-data, /data/misc/stats-system. +allow statsd stats_data_file:dir create_dir_perms; +allow statsd stats_data_file:file create_file_perms; + +# Allow statsd to make binder calls to any binder service. +binder_call(statsd, appdomain) +binder_call(statsd, healthd) +binder_call(statsd, incidentd) +userdebug_or_eng(` + binder_call(statsd, perfprofd) +') +binder_call(statsd, system_server) + +# Allow logd access. +read_logd(statsd) +control_logd(statsd) + +# Grant statsd with permissions to register the services. +allow statsd { + app_api_service + incident_service + userdebug_or_eng(` + perfprofd_service + ') + system_api_service +}:service_manager find; + +# Grant statsd to access health hal to access battery metrics. +allow statsd hal_health_hwservice:hwservice_manager find; + +# Allow statsd to send dump info to dumpstate +allow statsd dumpstate:fd use; +allow statsd dumpstate:fifo_file { getattr write }; + +# Allow access to with hardware layer and process stats. +allow statsd proc_uid_cputime_showstat:file { getattr open read }; +hal_client_domain(statsd, hal_health) +hal_client_domain(statsd, hal_power) +hal_client_domain(statsd, hal_thermal) + +# Allow 'adb shell cmd' to upload configs and download output. +allow statsd adbd:fd use; +allow statsd adbd:unix_stream_socket { getattr read write }; +allow statsd shell:fifo_file { getattr read }; + +unix_socket_send(bootstat, statsdw, statsd) +unix_socket_send(lmkd, statsdw, statsd) +unix_socket_send(statsd, statsdw, statsd) +unix_socket_send(system_server, statsdw, statsd) + +### +### neverallow rules +### + +# Only statsd and the other root services in limited circumstances. +# can get to the files in /data/misc/stats-data, /data/misc/stats-service. +# Other services are prohibitted from accessing the file. +neverallow { domain -statsd -system_server -init -vold } stats_data_file:file *; + +# Limited access to the directory itself. +neverallow { domain -statsd -system_server -init -vold } stats_data_file:dir *;