blob: fe1d08e9e31e1b85db39a5ada817b99d56658754 [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)
Yo Chiangffe786e2020-10-07 13:59:52 +080012
13# Manage DSU metadata encryption key through vold.
14allow gsid vold_service:service_manager find;
15binder_call(gsid, vold)
16
David Anderson8fe3c742019-02-07 13:14:20 -080017set_prop(gsid, gsid_prop)
David Andersondb90b912019-01-22 19:05:29 -080018
19# Needed to create/delete device-mapper nodes, and read/write to them.
20allow gsid dm_device:chr_file rw_file_perms;
21allow gsid dm_device:blk_file rw_file_perms;
22allow gsid self:global_capability_class_set sys_admin;
23dontaudit gsid self:global_capability_class_set dac_override;
24
David Anderson53ea5132019-07-08 18:59:58 -070025# On FBE devices (not using dm-default-key), gsid will use loop devices to map
26# images rather than device-mapper.
27allow gsid loop_control_device:chr_file rw_file_perms;
28allow gsid loop_device:blk_file rw_file_perms;
29allowxperm gsid loop_device:blk_file ioctl {
30 LOOP_GET_STATUS64
31 LOOP_SET_STATUS64
32 LOOP_SET_FD
33 LOOP_SET_BLOCK_SIZE
34 LOOP_SET_DIRECT_IO
35 LOOP_CLR_FD
36 BLKFLSBUF
37};
38
David Andersondb90b912019-01-22 19:05:29 -080039# libfiemap_writer uses sysfs to derive the bottom of a device-mapper stacking.
40# This requires traversing /sys/block/dm-N/slaves/* and reading the list of
41# file names.
David Anderson95fbedd2019-06-07 14:28:37 -070042r_dir_file(gsid, sysfs_dm)
David Andersondb90b912019-01-22 19:05:29 -080043
David Andersond2a70f12019-12-10 16:23:59 -080044# libfiemap_writer needs to read /sys/fs/f2fs/<dev>/features to determine
45# whether pin_file support is enabled.
46r_dir_file(gsid, sysfs_fs_f2fs)
47
David Anderson6557d872019-03-15 16:41:15 -070048# Needed to read fstab, which is used to validate that system verity does not
49# use check_once_at_most for sdcard installs. (Note: proc_cmdline is needed
50# to get the A/B slot suffix).
51allow gsid proc_cmdline:file r_file_perms;
52allow gsid sysfs_dt_firmware_android:dir r_dir_perms;
53allow gsid sysfs_dt_firmware_android:file r_file_perms;
54
David Andersondb90b912019-01-22 19:05:29 -080055# Needed to stat /data/gsi/* and realpath on /dev/block/by-name/*
56allow gsid block_device:dir r_dir_perms;
57
58# liblp queries these block alignment properties.
David Anderson6557d872019-03-15 16:41:15 -070059allowxperm gsid { userdata_block_device sdcard_block_device }:blk_file ioctl {
David Andersondb90b912019-01-22 19:05:29 -080060 BLKIOMIN
61 BLKALIGNOFF
62};
63
David Anderson6557d872019-03-15 16:41:15 -070064# When installing images to an sdcard, gsid needs to be able to stat() the
65# block device. gsid also calls realpath() to remove symlinks.
66allow gsid mnt_media_rw_file:dir r_dir_perms;
67
68# When installing images to an sdcard, gsid must bypass sdcardfs and install
69# directly to vfat, which supports the FIBMAP ioctl.
70allow gsid vfat:dir rw_dir_perms;
71allow gsid vfat:file create_file_perms;
72allow gsid sdcard_block_device:blk_file r_file_perms;
73# This is needed for FIBMAP unfortunately. Oddly FIEMAP does not carry this
74# requirement, but the kernel does not implement FIEMAP support for VFAT.
75allow gsid self:global_capability_class_set sys_rawio;
76
Yo Chiang45fb38b2020-08-28 22:07:09 +080077# Allow rules for gsi_tool.
78userdebug_or_eng(`
79 # gsi_tool passes the system image over the adb connection, via stdin.
80 allow gsid adbd:fd use;
81 # Needed when running gsi_tool through "su root" rather than adb root.
82 allow gsid adbd:unix_stream_socket rw_socket_perms;
83 # gsi_tool passes a FIFO to gsid if invoked with pipe redirection.
84 allow gsid { shell su }:fifo_file r_file_perms;
Yo Chiang04429cc2020-08-31 16:30:55 +080085 # Allow installing images from /storage/emulated/...
86 allow gsid sdcard_type:file r_file_perms;
Yo Chiang45fb38b2020-08-28 22:07:09 +080087')
David Andersondb90b912019-01-22 19:05:29 -080088
Yifan Hong07a99e12019-08-07 13:01:15 -070089neverallow {
90 domain
91 -gsid
92 -init
93 -update_engine_common
David Andersonb45bbe22019-10-17 19:07:52 -070094 -recovery
95 -fastbootd
Yifan Hong07a99e12019-08-07 13:01:15 -070096} gsid_prop:property_service set;
David Anderson8fe3c742019-02-07 13:14:20 -080097
David Andersondb90b912019-01-22 19:05:29 -080098# gsid needs to store images on /data, but cannot use file I/O. If it did, the
99# underlying blocks would be encrypted, and we couldn't mount the GSI image in
100# first-stage init. So instead of directly writing to /data, we:
101#
102# 1. fallocate a file large enough to hold the signed GSI
103# 2. extract its block layout with FIEMAP
104# 3. create a dm-linear device using the FIEMAP, targeting /dev/block/by-name/userdata
105# 4. write system_gsi into that dm device
106#
107# To make this process work, we need to unwrap the device-mapper stacking for
108# userdata to reach the underlying block device. To verify the result we use
109# stat(), which requires read access.
110allow gsid userdata_block_device:blk_file r_file_perms;
111
112# gsid uses /metadata/gsi to communicate GSI boot information to first-stage
113# init. It cannot use userdata since data cannot be decrypted during this
114# stage.
115#
116# gsid uses /metadata/gsi to store three files:
117# install_status - A short string indicating whether a GSI image is bootable.
118# lp_metadata - LpMetadata blob describing the block ranges on userdata
119# where system_gsi resides.
120# booted - An empty file that, if exists, indicates that a GSI is
121# currently running.
122#
David Anderson53ea5132019-07-08 18:59:58 -0700123allow gsid metadata_file:dir { search getattr };
Yifan Hong07a99e12019-08-07 13:01:15 -0700124allow gsid {
125 gsi_metadata_file
Howard Chene9789472020-01-17 14:19:56 +0800126}:dir create_dir_perms;
127
128allow gsid {
Yifan Hong07a99e12019-08-07 13:01:15 -0700129 ota_metadata_file
130}:dir rw_dir_perms;
Howard Chene9789472020-01-17 14:19:56 +0800131
Yifan Hong07a99e12019-08-07 13:01:15 -0700132allow gsid {
133 gsi_metadata_file
134 ota_metadata_file
135}:file create_file_perms;
David Andersondb90b912019-01-22 19:05:29 -0800136
Yifan Hong07a99e12019-08-07 13:01:15 -0700137allow gsid {
138 gsi_data_file
139 ota_image_data_file
140}:dir rw_dir_perms;
141allow gsid {
142 gsi_data_file
143 ota_image_data_file
144}:file create_file_perms;
145allowxperm gsid {
146 gsi_data_file
147 ota_image_data_file
Yo Chianga5d25622020-08-19 14:28:06 +0800148}:file ioctl {
149 FS_IOC_FIEMAP
150 FS_IOC_GETFLAGS
151};
David Andersondb90b912019-01-22 19:05:29 -0800152
Howard Chen389bc7b2020-02-26 17:19:10 +0800153allow gsid system_server:binder call;
154
David Andersondb90b912019-01-22 19:05:29 -0800155neverallow {
156 domain
157 -init
158 -gsid
159 -fastbootd
David Andersonb45bbe22019-10-17 19:07:52 -0700160 -recovery
David Andersondb90b912019-01-22 19:05:29 -0800161 -vold
162} gsi_metadata_file:dir *;
163
164neverallow {
165 domain
166 -init
167 -gsid
168 -fastbootd
169 -vold
170} gsi_metadata_file:notdevfile_class_set ~{ relabelto getattr };
171
172neverallow {
173 domain
174 -init
175 -gsid
176 -fastbootd
177 -vold
178} { gsi_data_file gsi_metadata_file }:notdevfile_class_set *;
179
180neverallow {
181 domain
182 -gsid
David Anderson0b1094c2019-05-23 13:44:22 -0700183 -init
David Andersondb90b912019-01-22 19:05:29 -0800184} gsi_data_file:dir ~{ open create read getattr setattr search relabelto ioctl };
185
186neverallow {
187 domain
188 -init
189 -gsid
190} gsi_data_file:dir *;
191
192neverallow {
193 domain
194 -gsid
195} gsi_data_file:notdevfile_class_set ~{ relabelto getattr };