From b03831fe58be86cfd94c31b91def6ae53ebd614f Mon Sep 17 00:00:00 2001 From: Marco Nelissen <marcone@google.com> Date: Wed, 9 Sep 2015 10:48:04 -0700 Subject: [PATCH] Add rules for running audio services in audioserver audioserver has the same rules as mediaserver so there is no loss of rights or permissions. media.log moves to audioserver. TBD: Pare down permissions. Bug: 24511453 Change-Id: I0fff24c14b712bb3d498f75e8fd66c2eb795171d --- audioserver.te | 119 ++++++++++++++++++++++++++++++++++++++++++++++ bluetooth.te | 1 + debuggerd.te | 2 +- dumpstate.te | 4 +- file_contexts | 1 + mediaserver.te | 1 + nfc.te | 1 + platform_app.te | 1 + priv_app.te | 1 + radio.te | 1 + service.te | 1 + service_contexts | 10 ++-- surfaceflinger.te | 1 + system_server.te | 7 ++- untrusted_app.te | 2 +- 15 files changed, 143 insertions(+), 10 deletions(-) create mode 100644 audioserver.te diff --git a/audioserver.te b/audioserver.te new file mode 100644 index 000000000..28da2939b --- /dev/null +++ b/audioserver.te @@ -0,0 +1,119 @@ +# audioserver - audio services daemon +type audioserver, domain, domain_deprecated; +type audioserver_exec, exec_type, file_type; + +typeattribute audioserver mlstrustedsubject; + +net_domain(audioserver) +init_daemon_domain(audioserver) + +r_dir_file(audioserver, sdcard_type) + +binder_use(audioserver) +binder_call(audioserver, binderservicedomain) +binder_call(audioserver, { appdomain autoplay_app }) +binder_service(audioserver) + +# Required by Widevine DRM (b/22990512) +allow audioserver self:process execmem; + +allow audioserver kernel:system module_request; +allow audioserver media_data_file:dir create_dir_perms; +allow audioserver media_data_file:file create_file_perms; +allow audioserver app_data_file:dir search; +allow audioserver app_data_file:file rw_file_perms; +allow audioserver sdcard_type:file write; +allow audioserver gpu_device:chr_file rw_file_perms; +allow audioserver video_device:dir r_dir_perms; +allow audioserver video_device:chr_file rw_file_perms; +allow audioserver audio_device:dir r_dir_perms; +allow audioserver tee_device:chr_file rw_file_perms; + +set_prop(audioserver, audio_prop) + +# Access audio devices at all. +allow audioserver audio_device:chr_file rw_file_perms; + +# XXX Label with a specific type? +allow audioserver sysfs:file r_file_perms; + +# Read resources from open apk files passed over Binder. +allow audioserver apk_data_file:file { read getattr }; +allow audioserver asec_apk_file:file { read getattr }; + +# Read /data/data/com.android.providers.telephony files passed over Binder. +allow audioserver radio_data_file:file { read getattr }; + +# Use pipes passed over Binder from app domains. +allow audioserver { appdomain autoplay_app }:fifo_file { getattr read write }; + +# Access camera device. +allow audioserver camera_device:chr_file rw_file_perms; +allow audioserver rpmsg_device:chr_file rw_file_perms; + +# Inter System processes communicate over named pipe (FIFO) +allow audioserver system_server:fifo_file r_file_perms; + +# Camera data +r_dir_file(audioserver, camera_data_file) +r_dir_file(audioserver, media_rw_data_file) + +# Grant access to audio files to audioserver +allow audioserver audio_data_file:dir ra_dir_perms; +allow audioserver audio_data_file:file create_file_perms; + +# Read/[write] to /proc/net/xt_qtaguid/ctrl and /dev/xt_qtaguid +allow audioserver qtaguid_proc:file rw_file_perms; +allow audioserver qtaguid_device:chr_file r_file_perms; + +# Allow abstract socket connection +allow audioserver rild:unix_stream_socket { connectto read write setopt }; + +# Needed on some devices for playing DRM protected content, +# but seems expected and appropriate for all devices. +unix_socket_connect(audioserver, drmserver, drmserver) + +# Needed on some devices for playing audio on paired BT device, +# but seems appropriate for all devices. +unix_socket_connect(audioserver, bluetooth, bluetooth) + +# Connect to tee service. +allow audioserver tee:unix_stream_socket connectto; + +allow audioserver activity_service:service_manager find; +allow audioserver appops_service:service_manager find; +allow audioserver audioserver_service:service_manager { add find }; +allow audioserver cameraproxy_service:service_manager find; +allow audioserver batterystats_service:service_manager find; +allow audioserver drmserver_service:service_manager find; +allow audioserver mediaextractor_service:service_manager find; +allow audioserver mediaserver_service:service_manager find; +allow audioserver permission_service:service_manager find; +allow audioserver power_service:service_manager find; +allow audioserver processinfo_service:service_manager find; +allow audioserver scheduling_policy_service:service_manager find; +allow audioserver surfaceflinger_service:service_manager find; + +# /oem access +allow audioserver oemfs:dir search; +allow audioserver oemfs:file r_file_perms; + +use_drmservice(audioserver) +allow audioserver drmserver:drmservice { + consumeRights + setPlaybackStatus + openDecryptSession + closeDecryptSession + initializeDecryptUnit + decrypt + finalizeDecryptUnit + pread +}; + +### +### neverallow rules +### + +# audioserver should never execute any executable without a +# domain transition +neverallow audioserver { file_type fs_type }:file execute_no_trans; diff --git a/bluetooth.te b/bluetooth.te index c4b9ba201..955e82b84 100644 --- a/bluetooth.te +++ b/bluetooth.te @@ -38,6 +38,7 @@ set_prop(bluetooth, bluetooth_prop) set_prop(bluetooth, pan_result_prop) set_prop(bluetooth, ctl_dhcp_pan_prop) +allow bluetooth audioserver_service:service_manager find; allow bluetooth bluetooth_service:service_manager find; allow bluetooth drmserver_service:service_manager find; allow bluetooth mediaserver_service:service_manager find; diff --git a/debuggerd.te b/debuggerd.te index 0e3cf6805..95fff1b22 100644 --- a/debuggerd.te +++ b/debuggerd.te @@ -25,7 +25,7 @@ allow debuggerd system_data_file:file open; # Allow debuggerd to redirect a dump_backtrace request to itself. # This only happens on 64 bit systems, where all requests go to the 64 bit # debuggerd and get redirected to the 32 bit debuggerd if the process is 32 bit. -allow debuggerd { drmserver mediaserver sdcardd surfaceflinger inputflinger }:debuggerd dump_backtrace; +allow debuggerd { audioserver drmserver mediaserver sdcardd surfaceflinger inputflinger }:debuggerd dump_backtrace; # Connect to system_server via /data/system/ndebugsocket. unix_socket_connect(debuggerd, system_ndebug, system_server) diff --git a/dumpstate.te b/dumpstate.te index cc38b1d25..14bbbe185 100644 --- a/dumpstate.te +++ b/dumpstate.te @@ -48,9 +48,9 @@ allow dumpstate { appdomain autoplay_app system_server }:process signal; # Signal native processes to dump their stack. # This list comes from native_processes_to_dump in dumpstate/utils.c -allow dumpstate { drmserver mediaserver mediaextractor sdcardd surfaceflinger }:process signal; +allow dumpstate { audioserver drmserver mediaserver mediaextractor sdcardd surfaceflinger }:process signal; # Ask debuggerd for the backtraces of these processes. -allow dumpstate { drmserver mediaserver mediaextractor sdcardd surfaceflinger }:debuggerd dump_backtrace; +allow dumpstate { audioserver drmserver mediaserver mediaextractor sdcardd surfaceflinger }:debuggerd dump_backtrace; # Execute and transition to the vdc domain domain_auto_trans(dumpstate, vdc_exec, vdc) diff --git a/file_contexts b/file_contexts index 5d6082238..0aca0d0ce 100644 --- a/file_contexts +++ b/file_contexts @@ -163,6 +163,7 @@ /system/bin/vold u:object_r:vold_exec:s0 /system/bin/netd u:object_r:netd_exec:s0 /system/bin/rild u:object_r:rild_exec:s0 +/system/bin/audioserver u:object_r:audioserver_exec:s0 /system/bin/mediaserver u:object_r:mediaserver_exec:s0 /system/bin/mediaextractor u:object_r:mediaextractor_exec:s0 /system/bin/mdnsd u:object_r:mdnsd_exec:s0 diff --git a/mediaserver.te b/mediaserver.te index d924b021d..c23cda1de 100644 --- a/mediaserver.te +++ b/mediaserver.te @@ -82,6 +82,7 @@ allow mediaserver tee:unix_stream_socket connectto; allow mediaserver activity_service:service_manager find; allow mediaserver appops_service:service_manager find; +allow mediaserver audioserver_service:service_manager find; allow mediaserver cameraproxy_service:service_manager find; allow mediaserver batterystats_service:service_manager find; allow mediaserver drmserver_service:service_manager find; diff --git a/nfc.te b/nfc.te index e648863ec..e02c119d3 100644 --- a/nfc.te +++ b/nfc.te @@ -17,6 +17,7 @@ allow nfc nfc_data_file:notdevfile_class_set create_file_perms; allow nfc sysfs_nfc_power_writable:file rw_file_perms; allow nfc sysfs:file write; +allow nfc audioserver_service:service_manager find; allow nfc drmserver_service:service_manager find; allow nfc mediaserver_service:service_manager find; allow nfc mediaextractor_service:service_manager find; diff --git a/platform_app.te b/platform_app.te index ed28c7694..16ed2cab2 100644 --- a/platform_app.te +++ b/platform_app.te @@ -34,6 +34,7 @@ allow platform_app mnt_media_rw_file:dir r_dir_perms; allow platform_app vfat:dir create_dir_perms; allow platform_app vfat:file create_file_perms; +allow platform_app audioserver_service:service_manager find; allow platform_app drmserver_service:service_manager find; allow platform_app mediaserver_service:service_manager find; allow platform_app mediaextractor_service:service_manager find; diff --git a/priv_app.te b/priv_app.te index c734f58e9..5ad563e4d 100644 --- a/priv_app.te +++ b/priv_app.te @@ -19,6 +19,7 @@ allow priv_app mtp_device:chr_file rw_file_perms; # Used by: https://play.privileged.com/store/apps/details?id=jackpal.androidterm create_pty(priv_app) +allow priv_app audioserver_service:service_manager find; allow priv_app drmserver_service:service_manager find; allow priv_app mediaserver_service:service_manager find; allow priv_app mediaextractor_service:service_manager find; diff --git a/radio.te b/radio.te index 448fdb5be..0da43a6d2 100644 --- a/radio.te +++ b/radio.te @@ -27,6 +27,7 @@ auditallow radio system_radio_prop:property_service set; # ctl interface set_prop(radio, ctl_rildaemon_prop) +allow radio audioserver_service:service_manager find; allow radio drmserver_service:service_manager find; allow radio mediaserver_service:service_manager find; allow radio radio_service:service_manager { add find }; diff --git a/service.te b/service.te index 15cf349a6..e770fd87a 100644 --- a/service.te +++ b/service.te @@ -1,3 +1,4 @@ +type audioserver_service, service_manager_type; type bluetooth_service, service_manager_type; type default_android_service, service_manager_type; type drmserver_service, service_manager_type; diff --git a/service_contexts b/service_contexts index f6c458d5f..70c52b100 100644 --- a/service_contexts +++ b/service_contexts @@ -60,16 +60,16 @@ jobscheduler u:object_r:jobscheduler_service:s0 launcherapps u:object_r:launcherapps_service:s0 location u:object_r:location_service:s0 lock_settings u:object_r:lock_settings_service:s0 -media.audio_flinger u:object_r:mediaserver_service:s0 -media.audio_policy u:object_r:mediaserver_service:s0 +media.audio_flinger u:object_r:audioserver_service:s0 +media.audio_policy u:object_r:audioserver_service:s0 media.camera u:object_r:mediaserver_service:s0 media.camera.proxy u:object_r:cameraproxy_service:s0 -media.log u:object_r:mediaserver_service:s0 +media.log u:object_r:audioserver_service:s0 media.player u:object_r:mediaserver_service:s0 media.extractor u:object_r:mediaextractor_service:s0 media.resource_manager u:object_r:mediaserver_service:s0 -media.radio u:object_r:mediaserver_service:s0 -media.sound_trigger_hw u:object_r:mediaserver_service:s0 +media.radio u:object_r:audioserver_service:s0 +media.sound_trigger_hw u:object_r:audioserver_service:s0 media_projection u:object_r:media_projection_service:s0 media_router u:object_r:media_router_service:s0 media_session u:object_r:media_session_service:s0 diff --git a/surfaceflinger.te b/surfaceflinger.te index 7a30a4776..b0b03579d 100644 --- a/surfaceflinger.te +++ b/surfaceflinger.te @@ -56,6 +56,7 @@ allow surfaceflinger tee_device:chr_file rw_file_perms; # media.player service +allow surfaceflinger audioserver_service:service_manager find; allow surfaceflinger mediaserver_service:service_manager find; allow surfaceflinger permission_service:service_manager find; allow surfaceflinger power_service:service_manager find; diff --git a/system_server.te b/system_server.te index f6a89afcb..e75e11929 100644 --- a/system_server.te +++ b/system_server.te @@ -77,6 +77,7 @@ allow system_server { appdomain autoplay_app }:process { sigkill signal }; # Set scheduling info for apps. allow system_server { appdomain autoplay_app }:process { getsched setsched }; +allow system_server audioserver:process { getsched setsched }; allow system_server mediaserver:process { getsched setsched }; # Read /proc/pid data for all domains. This is used by ProcessCpuTracker @@ -137,9 +138,10 @@ binder_call(system_server, dumpstate) binder_service(system_server) # Ask debuggerd to dump backtraces for native stacks of interest. -allow system_server { mediaserver mediaextractor sdcardd surfaceflinger inputflinger }:debuggerd dump_backtrace; +allow system_server { audioserver mediaserver mediaextractor sdcardd surfaceflinger inputflinger }:debuggerd dump_backtrace; # Read /proc/pid files for dumping stack traces of native processes. +r_dir_file(system_server, audioserver) r_dir_file(system_server, mediaserver) r_dir_file(system_server, mediaextractor) r_dir_file(system_server, sdcardd) @@ -147,6 +149,8 @@ r_dir_file(system_server, surfaceflinger) r_dir_file(system_server, inputflinger) # Use sockets received over binder from various services. +allow system_server audioserver:tcp_socket rw_socket_perms; +allow system_server audioserver:udp_socket rw_socket_perms; allow system_server mediaserver:tcp_socket rw_socket_perms; allow system_server mediaserver:udp_socket rw_socket_perms; @@ -370,6 +374,7 @@ allow system_server sysfs_lowmemorykiller:file { getattr w_file_perms }; allow system_server pstorefs:dir r_dir_perms; allow system_server pstorefs:file r_file_perms; +allow system_server audioserver_service:service_manager find; allow system_server drmserver_service:service_manager find; allow system_server healthd_service:service_manager find; allow system_server keystore_service:service_manager find; diff --git a/untrusted_app.te b/untrusted_app.te index 0af8642f7..59d8edb13 100644 --- a/untrusted_app.te +++ b/untrusted_app.te @@ -77,11 +77,11 @@ allow untrusted_app mnt_media_rw_file:dir search; # allow cts to query all services allow untrusted_app servicemanager:service_manager list; +allow untrusted_app audioserver_service:service_manager find; allow untrusted_app drmserver_service:service_manager find; allow untrusted_app healthd_service:service_manager find; allow untrusted_app mediaserver_service:service_manager find; allow untrusted_app mediaextractor_service:service_manager find; -allow untrusted_app mediaextractor_service:service_manager find; allow untrusted_app nfc_service:service_manager find; allow untrusted_app radio_service:service_manager find; allow untrusted_app surfaceflinger_service:service_manager find; -- GitLab