diff --git a/domain.te b/domain.te
index 7cc7f133cee9e3b651aef896c3e6965f49f43d23..13ce01604a31d16d10538d5ed313c1f64dba5843 100644
--- a/domain.te
+++ b/domain.te
@@ -154,7 +154,17 @@ neverallow { domain -relabeltodomain } *:dir_file_class_set relabelto;
 ### neverallow rules
 ###
 
+# Limit ability to ptrace or read sensitive /proc/pid files of processes
+# with other UIDs to these whitelisted domains.
+neverallow { domain -debuggerd -vold -dumpstate -system_server } self:capability sys_ptrace;
+
+# Limit device node creation and raw I/O to these whitelisted domains.
+neverallow { domain -kernel -init -recovery -ueventd -watchdogd -healthd -vold } self:capability { sys_rawio mknod };
+
+# No domain needs mac_override as it is unused by SELinux.
 neverallow domain self:capability2 mac_override;
+
+# Only recovery needs mac_admin to set contexts not defined in current policy.
 neverallow { domain -recovery } self:capability2 mac_admin;
 
 # Only init should be able to load SELinux policies.
diff --git a/init.te b/init.te
index 84fbf5a0fd3cfe4f489f29f97fee64c81a21f942..efce6e7d8b18cbeaebf077b449d48cca986aba5f 100644
--- a/init.te
+++ b/init.te
@@ -7,6 +7,8 @@ relabelto_domain(init)
 # add a rule to handle unlabelled mounts
 allow init unlabeled:filesystem mount;
 
+allow init self:capability { sys_rawio mknod };
+
 allow init fs_type:filesystem *;
 allow init {fs_type dev_type file_type}:dir_file_class_set relabelto;
 allow init kernel:security load_policy;
diff --git a/kernel.te b/kernel.te
index 106d48ec7b875ee78f9a39651a9418b5d9334504..af107910f430cd17f3d3efdf12d83044ff44df0b 100644
--- a/kernel.te
+++ b/kernel.te
@@ -16,3 +16,8 @@ allow kernel self:security setenforce;
 
 # Set checkreqprot by init.rc prior to switching to init domain.
 allow kernel self:security setcheckreqprot;
+
+# For operations performed by kernel or init prior to switching to init domain.
+## TODO: Investigate whether it is safe to remove these
+allow kernel self:capability { sys_rawio mknod };
+auditallow kernel self:capability { sys_rawio mknod };
diff --git a/recovery.te b/recovery.te
index 37d645593caff66aeff9fec738049e8f9d1fe7d9..ea444c4bb5aab5a40fb8c4cfc70de4cbf416bea1 100644
--- a/recovery.te
+++ b/recovery.te
@@ -13,3 +13,7 @@ allow recovery fs_type:filesystem *;
 allow recovery self:process execmem;
 allow recovery ashmem_device:chr_file execute;
 allow recovery tmpfs:file rx_file_perms;
+
+## TODO: Investigate whether it is safe to remove these
+allow recovery self:capability { sys_rawio mknod };
+auditallow recovery self:capability { sys_rawio mknod };
diff --git a/unconfined.te b/unconfined.te
index ac0de840f006f56f475f27a9d675db38931bb571..8415ada78ef4a525541d838cdef8025f87c6f227 100644
--- a/unconfined.te
+++ b/unconfined.te
@@ -16,7 +16,7 @@
 # The use of this template is discouraged.
 ######################################################
 
-allow unconfineddomain self:capability *;
+allow unconfineddomain self:capability ~{ sys_ptrace sys_rawio mknod sys_module };
 allow unconfineddomain self:capability2 ~{ mac_override mac_admin };
 allow unconfineddomain kernel:security ~{ load_policy setenforce setcheckreqprot };
 allow unconfineddomain kernel:system *;