# Domain used when running /system/bin/simpleperf to profile a specific app. # Entered either by the app itself exec-ing the binary, or through # simpleperf_app_runner (with shell as its origin). Certain other domains # (runas_app, shell) can also exec this binary without a domain transition. typeattribute simpleperf coredomain; type simpleperf_exec, system_file_type, exec_type, file_type; # Define apps that can be marked debuggable/profileable and be profiled by simpleperf. define(`simpleperf_profileable_apps', `{ ephemeral_app isolated_app platform_app priv_app untrusted_app_all }') domain_auto_trans(simpleperf_profileable_apps, simpleperf_exec, simpleperf) # When running in this domain, simpleperf is scoped to profiling an individual # app. The necessary MAC permissions for profiling are more maintainable and # consistent if simpleperf is marked as an app domain as well (as, for example, # it will then see the same set of system libraries as the app). app_domain(simpleperf) # Allow ptrace attach to the target app, for reading JIT debug info (using # process_vm_readv) during unwinding and symbolization. allow simpleperf simpleperf_profileable_apps:process ptrace; # Allow using perf_event_open syscall for profiling the target app. allow simpleperf self:perf_event { open read write kernel }; # Allow /proc/ access for the target app (for example, when trying to # discover it by cmdline). r_dir_file(simpleperf, simpleperf_profileable_apps) # Allow apps signalling simpleperf domain, which is the domain that the simpleperf # profiler runs as when executed by the app. The signals are used to control # the profiler (which would be profiling the app that is sending the signal). allow simpleperf_profileable_apps simpleperf:process signal; # Suppress denial logspam when simpleperf is trying to find a matching process # by scanning /proc//cmdline files. The /proc/ directories are within # the same domain as their respective processes, most of which this domain is # not allowed to see. dontaudit simpleperf domain:dir search; # Allow simpleperf to read apk files and libraries executed by the app. r_dir_file(simpleperf, privapp_data_file); r_dir_file(simpleperf, app_data_file); allow simpleperf { apk_tmp_file apk_private_tmp_file }:file { getattr read }; allow simpleperf system_linker_exec:file r_file_perms; allow simpleperf app_exec_data_file:file r_file_perms; allow simpleperf asec_public_file:file r_file_perms; r_dir_file(simpleperf, vendor_app_file); # Allow simpleperf to read input files passed from adb shell. allow simpleperf shell_data_file:file r_file_perms; allow simpleperf shell_data_file:dir r_dir_perms; # Allow simpleperf to read ETM perf event type. allow simpleperf sysfs:dir r_dir_perms; r_dir_file(simpleperf, sysfs_devices_cs_etm) # Neverallows: # Profiling must be confined to the scope of an individual app. neverallow simpleperf self:perf_event ~{ open read write kernel }; # Never allow other processes to ptrace simpleperf, as this could leak sensitive infomation from # raw samples. neverallow { domain -crash_dump -llkd } simpleperf:process ptrace;