diff --git a/neverallow_macros b/neverallow_macros
index 3593dd1bbce687e4d3039fb2d14cb887e4b3273d..b36cceb86cb7c6c090d346ef793ed8ffbe53172f 100644
--- a/neverallow_macros
+++ b/neverallow_macros
@@ -1,5 +1,6 @@
 #
 # Common neverallow permissions
 define(`no_w_file_perms', `{ append create link unlink relabelfrom rename setattr write }')
+define(`no_rw_file_perms', `{ no_w_file_perms open read ioctl lock }')
 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/system_server.te b/system_server.te
index ee3aa898b286a37adda013a5c420a882b07dfe0e..66306152e45ff0d3c12d5e2dd3c7d044b2983ace 100644
--- a/system_server.te
+++ b/system_server.te
@@ -492,3 +492,8 @@ neverallow system_server { bluetooth_data_file nfc_data_file shell_data_file app
 # system server to dynamically load a dex file, something we do not
 # want to allow.
 neverallow system_server dex2oat_exec:file no_x_file_perms;
+
+# The only block device system_server should be accessing is
+# the frp_block_device. This helps avoid a system_server to root
+# escalation by writing to raw block devices.
+neverallow system_server { dev_type -frp_block_device }:blk_file no_rw_file_perms;