系统签名与特权应用:身份如何背书能力
2026/8/9大约 3 分钟权限与安全Android 14系统签名特权应用白名单
系统签名与特权应用:身份如何背书能力
上一章看了 SELinux。这一章进入第四层,回答:平台签名(platform key)是什么, privapp 白名单怎么配,签名级权限如何授予?
特权路径、签名与白名单缺一不可
| 常见误解 | 正确理解 |
|---|---|
| 放在 /system/priv-app 就能为所欲为 | 还要通过 privapp 白名单校验,否则启动或安装会被拒 |
| 平台签名只影响系统应用 | 签名还决定 signature 级权限、共享 UID 与系统能力 |
| 白名单可有可无 | Android 8+ 对特权权限有强制白名单校验 |
核心结论
- platform key 签署的系统应用可获得 signature 级权限与系统能力。
- 特权应用(priv-app)申请 privileged 权限必须过 privapp-permissions 白名单。
- 白名单校验失败会导致启动失败或权限不授予,日志可定位。
- 签名级权限(signature)只有同签名的应用能申请到。
- 排查“特权权限没生效”先查签名与白名单两条线。
身份与白名单主链
逐步解释:
- 身份:平台签名背书 signature 级权限。
- 特权目录:应用位于 priv-app。
- 白名单:声明可获的 privileged 权限,系统强制校验。
- 授予:身份 + 白名单都满足才授予。
白名单文件长什么样
<!-- /system/etc/permissions/privapp-permissions-示例.xml -->
<privapp-permissions package="com.example.system">
<permission name="android.permission.MANAGE_USERS"/>
</privapp-permissions>系统会校验 priv-app 声明与白名单:只声明不在白名单,会告警甚至拒绝启动(具体行为 按版本配置)。
源码证据
阅读目标:确认白名单校验入口。
正文指针:PackageManagerService.java 中特权权限校验; PermissionManagerService.java 的 privileged 授予逻辑。
// PackageManagerService.java(伪代码,行号以 r75 为准)
boolean isAllowedByWhitelist(String permission, String packageName) {
// 检查 privapp-permissions 白名单
}这段代码证明: privileged 权限授予前要过白名单;签名则决定 signature 级权限。 两条身份线共同决定系统应用能力。
验证与排障
环境:开发设备或模拟器;以下命令不需要 root。
adb shell dumpsys package <包名> | grep -E "signatures|privileged|allowlisted"
adb shell dumpsys package <包名> | grep -A30 "requested permissions"
adb shell ls /system/etc/permissions/ | grep privapp先确认应用签名(signatures),再看 requested permissions 与白名单状态。特权权限 未生效时,对照“签名、目录、白名单”三项逐一排查。
常见误区
- “priv-app 自动拥有所有权限”:要过白名单。
- “platform 签名万能”:signature 级权限之外,SELinux 与白名单仍在。
- “白名单只是建议”:Android 8+ 有强制校验。
- “签名与白名单无关”:身份与名单共同决定能力。
延伸问题
- platform key 与 vendor key 的区别是什么?
- privapp-permissions 校验失败的具体表现是什么?
- signature 级权限如何被第三方应用申请?
- 厂商预装特权应用如何避免白名单遗漏?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
PackageManagerService.java | 白名单校验 | 特权权限 |
PermissionManagerService.java | privileged 授予 | 权限逻辑 |
privapp-permissions-*.xml | 系统权限目录 | 白名单 |
| 平台签名 | 构建产物 | 系统身份 |
公共路径:frameworks/base/services/core/java/com/android/server/pm/ 与 system/etc/permissions/。行号以 r75 检索为准。
跨进程服务如何验证调用方,见 Binder 安全。