From a17a266e7e466d281f0730449c492de46390fc76 Mon Sep 17 00:00:00 2001
From: Nick Kralevich <nnk@google.com>
Date: Wed, 5 Nov 2014 15:30:41 -0800
Subject: [PATCH] recovery.te: add /data neverallow rules

Recovery should never be accessing files from /data.
In particular, /data may be encrypted, and the files within
/data will be inaccessible to recovery, because recovery doesn't
know the decryption key.

Enforce write/execute restrictions on recovery. We can't tighten
it up further because domain.te contains some /data read-only
access rules, which shouldn't apply to recovery but do.

Create neverallow_macros, used for storing permission macros
useful for neverallow rules. Standardize recovery.te and
property_data_file on the new macros.

Change-Id: I02346ab924fe2fdb2edc7659cb68c4f8dffa1e88
---
 Android.mk        |  1 +
 domain.te         |  4 ++--
 neverallow_macros |  5 +++++
 recovery.te       | 17 +++++++++++++++++
 4 files changed, 25 insertions(+), 2 deletions(-)
 create mode 100644 neverallow_macros

diff --git a/Android.mk b/Android.mk
index 351e81a19..eae860b22 100644
--- a/Android.mk
+++ b/Android.mk
@@ -83,6 +83,7 @@ sepolicy_build_files := security_classes \
                         initial_sids \
                         access_vectors \
                         global_macros \
+                        neverallow_macros \
                         mls_macros \
                         mls \
                         policy_capabilities \
diff --git a/domain.te b/domain.te
index 5ed79c1ea..48e2d1ac3 100644
--- a/domain.te
+++ b/domain.te
@@ -291,8 +291,8 @@ neverallow {
 } { fs_type -rootfs }:file execute;
 
 # Only the init property service should write to /data/property.
-neverallow { domain -init } property_data_file:dir { create setattr relabelfrom rename write add_name remove_name rmdir };
-neverallow { domain -init } property_data_file:file { create setattr relabelfrom write append unlink link rename };
+neverallow { domain -init } property_data_file:dir no_w_dir_perms;
+neverallow { domain -init } property_data_file:file no_w_file_perms;
 
 # Only recovery should be doing writes to /system
 neverallow { domain -recovery } { system_file exec_type }:dir_file_class_set
diff --git a/neverallow_macros b/neverallow_macros
new file mode 100644
index 000000000..3593dd1bb
--- /dev/null
+++ b/neverallow_macros
@@ -0,0 +1,5 @@
+#
+# Common neverallow permissions
+define(`no_w_file_perms', `{ append create link unlink relabelfrom rename setattr write }')
+define(`no_x_file_perms', `{ execute execute_no_trans }')
+define(`no_w_dir_perms',  `{ add_name create link relabelfrom remove_name rename reparent rmdir setattr write }')
diff --git a/recovery.te b/recovery.te
index 204c096a3..61c42b138 100644
--- a/recovery.te
+++ b/recovery.te
@@ -98,3 +98,20 @@ recovery_only(`
   # set scheduling parameters for a kernel domain task.
   allow recovery kernel:process setsched;
 ')
+
+###
+### neverallow rules
+###
+
+# Recovery should never touch /data.
+#
+# In particular, if /data is encrypted, it is not accessible
+# to recovery anyway.
+#
+# For now, we only enforce write/execute restrictions, as domain.te
+# contains a number of read-only rules that apply to all
+# domains, including recovery.
+#
+# TODO: tighten this up further.
+neverallow recovery data_file_type:file { no_w_file_perms no_x_file_perms };
+neverallow recovery data_file_type:dir no_w_dir_perms;
-- 
GitLab