blob: 305b1c281a658d4bf2d5e3a8ace448917303bd2b [file] [log] [blame]
David Anderson6d53efc2019-01-14 14:38:17 -08001# gsid - Manager for GSI Installation
2
3type gsid, domain;
4type gsid_exec, exec_type, file_type, system_file_type;
5typeattribute gsid coredomain;
6
7init_daemon_domain(gsid)
8
9binder_use(gsid)
David Andersondb90b912019-01-22 19:05:29 -080010binder_service(gsid)
David Anderson6d53efc2019-01-14 14:38:17 -080011add_service(gsid, gsi_service)
David Anderson8fe3c742019-02-07 13:14:20 -080012set_prop(gsid, gsid_prop)
David Andersondb90b912019-01-22 19:05:29 -080013
14# Needed to create/delete device-mapper nodes, and read/write to them.
15allow gsid dm_device:chr_file rw_file_perms;
16allow gsid dm_device:blk_file rw_file_perms;
17allow gsid self:global_capability_class_set sys_admin;
18dontaudit gsid self:global_capability_class_set dac_override;
19
David Anderson53ea5132019-07-08 18:59:58 -070020# On FBE devices (not using dm-default-key), gsid will use loop devices to map
21# images rather than device-mapper.
22allow gsid loop_control_device:chr_file rw_file_perms;
23allow gsid loop_device:blk_file rw_file_perms;
24allowxperm gsid loop_device:blk_file ioctl {
25 LOOP_GET_STATUS64
26 LOOP_SET_STATUS64
27 LOOP_SET_FD
28 LOOP_SET_BLOCK_SIZE
29 LOOP_SET_DIRECT_IO
30 LOOP_CLR_FD
31 BLKFLSBUF
32};
33
David Andersondb90b912019-01-22 19:05:29 -080034# libfiemap_writer uses sysfs to derive the bottom of a device-mapper stacking.
35# This requires traversing /sys/block/dm-N/slaves/* and reading the list of
36# file names.
David Anderson95fbedd2019-06-07 14:28:37 -070037r_dir_file(gsid, sysfs_dm)
David Andersondb90b912019-01-22 19:05:29 -080038
David Anderson6557d872019-03-15 16:41:15 -070039# Needed to read fstab, which is used to validate that system verity does not
40# use check_once_at_most for sdcard installs. (Note: proc_cmdline is needed
41# to get the A/B slot suffix).
42allow gsid proc_cmdline:file r_file_perms;
43allow gsid sysfs_dt_firmware_android:dir r_dir_perms;
44allow gsid sysfs_dt_firmware_android:file r_file_perms;
45
David Andersondb90b912019-01-22 19:05:29 -080046# Needed to stat /data/gsi/* and realpath on /dev/block/by-name/*
47allow gsid block_device:dir r_dir_perms;
48
49# liblp queries these block alignment properties.
David Anderson6557d872019-03-15 16:41:15 -070050allowxperm gsid { userdata_block_device sdcard_block_device }:blk_file ioctl {
David Andersondb90b912019-01-22 19:05:29 -080051 BLKIOMIN
52 BLKALIGNOFF
53};
54
David Anderson6557d872019-03-15 16:41:15 -070055# When installing images to an sdcard, gsid needs to be able to stat() the
56# block device. gsid also calls realpath() to remove symlinks.
57allow gsid mnt_media_rw_file:dir r_dir_perms;
58
59# When installing images to an sdcard, gsid must bypass sdcardfs and install
60# directly to vfat, which supports the FIBMAP ioctl.
61allow gsid vfat:dir rw_dir_perms;
62allow gsid vfat:file create_file_perms;
63allow gsid sdcard_block_device:blk_file r_file_perms;
64# This is needed for FIBMAP unfortunately. Oddly FIEMAP does not carry this
65# requirement, but the kernel does not implement FIEMAP support for VFAT.
66allow gsid self:global_capability_class_set sys_rawio;
67
David Andersondb90b912019-01-22 19:05:29 -080068# gsi_tool passes the system image over the adb connection, via stdin.
69allow gsid adbd:fd use;
David Anderson6557d872019-03-15 16:41:15 -070070# Needed when running gsi_tool through "su root" rather than adb root.
71allow gsid adbd:unix_stream_socket rw_socket_perms;
David Andersondb90b912019-01-22 19:05:29 -080072
David Anderson8fe3c742019-02-07 13:14:20 -080073neverallow { domain -gsid -init } gsid_prop:property_service set;
74
David Andersondb90b912019-01-22 19:05:29 -080075# gsid needs to store images on /data, but cannot use file I/O. If it did, the
76# underlying blocks would be encrypted, and we couldn't mount the GSI image in
77# first-stage init. So instead of directly writing to /data, we:
78#
79# 1. fallocate a file large enough to hold the signed GSI
80# 2. extract its block layout with FIEMAP
81# 3. create a dm-linear device using the FIEMAP, targeting /dev/block/by-name/userdata
82# 4. write system_gsi into that dm device
83#
84# To make this process work, we need to unwrap the device-mapper stacking for
85# userdata to reach the underlying block device. To verify the result we use
86# stat(), which requires read access.
87allow gsid userdata_block_device:blk_file r_file_perms;
88
89# gsid uses /metadata/gsi to communicate GSI boot information to first-stage
90# init. It cannot use userdata since data cannot be decrypted during this
91# stage.
92#
93# gsid uses /metadata/gsi to store three files:
94# install_status - A short string indicating whether a GSI image is bootable.
95# lp_metadata - LpMetadata blob describing the block ranges on userdata
96# where system_gsi resides.
97# booted - An empty file that, if exists, indicates that a GSI is
98# currently running.
99#
David Anderson53ea5132019-07-08 18:59:58 -0700100allow gsid metadata_file:dir { search getattr };
David Andersondb90b912019-01-22 19:05:29 -0800101allow gsid gsi_metadata_file:dir rw_dir_perms;
102allow gsid gsi_metadata_file:file create_file_perms;
103
104allow gsid gsi_data_file:dir rw_dir_perms;
105allow gsid gsi_data_file:file create_file_perms;
106allowxperm gsid gsi_data_file:file ioctl FS_IOC_FIEMAP;
107
108neverallow {
109 domain
110 -init
111 -gsid
112 -fastbootd
113 -vold
114} gsi_metadata_file:dir *;
115
116neverallow {
117 domain
118 -init
119 -gsid
120 -fastbootd
121 -vold
122} gsi_metadata_file:notdevfile_class_set ~{ relabelto getattr };
123
124neverallow {
125 domain
126 -init
127 -gsid
128 -fastbootd
129 -vold
130} { gsi_data_file gsi_metadata_file }:notdevfile_class_set *;
131
132neverallow {
133 domain
134 -gsid
David Anderson0b1094c2019-05-23 13:44:22 -0700135 -init
David Andersondb90b912019-01-22 19:05:29 -0800136} gsi_data_file:dir ~{ open create read getattr setattr search relabelto ioctl };
137
138neverallow {
139 domain
140 -init
141 -gsid
142} gsi_data_file:dir *;
143
144neverallow {
145 domain
146 -gsid
147} gsi_data_file:notdevfile_class_set ~{ relabelto getattr };