From bdbfff1b00e543913a72c1fe4e8b10176234af50 Mon Sep 17 00:00:00 2001
From: Chong Zhang <chz@google.com>
Date: Thu, 20 Sep 2018 12:07:44 -0700
Subject: [PATCH] add mediaswcodec service

Set up a new service for sw media codec services.

Bug: 111407413

Test: cts-tradefed run cts-dev --module CtsMediaTestCases --compatibility:module-arg CtsMediaTestCases:include-annotation:android.platform.test.annotations.RequiresDevice
Change-Id: Ia1c6a9ef3f0c1d84b2be8756eb1853ffa0597f8e
---
 private/compat/26.0/26.0.ignore.cil |  3 +++
 private/compat/27.0/27.0.ignore.cil |  3 +++
 private/compat/28.0/28.0.ignore.cil |  3 +++
 private/file_contexts               |  1 +
 private/mediaswcodec.te             |  4 +++
 public/attributes                   |  1 +
 public/domain.te                    |  8 ++++++
 public/hal_omx.te                   | 10 +++-----
 public/mediaswcodec.te              |  9 +++++++
 public/swcodec_service_server.te    | 40 +++++++++++++++++++++++++++++
 vendor/mediacodec.te                |  9 ++++++-
 11 files changed, 83 insertions(+), 8 deletions(-)
 create mode 100644 private/mediaswcodec.te
 create mode 100644 public/mediaswcodec.te
 create mode 100644 public/swcodec_service_server.te

diff --git a/private/compat/26.0/26.0.ignore.cil b/private/compat/26.0/26.0.ignore.cil
index 54edb40b8..3cf086b05 100644
--- a/private/compat/26.0/26.0.ignore.cil
+++ b/private/compat/26.0/26.0.ignore.cil
@@ -104,6 +104,9 @@
     lowpan_device
     lowpan_prop
     lowpan_service
+    mediaswcodec
+    mediaswcodec_exec
+    mediaswcodec_tmpfs
     mediaextractor_update_service
     mediaprovider_tmpfs
     metadata_file
diff --git a/private/compat/27.0/27.0.ignore.cil b/private/compat/27.0/27.0.ignore.cil
index 1df6a0e52..3fccdf32f 100644
--- a/private/compat/27.0/27.0.ignore.cil
+++ b/private/compat/27.0/27.0.ignore.cil
@@ -95,6 +95,9 @@
     lowpan_prop
     lowpan_service
     mediaextractor_update_service
+    mediaswcodec
+    mediaswcodec_exec
+    mediaswcodec_tmpfs
     metadata_file
     mnt_product_file
     mnt_vendor_file
diff --git a/private/compat/28.0/28.0.ignore.cil b/private/compat/28.0/28.0.ignore.cil
index e02421d90..3404dd5e6 100644
--- a/private/compat/28.0/28.0.ignore.cil
+++ b/private/compat/28.0/28.0.ignore.cil
@@ -36,6 +36,9 @@
     iorapd_data_file
     iorapd_service
     iorapd_tmpfs
+    mediaswcodec
+    mediaswcodec_exec
+    mediaswcodec_tmpfs
     mnt_product_file
     overlayfs_file
     recovery_socket
diff --git a/private/file_contexts b/private/file_contexts
index 3b852136f..a70f61bcb 100644
--- a/private/file_contexts
+++ b/private/file_contexts
@@ -229,6 +229,7 @@
 /system/bin/mediametrics	u:object_r:mediametrics_exec:s0
 /system/bin/cameraserver	u:object_r:cameraserver_exec:s0
 /system/bin/mediaextractor	u:object_r:mediaextractor_exec:s0
+/system/bin/mediaswcodec	u:object_r:mediaswcodec_exec:s0
 /system/bin/mdnsd	u:object_r:mdnsd_exec:s0
 /system/bin/installd	u:object_r:installd_exec:s0
 /system/bin/otapreopt_chroot   u:object_r:otapreopt_chroot_exec:s0
diff --git a/private/mediaswcodec.te b/private/mediaswcodec.te
new file mode 100644
index 000000000..50f569875
--- /dev/null
+++ b/private/mediaswcodec.te
@@ -0,0 +1,4 @@
+typeattribute mediaswcodec coredomain;
+
+init_daemon_domain(mediaswcodec)
+
diff --git a/public/attributes b/public/attributes
index 79cc20d09..f56919a8b 100644
--- a/public/attributes
+++ b/public/attributes
@@ -302,3 +302,4 @@ hal_attribute(wifi_supplicant);
 
 attribute display_service_server;
 attribute wifi_keystore_service_server;
+attribute mediaswcodec_server;
diff --git a/public/domain.te b/public/domain.te
index 244e08948..0f17fab13 100644
--- a/public/domain.te
+++ b/public/domain.te
@@ -1197,6 +1197,7 @@ neverallow {
 
   # Processes that can't exec crash_dump
   -hal_omx_server
+  -mediaswcodec_server
   -mediaextractor
 } tombstoned_crash_socket:unix_stream_socket connectto;
 
@@ -1551,3 +1552,10 @@ full_treble_only(`
     -incidentd
   } sysfs_batteryinfo:file { open read };
 ')
+
+neverallow {
+  domain
+  -mediaswcodec_server
+  -hal_omx_server
+} hal_codec2_hwservice:hwservice_manager add;
+
diff --git a/public/hal_omx.te b/public/hal_omx.te
index a477875b2..656b03ac8 100644
--- a/public/hal_omx.te
+++ b/public/hal_omx.te
@@ -2,18 +2,12 @@
 # since OMX must always be in its own process.
 
 
-# can route /dev/binder traffic to /dev/vndbinder
-vndbinder_use(hal_omx_server)
-
 binder_call(hal_omx_server, binderservicedomain)
 binder_call(hal_omx_server, { appdomain -isolated_app })
 
 # Allow hal_omx_server access to composer sync fences
 allow hal_omx_server hal_graphics_composer:fd use;
 
-allow hal_omx_server gpu_device:chr_file rw_file_perms;
-allow hal_omx_server video_device:chr_file rw_file_perms;
-allow hal_omx_server video_device:dir search;
 allow hal_omx_server ion_device:chr_file rw_file_perms;
 allow hal_omx_server hal_camera:fd use;
 
@@ -26,7 +20,9 @@ crash_dump_fallback(hal_omx_server)
 allow hal_omx_server bufferhubd:fd use;
 
 hal_attribute_hwservice(hal_omx, hal_omx_hwservice)
-hal_attribute_hwservice(hal_omx, hal_codec2_hwservice)
+
+allow hal_omx_client hal_codec2_hwservice:hwservice_manager find;
+allow hal_omx_server hal_codec2_hwservice:hwservice_manager { add find };
 
 allow hal_omx_client hidl_token_hwservice:hwservice_manager find;
 
diff --git a/public/mediaswcodec.te b/public/mediaswcodec.te
new file mode 100644
index 000000000..1b1097be9
--- /dev/null
+++ b/public/mediaswcodec.te
@@ -0,0 +1,9 @@
+type mediaswcodec, domain;
+type mediaswcodec_exec, system_file_type, exec_type, file_type;
+
+typeattribute mediaswcodec halserverdomain;
+typeattribute mediaswcodec mediaswcodec_server;
+
+hal_client_domain(mediaswcodec, hal_allocator)
+hal_client_domain(mediaswcodec, hal_graphics_allocator)
+
diff --git a/public/swcodec_service_server.te b/public/swcodec_service_server.te
new file mode 100644
index 000000000..f20d9904c
--- /dev/null
+++ b/public/swcodec_service_server.te
@@ -0,0 +1,40 @@
+# Add hal_codec2_hwservice to mediaswcodec_server
+allow mediaswcodec_server hal_codec2_hwservice:hwservice_manager { add find };
+allow mediaswcodec_server hidl_base_hwservice:hwservice_manager add;
+
+# Allow mediaswcodec_server access to composer sync fences
+allow mediaswcodec_server hal_graphics_composer:fd use;
+
+allow mediaswcodec_server ion_device:chr_file r_file_perms;
+allow mediaswcodec_server hal_camera:fd use;
+
+crash_dump_fallback(mediaswcodec_server)
+
+# Recieve gralloc buffer FDs from bufferhubd. Note that mediaswcodec_server never
+# directly connects to bufferhubd via PDX. Instead, a VR app acts as a bridge
+# between those two: it talks to hal_omx_server via Binder and talks to bufferhubd
+# via PDX. Thus, there is no need to use pdx_client macro.
+allow mediaswcodec_server bufferhubd:fd use;
+
+binder_call(mediaswcodec_server, hal_omx_client)
+binder_call(hal_omx_client, mediaswcodec_server)
+
+###
+### neverallow rules
+###
+
+# mediaswcodec_server should never execute any executable without a
+# domain transition
+neverallow mediaswcodec_server { file_type fs_type }:file execute_no_trans;
+
+# The goal of the mediaserver/codec split is to place media processing code into
+# restrictive sandboxes with limited responsibilities and thus limited
+# permissions. Example: Audioserver is only responsible for controlling audio
+# hardware and processing audio content. Cameraserver does the same for camera
+# hardware/content. Etc.
+#
+# Media processing code is inherently risky and thus should have limited
+# permissions and be isolated from the rest of the system and network.
+# Lengthier explanation here:
+# https://android-developers.googleblog.com/2016/05/hardening-media-stack.html
+neverallow mediaswcodec_server domain:{ tcp_socket udp_socket rawip_socket } *;
diff --git a/vendor/mediacodec.te b/vendor/mediacodec.te
index a235145cc..29e1a9015 100644
--- a/vendor/mediacodec.te
+++ b/vendor/mediacodec.te
@@ -12,8 +12,15 @@ not_full_treble(`
     allow mediacodec surfaceflinger_service:service_manager find;
 ')
 
+# can route /dev/binder traffic to /dev/vndbinder
+vndbinder_use(mediacodec)
+
 hal_server_domain(mediacodec, hal_omx)
 
 hal_client_domain(mediacodec, hal_allocator)
-hal_client_domain(mediacodec, hal_cas)
 hal_client_domain(mediacodec, hal_graphics_allocator)
+
+allow mediacodec gpu_device:chr_file rw_file_perms;
+allow mediacodec video_device:chr_file rw_file_perms;
+allow mediacodec video_device:dir search;
+
-- 
GitLab