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 # to Android dropbox. allow statsd perfetto_exec:file rx_file_perms; domain_auto_trans(statsd, perfetto_exec, perfetto) # Grant statsd with permissions to register the services. allow statsd { app_api_service incident_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 *;