A Note about sepolicy in Android Oreo.
First thing first
SELinux documents:
Android sepolicy files
Policy path:
- /system/sepolicy
- BOARD_SEPOLICY_DIR (device/$VENDOR/$DEVICE/sepolicy/, device/$VENDOR/$DEVICE/common/sepolicy/)
Policy Macros:
- system/sepolicy/public/te_macros
- system/sepolicy/public/global_macros
- system/sepolicy/public/ioctl_macros
- system/sepolicy/public/neverallow_macros
- system/sepolicy/private/mls_macros
- system/sepolicy/reqd_mask/mls_macros
Security Context:
- file_contexts, labeling files infilesystem.
- property_contexts, labeling android system/vendor properties
- genfs_contexts, Pre-file labeling for /proc files, generic filesystem security contexts.
- seapp_contexts, used by zygote and installd via libselinux, mapping app UID andseinfofor /data/data directory
- hwservice_contexts, for hwservice manager to check
- vndservice_contestx, for vndservice manager to check
- service_contexts, for service manager to check
Type Enforcement
- *.te
Composing Policy for Android trebel
Add domains for a service
Add security context depend on service type:
Hardware service
Define service type in hwservice.tetype vnd_foo_hwservice, hwservice_manager_type;
Labeling hwservice in hwservice_contexts
vendor.realtek.foo::IfooAPI u:object_r:vnd_foo_hwservice:s0
- Vendor service
Define service type in vndservice.te
type foo_service, vndservice_manager_type;
Labeling vndservice in vndservice_contexts
fooservice u:object_r:foo_service:s0
- System service
Define service type in service.te
type foo_service, service_manager_type;
Labeling system service in service_contexts
fooservice u:object_r:foo_service:s0
Add domain and type enforcement configuration
Create new foo.te file
Define service doamin and file attributes
type foo, domain; type foo_exec, exec_type, vendor_file_type, file_type; init_daemon_domain(foo)
Add file security context in file_contexts
/vendor/bin/foo u:object_r:foo_exec:s0
Building policy files
There are typically seven SELinux related files under an Android device (see more details here):
- selinux_version
- sepolicy: binary output after combining policy files (security_classes, initial_sids, *.te, etc)
- file_contexts
- property_contexts
- seapp_contexts
- service_contexts
- system/etc/mac_permissions.xml
Building file_contexts.bin
find file_contexts in /system/sepolicy and BOARD_SEPOLICY_DIR
output files:
out/target/product/$DEVICE/obj/ETC/nonplat_file_contexts_intermediates/nonplat_file_contexts
out/target/product/$DEVICE/obj/ETC/plat_file_contexts_intermediates/plat_file_contexts
binary file:
out/target/product/$DEVICE/obj/ETC/file_contexts.bin_intermediates/file_contexts.bin
install to root/file_contexts.bin
Building policy configuration
find security_classes, initial_sids, *.te, genfs_contexts, and port_contexts in /system/sepolicy and BOARD_SEPOLICY_DIR
configure file:
out/target/product/$DEVICE/obj/ETC/plat_sepolicy.cil_intermediates/plat_policy.conf
out/target/product/$DEVICE/obj/ETC/nonplat_sepolicy.cil_intermediates/nonplat_policy.conf
out/target/product/$DEVICE/obj/ETC/general_sepolicy.conf_intermediates/general_sepolicy.conf
install to /root/sepolicy