Skip to content
Snippets Groups Projects
Commit 41daa7f8 authored by Alex Vakulenko's avatar Alex Vakulenko
Browse files

SELinux policies for PDX services

Specify per-service rules for PDX transport. Now being able to
grant permissions to individual services provided by processes,
not all services of a process.

Also tighter control over which permissions are required for
client and server for individual components of IPC (endpoints,
channels, etc).

Bug: 37646189
Change-Id: I78eb8ae8b6e08105666445a66bfcbd2f1d69d0ea
parent e1074f8b
No related branches found
No related tags found
No related merge requests found
...@@ -297,11 +297,14 @@ allow appdomain proc_meminfo:file r_file_perms; ...@@ -297,11 +297,14 @@ allow appdomain proc_meminfo:file r_file_perms;
# For app fuse. # For app fuse.
allow appdomain app_fuse_file:file { getattr read append write }; allow appdomain app_fuse_file:file { getattr read append write };
use_pdx({ appdomain -isolated_app -ephemeral_app }, surfaceflinger) pdx_client({ appdomain -isolated_app -ephemeral_app }, display_client)
use_pdx({ appdomain -isolated_app -ephemeral_app }, sensord) pdx_client({ appdomain -isolated_app -ephemeral_app }, display_manager)
use_pdx({ appdomain -isolated_app -ephemeral_app }, performanced) pdx_client({ appdomain -isolated_app -ephemeral_app }, display_vsync)
# TODO: apps do not directly open the IPC socket for bufferhubd. pdx_client({ appdomain -isolated_app -ephemeral_app }, sensors_client)
use_pdx({ appdomain -isolated_app -ephemeral_app }, bufferhubd) pdx_client({ appdomain -isolated_app -ephemeral_app }, pose_client)
pdx_client({ appdomain -isolated_app -ephemeral_app }, performance_client)
# Apps do not directly open the IPC socket for bufferhubd.
pdx_use({ appdomain -isolated_app -ephemeral_app }, bufferhub_client)
### ###
### CTS-specific rules ### CTS-specific rules
......
...@@ -130,7 +130,19 @@ ...@@ -130,7 +130,19 @@
/dev/socket/mdnsd u:object_r:mdnsd_socket:s0 /dev/socket/mdnsd u:object_r:mdnsd_socket:s0
/dev/socket/mtpd u:object_r:mtpd_socket:s0 /dev/socket/mtpd u:object_r:mtpd_socket:s0
/dev/socket/netd u:object_r:netd_socket:s0 /dev/socket/netd u:object_r:netd_socket:s0
/dev/socket/pdx(/.*)? u:object_r:pdx_socket:s0 /dev/socket/pdx/system/buffer_hub u:object_r:pdx_bufferhub_dir:s0
/dev/socket/pdx/system/buffer_hub/client u:object_r:pdx_bufferhub_client_endpoint_socket:s0
/dev/socket/pdx/system/performance u:object_r:pdx_performance_dir:s0
/dev/socket/pdx/system/performance/client u:object_r:pdx_performance_client_endpoint_socket:s0
/dev/socket/pdx/system/vr/sensors u:object_r:pdx_sensors_dir:s0
/dev/socket/pdx/system/vr/sensors/client u:object_r:pdx_sensors_client_endpoint_socket:s0
/dev/socket/pdx/system/vr/pose u:object_r:pdx_pose_dir:s0
/dev/socket/pdx/system/vr/pose/client u:object_r:pdx_pose_client_endpoint_socket:s0
/dev/socket/pdx/system/vr/display u:object_r:pdx_display_dir:s0
/dev/socket/pdx/system/vr/display/client u:object_r:pdx_display_client_endpoint_socket:s0
/dev/socket/pdx/system/vr/display/manager u:object_r:pdx_display_manager_endpoint_socket:s0
/dev/socket/pdx/system/vr/display/screenshot u:object_r:pdx_display_screenshot_endpoint_socket:s0
/dev/socket/pdx/system/vr/display/vsync u:object_r:pdx_display_vsync_endpoint_socket:s0
/dev/socket/property_service u:object_r:property_socket:s0 /dev/socket/property_service u:object_r:property_socket:s0
/dev/socket/racoon u:object_r:racoon_socket:s0 /dev/socket/racoon u:object_r:racoon_socket:s0
/dev/socket/rild u:object_r:rild_socket:s0 /dev/socket/rild u:object_r:rild_socket:s0
......
...@@ -91,11 +91,15 @@ allow surfaceflinger system_server:fd use; ...@@ -91,11 +91,15 @@ allow surfaceflinger system_server:fd use;
allow surfaceflinger ion_device:chr_file r_file_perms; allow surfaceflinger ion_device:chr_file r_file_perms;
# pdx IPC # pdx IPC
pdx_server(surfaceflinger) pdx_server(surfaceflinger, display_client)
pdx_server(surfaceflinger, display_manager)
use_pdx(surfaceflinger, bufferhubd) pdx_server(surfaceflinger, display_screenshot)
use_pdx(surfaceflinger, performanced) pdx_server(surfaceflinger, display_vsync)
use_pdx(surfaceflinger, sensord)
pdx_client(surfaceflinger, bufferhub_client)
pdx_client(surfaceflinger, performance_client)
pdx_client(surfaceflinger, sensors_client)
pdx_client(surfaceflinger, pose_client)
### ###
### Neverallow rules ### Neverallow rules
......
...@@ -154,6 +154,20 @@ attribute socket_between_core_and_vendor_violators; ...@@ -154,6 +154,20 @@ attribute socket_between_core_and_vendor_violators;
# TODO(b/36463595) # TODO(b/36463595)
attribute vendor_executes_system_violators; attribute vendor_executes_system_violators;
# PDX services
attribute pdx_endpoint_dir_type;
attribute pdx_endpoint_socket_type;
attribute pdx_channel_socket_type;
pdx_service_attributes(display_client)
pdx_service_attributes(display_manager)
pdx_service_attributes(display_screenshot)
pdx_service_attributes(display_vsync)
pdx_service_attributes(performance_client)
pdx_service_attributes(sensors_client)
pdx_service_attributes(pose_client);
pdx_service_attributes(bufferhub_client)
# All HAL servers # All HAL servers
attribute halserverdomain; attribute halserverdomain;
# All HAL clients # All HAL clients
......
...@@ -4,8 +4,8 @@ type bufferhubd_exec, exec_type, file_type; ...@@ -4,8 +4,8 @@ type bufferhubd_exec, exec_type, file_type;
hal_client_domain(bufferhubd, hal_graphics_allocator) hal_client_domain(bufferhubd, hal_graphics_allocator)
pdx_server(bufferhubd) pdx_server(bufferhubd, bufferhub_client)
use_pdx(bufferhubd, performanced) pdx_client(bufferhubd, performance_client)
# Access the GPU. # Access the GPU.
allow bufferhubd gpu_device:chr_file rw_file_perms; allow bufferhubd gpu_device:chr_file rw_file_perms;
...@@ -16,5 +16,5 @@ allow bufferhubd ion_device:chr_file r_file_perms; ...@@ -16,5 +16,5 @@ allow bufferhubd ion_device:chr_file r_file_perms;
# Receive sync fence FDs from mediacodec. Note that mediacodec never directly # Receive sync fence FDs from mediacodec. Note that mediacodec never directly
# connects to bufferhubd via PDX. Instead, a VR app acts as a bridge between # connects to bufferhubd via PDX. Instead, a VR app acts as a bridge between
# those two: it talks to mediacodec via Binder and talks to bufferhubd via PDX. # those two: it talks to mediacodec via Binder and talks to bufferhubd via PDX.
# Thus, there is no need to use use_pdx macro. # Thus, there is no need to use pdx_client macro.
allow bufferhubd mediacodec:fd use; allow bufferhubd mediacodec:fd use;
...@@ -640,7 +640,8 @@ full_treble_only(` ...@@ -640,7 +640,8 @@ full_treble_only(`
unlabeled # used only by core domains unlabeled # used only by core domains
core_data_file_type core_data_file_type
-app_data_file -app_data_file
-pdx_socket # used by VR layer -pdx_endpoint_socket_type # used by VR layer
-pdx_channel_socket_type # used by VR layer
}:sock_file ~{ append getattr ioctl read write }; }:sock_file ~{ append getattr ioctl read write };
# Core domains are not permitted to create/open sockets owned by vendor domains # Core domains are not permitted to create/open sockets owned by vendor domains
......
...@@ -264,7 +264,6 @@ type mdnsd_socket, file_type, coredomain_socket, mlstrustedobject; ...@@ -264,7 +264,6 @@ type mdnsd_socket, file_type, coredomain_socket, mlstrustedobject;
type misc_logd_file, coredomain_socket, file_type; type misc_logd_file, coredomain_socket, file_type;
type mtpd_socket, file_type, coredomain_socket; type mtpd_socket, file_type, coredomain_socket;
type netd_socket, file_type, coredomain_socket; type netd_socket, file_type, coredomain_socket;
type pdx_socket, file_type, coredomain_socket, mlstrustedobject;
type property_socket, file_type, coredomain_socket, mlstrustedobject; type property_socket, file_type, coredomain_socket, mlstrustedobject;
type racoon_socket, file_type, coredomain_socket; type racoon_socket, file_type, coredomain_socket;
type rild_socket, file_type; type rild_socket, file_type;
...@@ -281,6 +280,22 @@ type zygote_socket, file_type, coredomain_socket; ...@@ -281,6 +280,22 @@ type zygote_socket, file_type, coredomain_socket;
# UART (for GPS) control proc file # UART (for GPS) control proc file
type gps_control, file_type; type gps_control, file_type;
# PDX endpoint types
type pdx_display_dir, pdx_endpoint_dir_type, file_type;
type pdx_performance_dir, pdx_endpoint_dir_type, file_type;
type pdx_sensors_dir, pdx_endpoint_dir_type, file_type;
type pdx_pose_dir, pdx_endpoint_dir_type, file_type;
type pdx_bufferhub_dir, pdx_endpoint_dir_type, file_type;
pdx_service_socket_types(display_client, pdx_display_dir)
pdx_service_socket_types(display_manager, pdx_display_dir)
pdx_service_socket_types(display_screenshot, pdx_display_dir)
pdx_service_socket_types(display_vsync, pdx_display_dir)
pdx_service_socket_types(performance_client, pdx_performance_dir)
pdx_service_socket_types(sensors_client, pdx_sensors_dir)
pdx_service_socket_types(pose_client, pdx_pose_dir)
pdx_service_socket_types(bufferhub_client, pdx_bufferhub_dir)
# file_contexts files # file_contexts files
type file_contexts_file, file_type; type file_contexts_file, file_type;
......
...@@ -43,7 +43,7 @@ hal_client_domain(mediacodec, hal_graphics_allocator) ...@@ -43,7 +43,7 @@ hal_client_domain(mediacodec, hal_graphics_allocator)
# Recieve gralloc buffer FDs from bufferhubd. Note that mediacodec never # Recieve gralloc buffer FDs from bufferhubd. Note that mediacodec never
# directly connects to bufferhubd via PDX. Instead, a VR app acts as a bridge # directly connects to bufferhubd via PDX. Instead, a VR app acts as a bridge
# between those two: it talks to mediacodec via Binder and talks to bufferhubd # between those two: it talks to mediacodec via Binder and talks to bufferhubd
# via PDX. Thus, there is no need to use use_pdx macro. # via PDX. Thus, there is no need to use pdx_client macro.
allow mediacodec bufferhubd:fd use; allow mediacodec bufferhubd:fd use;
### ###
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
type performanced, domain, mlstrustedsubject; type performanced, domain, mlstrustedsubject;
type performanced_exec, exec_type, file_type; type performanced_exec, exec_type, file_type;
pdx_server(performanced) pdx_server(performanced, performance_client)
# TODO: use file caps to obtain sys_nice instead of setuid / setgid. # TODO: use file caps to obtain sys_nice instead of setuid / setgid.
allow performanced self:capability { setuid setgid sys_nice }; allow performanced self:capability { setuid setgid sys_nice };
......
...@@ -5,9 +5,10 @@ type sensord_exec, exec_type, file_type; ...@@ -5,9 +5,10 @@ type sensord_exec, exec_type, file_type;
hal_client_domain(sensord, hal_graphics_allocator) hal_client_domain(sensord, hal_graphics_allocator)
allow sensord hal_graphics_allocator:fd use; allow sensord hal_graphics_allocator:fd use;
pdx_server(sensord) pdx_server(sensord, sensors_client)
use_pdx(sensord, bufferhubd) pdx_server(sensord, pose_client)
use_pdx(sensord, performanced) pdx_client(sensord, bufferhub_client)
pdx_client(sensord, performance_client)
# Access /dev/ion # Access /dev/ion
allow sensord ion_device:chr_file r_file_perms; allow sensord ion_device:chr_file r_file_perms;
......
...@@ -85,26 +85,73 @@ allow $1 tmpfs:dir { getattr search }; ...@@ -85,26 +85,73 @@ allow $1 tmpfs:dir { getattr search };
# rules from underlying transport (e.g. UDS-based implementation). # rules from underlying transport (e.g. UDS-based implementation).
##################################### #####################################
# pdx_server(domain) # pdx_service_attributes(service)
define(`pdx_server', ` # Defines type attribute used to identify various service-related types.
allow $1 pdx_socket:dir create_dir_perms; define(`pdx_service_attributes', `
allow $1 pdx_socket:sock_file create_file_perms; attribute pdx_$1_endpoint_dir_type;
attribute pdx_$1_endpoint_socket_type;
attribute pdx_$1_channel_socket_type;
attribute pdx_$1_server_type;
') ')
##################################### #####################################
# use_pdx(clientdomain, serverdomain) # pdx_service_socket_types(service, endpoint_dir_t)
define(`use_pdx', ` # Define types for endpoint and channel sockets.
# Open the socket. define(`pdx_service_socket_types', `
allow $1 pdx_socket:dir r_dir_perms; typeattribute $2 pdx_$1_endpoint_dir_type;
allow $1 pdx_socket:sock_file rw_file_perms; type pdx_$1_endpoint_socket, pdx_$1_endpoint_socket_type, pdx_endpoint_socket_type, file_type, coredomain_socket, mlstrustedobject, mlstrustedsubject;
# Use the socket. type pdx_$1_channel_socket, pdx_$1_channel_socket_type, pdx_channel_socket_type, coredomain_socket;
allow $1 $2:unix_stream_socket { connectto read write shutdown }; ')
# Clients recieve an event fd from the server.
allow $1 $2:fd use; #####################################
# pdx_server(server_domain, service)
define(`pdx_server', `
# Mark the server domain as a PDX server.
typeattribute $1 pdx_$2_server_type;
# Allow the init process to create the initial endpoint socket.
allow init pdx_$2_endpoint_socket_type:unix_stream_socket { create bind };
# Allow the server domain to use the endpoint socket and accept connections on it.
# Not using macro like "rw_socket_perms_no_ioctl" because it provides more rights
# than we need (e.g. we don"t need "bind" or "connect").
allow $1 pdx_$2_endpoint_socket_type:unix_stream_socket { read getattr write setattr lock append getopt setopt shutdown listen accept };
# Allow the server domain to apply security context label to the channel socket pair (allow process to use setsockcreatecon_raw()).
allow $1 self:process setsockcreate;
# Allow the server domain to create a client channel socket.
allow $1 pdx_$2_channel_socket_type:unix_stream_socket create_stream_socket_perms;
# Prevent other processes from claiming to be a server for the same service.
neverallow {domain -$1} pdx_$2_endpoint_socket_type:unix_stream_socket { listen accept };
')
#####################################
# pdx_connect(client, service)
define(`pdx_connect', `
# Allow client to open the service endpoint file.
allow $1 pdx_$2_endpoint_dir_type:dir r_dir_perms;
allow $1 pdx_$2_endpoint_socket_type:sock_file rw_file_perms;
# Allow the client to connect to endpoint socket.
allow $1 pdx_$2_endpoint_socket_type:unix_stream_socket { connectto read write shutdown };
')
#####################################
# pdx_use(client, service)
define(`pdx_use', `
# Allow the client to use the PDX channel socket.
# Not using macro like "rw_socket_perms_no_ioctl" because it provides more rights
# than we need (e.g. we don"t need "bind" or "connect").
allow $1 pdx_$2_channel_socket_type:unix_stream_socket { read getattr write setattr lock append getopt setopt shutdown };
# Client needs to use an channel event fd from the server.
allow $1 pdx_$2_server_type:fd use;
# Servers may receive sync fences, gralloc buffers, etc, from clients. # Servers may receive sync fences, gralloc buffers, etc, from clients.
# This could be tightened on a per-server basis, but keeping track of service # This could be tightened on a per-server basis, but keeping track of service
# clients is error prone. # clients is error prone.
allow $2 $1:fd use; allow pdx_$2_server_type $1:fd use;
')
#####################################
# pdx_client(client, service)
define(`pdx_client', `
pdx_connect($1, $2)
pdx_use($1, $2)
') ')
##################################### #####################################
......
...@@ -24,7 +24,7 @@ allow vr_hwc ion_device:chr_file r_file_perms; ...@@ -24,7 +24,7 @@ allow vr_hwc ion_device:chr_file r_file_perms;
# Allow connection to VR DisplayClient to get the primary display metadata # Allow connection to VR DisplayClient to get the primary display metadata
# (ie: size). # (ie: size).
use_pdx(vr_hwc, surfaceflinger) pdx_client(vr_hwc, display_client)
# Requires access to the permission service to validate that clients have the # Requires access to the permission service to validate that clients have the
# appropriate VR permissions. # appropriate VR permissions.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment