Skip to content

隐私与安全:Intent 安全体系、本地网络收口、ART/GPU 加固与密钥共享 ​

本页导读:Android 16 的安全隐私主线是「把易被滥用的系统便利收进闸门」:Intent 获得三层防御(重定向默认拦截、接收侧严格匹配、配套配对扫描限流)、局域网访问即将需要运行时权限、MediaStore 版本去指纹、健康数据细粒度权限、Mali GPU 系统调用过滤、ART 通过 Mainline 跨版本加固、Keystore 首次支持受控跨应用共享。本页把散在两页行为变更与特性页里的安全项串成一张治理图,并对流传但不实的项目做澄清。

版本注记:事实源为官方行为变更两页与特性页安全节,核对时间 2026-10。除标注外均为 Android 16 / API 36。

一、全景清单 ​

项触发条件一句话详情锚点
Intent 重定向默认防护全部应用系统级拦截「借壳启动」攻击01 页 §十
Safer Intents 严格匹配target36 + 清单启用显式 intent 必须过 filter、空 action 不匹配02 页 §九
CDM 配对扫描限流全部应用发现超时改系统对话框,搜索 30s01 页 §十一
本地网络权限(LNP)target36,25Q2 起选择启用局域网访问换运行时权限02 页 §十
MediaStore 版本锁定target36版本串每应用唯一,防指纹本页 §四
应用自有照片回收target36用户可在选择器收回自有照片授权02 页 §十
健康细粒度权限target36BODY_SENSORS 让位 health 族02 页 §七
ART 内部加固/演进全部应用(Mainline 下发)内部结构依赖随时可能炸本页 §六
Mali GPU IOCTL 过滤Pixel 6–9 等弃用/调试 GPU 系统调用屏蔽本页 §七
KeyStoreManager 密钥共享API 36 新 API按 uid 授权他应用用本应用密钥本页 §八

读法:前两列决定「什么会被触发」,锚点列给操作细节。安全类变更的特殊点是很多条目(重定向防护、LNP 演练、ART)不看你的 targetSdk,存量版本同样要跑一遍本页 checklist。

二、Intent 安全:一个攻击面的三层闸门 ​

攻击面回顾(官方风险文档:Intent 重定向):恶意应用把「子 Intent」塞进传给受害者应用的 extras,受害者把它 startActivity——结果恶意代码借受害者身份启动私有组件、触发特权动作或获得 URI 数据访问。

Android 16 的三层布防:

  1. 平台默认(全部应用):系统对「转发外部子 Intent」模式做默认加固,正常应用无感;确有正当转发需求时用 Intent.removeLaunchSecurityProtection() 显式退出(API 36 编译可直接调用;未升 36 编译可按官方示例反射过渡——注意这只是逃生阀,等于宣布该处自担校验责任)。
  2. 接收侧(target36,选择启用):android:intentMatchingFlags="enforceIntentFilter" 后,跨应用的显式 intent 必须命中目标组件 intent-filter、无 action intent 不再命中任何 filter。官方路线图:未来从选择启用走向默认强制——现在开,等于提前买 17 时代的保险。
  3. 入口侧(CDM):配套设备配对扫描不再向应用回传超时细节、搜索窗口 30s 且发现即停,堵住「借配对扫描持续探测周边/推断位置」的旁路(官方原文点名的正是位置隐私)。

自查命令(Safer Intents 生效期盯日志):

bash
adb logcat -d | grep -E "PackageManager.*(does not match|Access blocked)"

出现即说明有调用方 intent 构造不规范:要么修调用方,要么对该组件/该调用点用 allowNullAction、组件级 none 精细豁免,不要整应用关掉。

落地决策顺序:

  1. 日志零告警 → 直接开 enforceIntentFilter,白赚。
  2. 告警来自自家调用方 → 修 intent(补 action/校正组件),这是主路径。
  3. 告警来自外部合法调用方 → 该 receiver 用 none 豁免并记录债,随调用方升级逐个收回。
  4. 确需空 action 的历史协议 → enforceIntentFilter + allowNullAction 组合,范围收敛到单组件。

三、LNP:局域网从「公共走廊」变「授权房间」 ​

治理逻辑与 13 的通知、14 的照片选择器一脉相承(同一治理剧本的第四幕):INTERNET ≠ 本地网络。target36 视角的完整规则(操作矩阵、网段定义、RESTRICT_LOCAL_NETWORK 测试开关、EPERM 症状)在 02 页 §十;安全合规视角只强调三点:

  • 数据画像风险:局域网扫描可枚举家庭/办公室设备形成用户画像,甚至替代位置权限推断行踪——这是 LNP 立项的官方理由。
  • 实现位置:限制在网络栈深处,托管/原生/库(OkHttp、Cronet)一视同仁;WebView 继承宿主授权状态。
  • 合规话术:权限用途说明要与「发现并连接本地设备」的具体功能绑定,泛写「改善体验」会在审核面出问题。

按场景类型的提前量:

场景受 LNP 冲击建议动作
投屏/DLNA高(多播发现 + 直连)等官方投屏豁免指南;先把发现层与传输层解耦
NAS/局域网快传高授权引导 + 失败可解释;评估云中转兜底
智能家居本地控制高(mDNS/SSDP)权限迁移到「附近的设备」组预期内设计
纯公网 API 应用无只需回归确认无隐藏局域网依赖(CDN 本机回环除外)

四、指纹化小项:MediaStore 版本与应用自有照片 ​

  • MediaStore#getVersion()(target36):返回串每应用唯一化,剥离可用于跨应用对齐的标识属性——官方直说这是防「滥用与指纹识别」。依赖「版本变了→增量同步」的应用不受影响;想从版本串里读出别的信息的实现要重写假设。
  • 应用自有照片:target36 应用触发媒体权限时,用户选「限制访问」则选择器预选该应用自有照片,取消勾选即收回这些文件的访问。安全含义:媒体归属 ≠ 媒体授权,自有文件的读取路径同样要过用户同意这一关。

这条容易被低估:大量「相册替身/文件管理/修图」类应用把 MediaStore 里 owner 为本应用的行当私有存储用(拍照缓存、导出成品)。16 之后这些路径随时可能被用户整批收回,正确姿势是把应用私有文件放应用专属目录(getExternalFilesDir 等),MediaStore 里只放真正交付给用户的媒体。

五、健康、位置与「没有发生的变化」 ​

  • 健康数据:细粒度 android.permission.health 族 + 隐私政策 activity + 缺理由撤权,全链路见 02 页 §七。位置侧 Android 16 两页行为变更无新增位置权限条目(精确/模糊位置体系仍是 Android 12(API 31)的格局);官方在 16 做的与位置相关的是 CDM 扫描限流(§二第 3 层)与 LNP 的位置代理风险治理(§三)。
  • 锁屏通知细粒度授权、通知逐渠道权限:官方 16 两页无此条目。16 的通知更新是能力型(ProgressStyle),不是权限型。

六、ART:安全与兼容的双面刃 ​

版本注记:Android 16 / API 36;Mainline 下发口径来自 16 官方行为变更页。

  • ART 的内部变更随 Google Play 系统更新下发到「10 亿+ 台 Android 12(API 31)及以上设备」——意味着一次 ART 演进不等待整机 OTA。依赖 ART 内部结构的库(官方点名 HiddenApiBypass、老版本 FlyCore)在旧系统上也会突然崩。
  • 安全侧含义:非 SDK 接口限制(机制文档)本就按平台版本维护名单;16 的行为变更页没有宣布「新增一批被封接口」,而是把风险升维到「组件级更新随时到来」。反射党的合规窗口比想象的更窄。
  • 治理建议:把「反射/内部结构清单」当安全债台账管理——每项登记用途、替代公共 API、退出计划;新需求一律走公共 API 特性请求。

台账最小字段模板:

字段示例
反射目标ActivityThread.mH(取消息队列观察卡顿)
引入原因公共 API 无等效 hook 点
受影响面Android 12–16 各机型 ART 版本
退出计划迁移 JankStats/Perfetto 上报,Q3 前下线

七、GPU 侧:Mali IOCTL 白名单化(内核面收口) ​

版本注记:Android 16 / API 36,安全加固项目(官方指向 SAC 策略更新);落地于 Pixel 6–9 等 Mali GPU 机型,AOSP 默认携带、OEM 选择性启用。

  • 做法:正式版 build 屏蔽已弃用/仅限开发的 Mali GPU IOCTL;GPU 性能分析类 IOCTL 仅留给 shell 进程与可调试应用。分类表由 Arm 官方维护(驱动 Documentation/ioctl-categories.rst,r54p2 起),OEM/SoC 负责同步进自家 SEPolicy。
  • 应用侧感知:正常 Vulkan/OpenGL 与官方剖析工具(AGI、Streamline)不受影响;受影响会看到 avc: denied { ioctl } path="/dev/mali0" 的 SELinux 审计。回归时在 logcat 扫 avc: denied 即可确认无感。
  • 治理含义:这是「GPU 驱动 ioctl 从自由市场变白名单市场」的第一步,同类思路后续可能扩到其它驱动——内核攻击面收敛是长期方向。

读审计日志的小抄:avc: denied { ioctl } 里看三个字段——path=(哪个设备节点)、ioctlcmd=(被拒调用号)、permissive=0(硬拒)。同一 cmd 号可在 Arm 分类表里对号「弃用/检测/受限」三类,据此判断是误伤(找 OEM/提单)还是本就该禁(自己修)。

八、Keystore:KeyStoreManager 受控跨应用共享 ​

版本注记:Android 16 / API 36 新增 API;Keystore 体系文档见官方密钥库指南。

  • 新类 KeyStoreManager:密钥属主可按应用 uid 授予/撤销其他应用对指定密钥的访问,被授权方走配套访问 API。
  • 意义:以前跨应用共用密钥只有系统级特例或各厂商私通道;现在有了带撤销语义的标准机制——适合企业套件(EDM 与业务 app)、同厂商应用族共用密钥根的场景。
  • 设计要点:把「授予」当高危配置对待(uid 绑定、可撤销、审计日志),并处理属主撤销后的密钥不可用分支。

三态测试矩阵:授予后对方可用(正常态)→ 属主撤销后对方立即取用失败并拿到明确异常(撤销态)→ 属主卸载/重装后 uid 变化导致的授权失效分支(生命周期态)。三态跑不完不要上生产。

九、Mainline:安全能力如何「不等 OTA」 ​

16 官方文档给出的 Mainline 事实样本,拼出「核心组件可单独更新」的官方口径:

  • ART:经 Play 系统更新下发,覆盖 Android 12+ 十亿级设备(官方博客);16 的行为变更页把它写成所有开发者都要检查的兼容项。
  • 照片选择器:模块化组件 + Play 服务组合,官方口径后向支持到 Android 4.4(API 19)——16 的嵌入式选择器/云搜索新能力随组件下发旧版本。
  • SDK 运行时(Privacy Sandbox):16 集成最新 Privacy Sandbox on Android,SDK 在与宿主应用隔离的专用运行时中执行数据操作(项目页),是「敏感逻辑搬进沙箱化 Mainline 组件」的代表作。
  • 观测手段:设备上 adb shell dumpsys package modules 可列 ApexModule 与版本;排查「用户机型行为差异」时,先对组件版本再怀疑平台版本。

学习视角一句话:读 AOSP 某 framework 类时,别忘了设备上真正跑的可能是 Play 下发的新版组件——源码版本、镜像版本、ApexModule 版本三者要对齐着看,方法见 tools/01 源码地图。

顺带两个常用查询:adb shell pm list packages --apex 看已装 Apex 内包名;设置页「Android 版本」详情里也能看到安全维护级别。写故障工单时附一组组件版本,比只报「Android 16」有效得多。

十、澄清区:这些「16 安全新规」都是误传 ​

传言核实结果
「Android 16 引入 APK 签名 v4」误传。v4 签名(序列文件、增量安装配套)是 Android 11(API 30) 的机制;16 官方两页与特性页无任何 APK 签名新版本条目
「锁屏通知要逐条授权」无此项;16 通知侧只有 ProgressStyle 能力新增
「位置权限再细分」无新增;现有体系仍为 Android 12(API 31)的精确/模糊双档框架
「后台音频播放需新权限」16 两页无此条目;后台媒体约束挂在 Android 14(API 34)前台服务类型体系
「target36 强制启用 Safer Intents」半误传:16 阶段是选择启用(官方明示未来版本才计划转为默认),现在强制的是「你不知道它存在」这件事
「16 要求所有应用重新申请权限」无此机制;变更只改变特定 API 的权限需求(健康族/LNP),存量授权不重置
「GPU IOCTL 过滤影响所有 OEM」官方口径:Pixel 6–9(Mali)直接生效;其他 OEM 为选择性启用,非全员强制

十一、安全适配 checklist(合并进发布流程) ​

  • [ ] 全工程扫 setPackage/setComponent 之外转发外部 Intent 的路径,验证默认防护下无功能断裂。
  • [ ] 评估并(建议)启用 enforceIntentFilter,logcat 过滤器跑全回归,豁免用组件级 none/allowNullAction。
  • [ ] NEARBY/局域网访问代码路径接入 RESTRICT_LOCAL_NETWORK 演练,EPERM 出现路径配用户引导。
  • [ ] 媒体访问审计:自有照片不再默认可读;MediaStore.getVersion 无格式假设。
  • [ ] 健康类功能迁移 health 权限族 + 隐私政策 activity。
  • [ ] 反射/内部接口债台账建立,HiddenApiBypass 类库升级或移除。
  • [ ] SELinux 审计扫描(avc: denied)纳入回归尾部;Mali 机型(Pixel 6–9)至少一台。
  • [ ] 密钥共享如使用 KeyStoreManager:授权、撤销、属主卸载三态测试。
  • [ ] 用 dumpsys package modules 记录主流测试机的关键 ApexModule 版本,差异排查有据。
  • [ ] Privacy Sandbox/SDK Runtime 如涉及广告 SDK:核对适配版本与隔离运行时兼容性说明。
  • [ ] 对外安全说明文档(隐私白皮书类)同步更新 16 相关条目:LNP、health 权限、Intent 加固。

十二、三个快答 ​

  • Q:removeLaunchSecurityProtection 能全局常开吗? 技术上可逐 Intent 调用,工程上应视为安全例外点登记入台账并加注释说明原因;它保护的是你自己应用的上下文权限,默认开启对绝大多数应用只有好处。
  • Q:Safer Intents 现在开,会不会挡死存量外部调用方? 先跑 §二 的决策树再定;跨应用协议有历史包袱的,用组件级豁免过渡,别无脑全关。
  • Q:Mainline 组件版本差异导致线上行为不一致,官方有没有矩阵可查? 官方以设备/组件自证为准(dumpsys package modules + 各模块文档),没有静态全网矩阵;把主流测试机型的组件版本记进质量台账是现实替代方案。

本页小结 ​

本页小结:Android 16 的安全隐私没有惊天新政,而是把过去三年的方向各推进一格:Intent 三层闸门(默认防重定向 → 接收侧严格匹配选择启用 → CDM 扫描限流)、局域网访问收口(LNP 的 EPERM 已在路上)、指纹面缩小(MediaStore 版本唯一化、自有照片可回收)、运行底座加固(ART 经 Mainline 随时演进、Mali IOCTL 白名单化),并给出受控互信原语(KeyStoreManager)。对开发者的可操作结论:把「选择启用项」当「未来默认项」提前适配,把反射与内部依赖当安全债清算——这两件事做完,16 的安全变更基本没有意外。

参考资料 ​

(安全条目时效性强:动手前请以官方两页行为变更与 API diff 最新版本复核,勿以本页为唯一依据。)

基于 Android 16 / API 36 · 内容为原创整理,转载请注明出处