Android 11 User版本编译实战:如何安全地给系统镜像集成su命令(附完整SELinux策略修改清单)

Android 11 User版本编译实战:如何安全地给系统镜像集成su命令(附完整SELinux策略修改清单) Android 11 User版本安全集成su命令的工程实践1. 理解User版本的安全特性Android系统的User版本与Userdebug版本在安全机制上存在本质区别。User版本作为面向终端用户的正式发布版本其设计哲学是最小权限原则和深度防御策略。让我们先剖析几个关键安全组件SELinux强制访问控制Android 11采用MLS多级安全强制的SELinux策略所有进程和文件都带有安全上下文标签Capabilities限制即使以root身份运行进程也无法绕过内核的能力位检查文件系统保护/system分区默认只读关键目录如/sbin、/vendor具有特殊挂载选项在开发环境中集成su命令时常见的错误做法包括# 危险示例直接修改文件系统权限 chmod 4777 /system/xbin/su这种粗暴方式会触发SELinux的neverallow规则导致系统无法启动。正确的做法应该通过修改策略源文件实现权限控制。2. 编译环境准备与基础配置2.1 构建环境验证在开始修改前需要确保基础编译环境正常# 验证编译环境 repo sync -j8 source build/envsetup.sh lunch qssi-user make -j16关键配置文件中需要特别注意的项文件路径关键配置项安全影响build/make/core/main.mkro.secure1控制adb root权限system/core/include/private/android_filesystem_config.hAID_ROOT定义影响UID映射system/sepolicy/READMEneverallow规则策略修改边界2.2 su二进制集成标准集成流程应遵循Android的模块化设计在system/extras/su/Android.mk中声明编译目标在设备特定的makefile中添加依赖# device/[vendor]/[device]/device.mk PRODUCT_PACKAGES \ su特别注意不要直接复制预编译的su二进制文件这会导致SELinux标签不匹配和安全审计失败。3. SELinux策略深度定制3.1 策略文件修改清单以下是经过验证的必需修改项基于AOSP android-11.0.0_r48基础类型定义# system/sepolicy/public/su.te type su_exec, system_file_type, exec_type, file_type; typeattribute su mlstrustedsubject;域转换规则# system/sepolicy/public/domain.te neverallow { domain -dumpstate -shell -su } su_exec:file no_x_file_perms;关键进程例外# system/sepolicy/private/adbd.te neverallow adbd { domain -crash_dump -shell -su }:process transition;3.2 策略验证工具链修改后必须执行策略验证# 编译策略文件 make -j16 sepolicy # 验证neverallow规则 sepolicy-analyze out/target/product/[device]/obj/ETC/sepolicy_intermediates/policy.conf neverallow常见错误处理方案错误类型解决方案风险等级neverallow冲突检查domain.te中的例外规则高危标签丢失确保file_contexts正确定义中危权限不足添加精确的allow规则低危4. 系统服务与su的交互控制4.1 关键服务访问控制需要为以下系统服务特别配置su访问策略adbd服务# system/sepolicy/private/adbd.te allow adbd su:process transition;zygote进程# system/sepolicy/private/app_zygote.te neverallow app_zygote { domain -app_zygote -su }:unix_stream_socket *;属性服务# system/sepolicy/public/property.te neverallow { domain -init -su } init_svc_debug_prop:file no_rw_file_perms;4.2 服务启动时序控制在init.rc中定义su服务时需注意service su /system/xbin/su class main user root group root disabled seclabel u:r:su:s0关键参数说明disabled避免自动启动seclabel明确指定安全上下文user/group控制执行身份5. 安全加固与风险缓解5.1 su执行环境限制建议添加以下加固措施能力位限制// system/extras/su/su.c cap_t caps cap_get_proc(); cap_clear(caps); cap_set_flag(caps, CAP_PERMITTED, CAP_NET_ADMIN, CAP_SET); cap_set_proc(caps);日志审计# system/sepolicy/private/su.te allow su kernel:system syslog_read;网络隔离neverallow su net_domain:rawip_socket *;5.2 密码验证机制实现示例密码验证流程# 伪代码示例 def verify_password(input): stored_hash read_persist_data() if scrypt_verify(input, stored_hash): return True log_audit_event(su_auth_fail) return False安全存储建议使用/data/adb/目录存储密码哈希采用Android密钥库加密存储实现失败次数限制6. 兼容性测试与验证6.1 CTS测试适配需要特别关注的测试项SELinux策略测试atest CtsSecurityTestCases:android.security.cts.SELinuxHostTestroot权限检测atest CtsSecurityTestCases:android.security.cts.RootDetectionTestAPI兼容性atest CtsPermissionTestCases6.2 现场问题排查指南常见问题排查工具# 查看SELinux拒绝日志 adb shell dmesg | grep avc # 检查su上下文 adb shell ls -Z /system/xbin/su # 验证能力位 adb shell getpcaps $(pidof su)7. 工业场景下的特殊考量对于工业设备部署建议额外配置白名单控制!-- /etc/su_access.xml -- config package namecom.industrial.control user nameroot / /package /config时间限制策略// 示例仅在维护时段允许su if (!is_maintenance_window()) { exit(1); }物理安全联动# 通过GPIO检测维护开关状态 cat /sys/class/gpio/gpioX/value8. 版本维护与升级策略8.1 OTA兼容性处理在BoardConfig.mk中声明# 保留su相关修改 TARGET_OTA_ASSERT_UPDATE : \ system/extras/su \ system/sepolicy8.2 版本回滚保护建议在bootloader中添加验证// 验证su版本兼容性 if (su_version MIN_SU_VERSION) { abort_ota(); }9. 性能与资源占用优化9.1 内存占用分析典型su进程资源使用指标数值优化建议常驻内存~2MB使用jemallocCPU占用0.1%限制调度优先级存储空间56KB启用压缩9.2 启动时间优化通过bootchart测量的影响# 测量su服务启动时间 adb shell su -c time true优化技术预加载so库延迟初始化非关键组件并行化启动流程10. 调试与问题诊断10.1 日志收集方案配置专属日志通道# init.rc修改 service sulogd /system/bin/logcat -b all -f /data/su.log class main user root group root10.2 常见错误代码错误码含义解决方案EPERM能力不足检查capabilitiesEACCESSELinux拒绝分析avc日志ENOSYS内核不支持验证内核配置11. 替代方案评估11.1 基于CAP_NET_ADMIN的方案对于网络配置需求可考虑# 替代su的方案 setcap cap_net_adminep /system/bin/ifconfig11.2 专用管理接口开发受限的管理APIpublic class RestrictedAdminService { RequiresPermission(android.permission.MANAGE_NETWORK) public void setInterfaceUp(String iface) { // 实现受限管理功能 } }12. 长期维护建议策略文档化├── sepolicy/ │ ├── su_changes.md │ ├── compatibility_matrix.xml │ └── audit_logs/自动化测试# 示例测试用例 def test_su_selinux_context(): assert get_context(/system/xbin/su) u:object_r:su_exec:s0安全更新机制# 月度安全检查脚本 check_sepolicy -module su -level security