当谷歌在 Android 17 中彻底堵上 Scoped Storage 的最后几个例外场景时,GrapheneOS 已经用 Storage Scopes 走在了前面。这篇文章带你深入理解 Android 17 的存储权限变革,以及 GrapheneOS 如何通过硬件级内存隔离、零信任沙箱和细粒度存储作用域,将 Scoped Storage 和 Storage Access Framework 推向真正的“硬化”状态。

一、引子:一场迟到五年的“存储革命”

2026年6月16日,谷歌正式向 Pixel 6 及后续机型推送 Android 17 稳定版。同一天,GrapheneOS 项目组宣布已完成对 Android 17 的初始移植,正在解决回归问题以准备公开发布。

表面上看,Android 17 带来的新特性包括浮动 App Bubbles、Screen Reactions 视频反应功能、生物特征丢失保护以及严格的一次性位置权限。但真正让开发者夜不能寐的,是隐藏在 QPR1 Beta 2 发布说明中的一句话:

“Scoped storage exceptions that survived through Android 16 are now deprecated with hard removal timelines.”

这句话意味着,从 Android 10 开始引入、历经五个大版本迭代的分区存储(Scoped Storage),终于在 Android 17 中完成了从“建议”到“强制”的最后一跃。而那些在 Android 16 中仍然存活的例外场景,如今已被彻底移除。

如果说 Android 10 是 Scoped Storage 的“软启动”,Android 11 是“强制开启”,那么 Android 17 就是“零例外”——所有应用,无论 targetSdkVersion 如何,都必须遵守分区存储的规则。

这一变革的影响范围有多大?根据金标联盟(ITGSA 移动智能终端生态联盟)2026年4月21日发布的公告,所有接入其分发渠道的应用开发者必须在 2026年7月1日前 完成对 Android 17 的全量适配。未按时完成适配的应用将面临新版本无法上架的风险。

但真正的问题不在于“要不要适配”,而在于“适配到什么程度”。在 Android 原生的 Scoped Storage 和 Storage Access Framework(SAF)之上,GrapheneOS 构建了一套怎样的硬化体系?这是本文要回答的核心问题。

二、Android 存储权限的演进:从“开放”到“零信任”

2.1 Android 10-16:Scoped Storage 的渐进式收紧

要理解 Android 17 的变更,必须先回顾 Scoped Storage 的演进脉络。

根据 Android Open Source Project 官方文档,Scoped Storage 的目标是“保护应用和用户数据的隐私”,包括保护用户信息(如照片元数据)、防止应用在未经明确许可的情况下修改或删除用户文件,以及保护下载到 Download 或其他文件夹中的敏感用户文档。

在 Scoped Storage 模型下,应用对外部存储的访问被严格分层:

访问级别 权限要求 可访问范围
应用自有文件 无需权限 仅自己的 getExternalFilesDir() 等目录
媒体文件读取 READ_EXTERNAL_STORAGE 其他应用创建的媒体文件(照片、音频、视频)
媒体文件写入/删除 用户直接授权或 MANAGE_MEDIA 其他应用创建的媒体文件
所有文件访问 MANAGE_EXTERNAL_STORAGE(特殊权限) 共享存储的任意目录

Android 11 还引入了 FUSE(Filesystem in Userspace)机制,使 MediaProvider 模块能够在用户空间检查文件操作,并根据策略允许、拒绝或修订访问。这意味着即使应用使用直接文件路径访问(如 File API 和 NDK API),也能受到 Scoped Storage 规则的限制。

但 FUSE 也带来了性能代价。根据 AOSP 文档中的测试数据,在调优后的 Pixel 2 上使用 FUSE 与使用 Media Store 相比,顺序读取性能(如视频播放)相当,但顺序写入略差,随机读取和写入可能慢至两倍

2.2 Android 17:例外终结与“零例外”时代

Android 17 将 Scoped Storage 推向了“零例外”的终点。

根据 Android 17 QPR1 Beta 2 的开发者文档,以下几类此前仍被允许的例外场景已被正式弃用并设定硬性移除时间线:

  1. 照片选择器绕过:此前通过 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 权限直接访问媒体文件的方式,将被系统照片选择器或过滤后的 MediaStore API 取代。targetSdkVersion 为 36(Android 17)的应用如果绕过系统照片选择器,将在 Play Store 审核中收到标记

  2. 遗留存储模式彻底关闭:targetSdkVersion 低于 30(Android 11)的应用曾经可以请求“遗留存储模式”来绕过 Scoped Storage。在 Android 17 中,这一退路已被彻底切断。

  3. Android/data 和 Android/obb 目录访问限制:这两个目录在 Android 11 中已通过 FUSE 旁路优化了性能,但 Android 17 进一步收紧了对其的访问控制。

Android 17 在“零信任”架构上迈出了决定性的一步。它不仅限制了存储访问,还引入了硬件级内存限制机制——系统设定了设备专属的内存基线,通过异常检测服务主动监控运行中的应用,超限应用将被系统强制终止。

三、GrapheneOS 的存储硬化体系:超越 AOSP 的三层架构

GrapheneOS 是一个基于 AOSP 的隐私与安全导向移动操作系统,专为 Google Pixel 设备定制。根据其官方发布说明,GrapheneOS 已于 2026 年 6 月完成对 Android 17 的初始移植,当前版本基于 Android 16 QPR2/QPR3,正准备公开发布 Android 17 版本。

GrapheneOS 对存储安全的强化不是简单的“打补丁”,而是构建了一套从硬件到应用层的三层纵深防御体系

3.1 第一层:硬件级内存隔离——hardened_malloc + MTE

GrapheneOS 的第一道防线不在存储层,而在内存层。

根据 GrapheneOS 的工程实现文档,项目通过 hardened_malloc 内存分配器ARM 内存标记扩展(MTE) 硬件特性的深度整合,实现了真正的零信任内存隔离。

hardened_malloc 是一个经过安全强化的内存分配器,专门针对堆溢出、释放后使用(Use-After-Free)等常见内存 corruption 漏洞进行防御。而 ARM MTE 则是硬件级别的内存安全机制,能够在 CPU 指令层面检测内存访问违规。

在 GrapheneOS 的架构中,MTE 保护 slab 分配,hardened_malloc 负责隔离策略,两者协同工作。这种硬件与软件融合的防御体系,使得即使攻击者能够突破 Scoped Storage 的应用层限制,也难以在内存层面实现提权或代码执行。

GrapheneOS 还持续测试 CONFIG_SEAL_METADATA 等内核安全配置,进一步加固内存管理元数据的保护。

3.2 第二层:存储作用域(Storage Scopes)——比 AOSP 更细的粒度控制

如果说硬件内存隔离是“纵深防御”的底层基石,那么 Storage Scopes 就是 GrapheneOS 在存储权限管理上的核心创新。

根据 GrapheneOS 官方使用指南,Storage Scopes 是“标准 Android 存储权限的完全兼容替代方案”。其核心机制如下:

  • 启用条件:Storage Scopes 只能在应用没有任何存储权限的情况下启用。
  • 工作机制:启用 Storage Scopes 后,应用会“认为”自己拥有其请求的所有存储权限,但实际上并未获得这些权限。
  • 透明兼容:应用在运行时检查权限时会得到“已授权”的返回值,但实际的存储访问被限制在 GrapheneOS 定义的范围内。

这意味着什么?应用以为自己拿到了全部存储权限,但实际上只能访问 GrapheneOS 允许它访问的那一小块空间。 这是一种“权限欺骗”技术——不是简单地拒绝权限(那样会导致应用崩溃),而是给应用一个“虚拟权限”,同时在底层对实际访问进行细粒度控制。

根据 GrapheneOS 官方社交账号 2026 年 4 月的说明,Storage Scopes 是 GrapheneOS 为媒体和存储权限提供的类似功能,类似的 Camera、Microphone 和 Location 作用域功能也正在开发中。这标志着 GrapheneOS 正在将“作用域”模式扩展到所有敏感权限。

3.3 第三层:SAF 硬化与零信任沙箱

Storage Access Framework(SAF)自 Android 4.4 引入,允许用户通过系统文件选择器授予应用对特定文件或目录的访问权限。在 GrapheneOS 中,SAF 被进一步硬化。

GrapheneOS 的 SAF 硬化包括以下几个维度:

1. 零信任 IPC 边界

GrapheneOS 在进程间通信(IPC)边界实施了严格的零信任策略。这意味着即使一个应用通过 SAF 获得了某个文件的访问 URI,它在跨进程传递这个 URI 时也会受到额外的权限校验。这防止了“权限漂流”——即一个应用将获得的 SAF 权限无意或恶意地传递给另一个应用。

2. USB 与外设访问控制

根据 GrapheneOS 与摩托罗拉的合作公告,GrapheneOS 默认禁止访问关键硬件标识符(如 IMEI、MAC 地址、SIM 卡序列号),并允许用户选择性控制每个应用对网络操作、传感器、通讯录和外设(USB、相机)的访问。

3. 锁屏登出与存储密钥重置

GrapheneOS 的一个独特功能是锁屏上的“登出”按钮。按下此按钮会重置解密密钥并禁用对存储的访问。这意味着即使设备被物理夺取,攻击者也无法在不输入正确凭证的情况下访问存储数据。

3.4 小结:三层架构如何协同工作

层级 技术组件 防护目标
第一层(硬件/内存) hardened_malloc + ARM MTE 防止内存 corruption 导致的权限提升
第二层(权限/作用域) Storage Scopes 细粒度控制应用存储访问,实现“权限欺骗”
第三层(框架/沙箱) SAF 硬化 + 零信任 IPC + USB 控制 防止权限漂流、物理攻击和跨进程泄露

这三层并非独立运作,而是形成了纵深防御的链条:即使攻击者突破了 SAF 的应用层限制(第三层),仍然需要面对 Storage Scopes 的权限限制(第二层);即使突破了 Storage Scopes,仍然需要攻克 hardened_malloc 和 MTE 的内存防护(第一层)。

四、安全风险:SAF 的已知漏洞与 GrapheneOS 的应对

4.1 SAF 的历史漏洞

Storage Access Framework 并非没有安全缺陷。根据阿里云漏洞库的记录,存在本地攻击者可以利用漏洞绕过 SAF 的权限限制,在无需用户交互的情况下实现本地权限提升(EoP),获取非法的文件写入权限的案例。

一个广为人知的漏洞涉及 Android/data 目录的零宽度字符绕过。自 Android 14 起,出现了一个利用零宽度字符(\u200b)绕过 /sdcard/Android/data 目录访问限制的漏洞。其原理是该字符在系统路径校验时被过滤,从而构造出合规的别名路径,使应用在未获授权时也能读取或写入该目录。根据 2026 年 2 月的分析,该漏洞在 Android 16 上依然有效

此外,还存在专门利用 SAF 漏洞的应用,如 SAFTest,它利用 Storage Access Framework 的漏洞在 <Internal Storage>/Android/data<Internal Storage>/Android/obb 中创建文件。

4.2 GrapheneOS 的漏洞响应

GrapheneOS 对这些 SAF 漏洞的响应速度值得关注。

根据 GrapheneOS 官方论坛 2026 年 1 月的讨论,Android/data 目录访问限制在非 GrapheneOS 的 Android 系统上仍然存在漏洞,而在 GrapheneOS 上已被修复。具体来说:

“自版本 2025060100 起,GrapheneOS 已修复 CVE-2024-50089”。

论坛用户指出:“在非 GrapheneOS 的 Android 上,授予‘所有文件访问’权限后仍然可以访问该文件夹,这仍然是一个 bug。”

这意味着,当主流 Android 系统还在等待谷歌的官方补丁时,GrapheneOS 已经通过自己的硬化措施修复了 SAF 的已知漏洞。

4.3 Android 17 中的 SAF 改进

Android 17 本身也对 SAF 进行了改进。根据发布说明,Android 17 引入了证书透明度(Certificate Transparency)机制,进一步提升应用签名安全性。虽然这主要针对应用签名而非存储访问,但它反映了谷歌在整个安全栈上收紧的趋势。

五、竞品对比:GrapheneOS vs. 主流移动操作系统

为了更清晰地理解 GrapheneOS 在存储安全上的定位,我们将其与主流移动操作系统进行对比。

根据 2026 年 3 月的一份移动操作系统安全对比报告:

维度 标准 Android GrapheneOS iOS
Scoped Storage 实现 AOSP 标准实现 AOSP 标准 + Storage Scopes 增强 沙箱模型(不同架构)
SAF 硬化 依赖谷歌安全补丁 主动修复 + 零信任 IPC N/A(不使用 SAF)
存储权限细粒度 粗粒度(READ/WRITE/MANAGE) 细粒度(Storage Scopes 虚拟权限) 细粒度(每次授权)
内存隔离 标准 malloc hardened_malloc + MTE 硬件级内存安全
USB/外设控制 有限 逐应用精细控制 有限
锁屏登出清密钥 不支持 支持 不支持

GrapheneOS 提供了最强的安全功能,包括 PIN 扰乱、胁迫 PIN/密码等独有功能。但代价是便利性的权衡——iOS 和标准 Android 提供了更多便利功能,但牺牲了部分隐私和安全增强。

六、开发者实战:如何适配 Android 17 的存储权限变更

6.1 迁移清单

基于 Android 17 的变更,开发者需要完成以下迁移工作:

1. 检查 targetSdkVersion

确保应用 targetSdkVersion 已升级到 36(Android 17)。如果仍然低于 30,将无法在 Android 17 设备上正常运行。

2. 迁移到系统照片选择器

如果你的应用目前使用 READ_MEDIA_IMAGESREAD_MEDIA_VIDEO 权限直接读取媒体文件,需要迁移到系统照片选择器或 MediaStore API 的过滤访问模式。

3. 使用 SAF 处理非媒体文件

对于非媒体文件(如文档、PDF、下载文件),必须通过 Storage Access Framework 的 ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT 让用户选择文件。

4. 移除对 Android/data 的直接访问

任何直接访问 /sdcard/Android/data/sdcard/Android/obb 的代码都需要重构。即使应用拥有 MANAGE_EXTERNAL_STORAGE 权限,Android 17 也已收紧对这些目录的访问。

6.2 代码示例:SAF 文件选择器

以下是一个标准的 SAF 文件选择器实现(适用于 Android 17):

// 打开文档选择器
fun openDocumentPicker() {
    val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
        addCategory(Intent.CATEGORY_OPENABLE)
        type = "*/*"  // 所有文件类型
        putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "text/plain"))
    }
    startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT)
}

// 处理选择结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == REQUEST_CODE_OPEN_DOCUMENT && resultCode == Activity.RESULT_OK) {
        data?.data?.let { uri ->
            // 使用 ContentResolver 读取文件
            contentResolver.openInputStream(uri)?.use { inputStream ->
                // 处理文件内容
            }
            // 注意:此 URI 可能包含访问权限,需要妥善管理
            contentResolver.takePersistableUriPermission(
                uri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION
            )
        }
    }
}

6.3 GrapheneOS 上的测试建议

如果你希望在 GrapheneOS 环境下测试应用的存储行为,需要注意:

  1. Storage Scopes 的干扰:在 GrapheneOS 上,即使用户没有授予任何存储权限,应用仍可能“认为”自己拥有权限。测试时应在 GrapheneOS 设备上实际验证存储访问行为。
  2. SAF 权限持久化:GrapheneOS 对 SAF URI 权限的持久化有更严格的限制,测试时应验证 takePersistableUriPermission 是否按预期工作。
  3. Android/data 访问:在 GrapheneOS 上,即使通过 SAF 也无法访问其他应用的 Android/data 目录。

七、趋势判断与结语

7.1 Android 存储权限的未来走向

从 Android 10 到 Android 17,Scoped Storage 的演进轨迹清晰可辨:每一年都在收紧,每一年都在消除例外,每一年都在向“零信任”靠拢。

Android 17 的“零例外”政策标志着这一演进进入了新阶段。到 2027 年,我们可以预见:

  1. MANAGE_EXTERNAL_STORAGE 权限的进一步限制:目前这仍然是“所有文件访问”的通道,但 Android 17 已经对其进行了收紧。未来可能要求用户每次授权时明确选择目录范围。
  2. SAF 的强制化:所有非媒体文件的访问最终都将通过 SAF,直接文件路径访问将彻底消失。
  3. 硬件级内存限制与存储权限的联动:Android 17 已经引入了硬件级内存限制,未来可能将存储访问权限与内存使用配额挂钩——超出配额的应用将同时失去存储访问能力。

7.2 GrapheneOS 的启示

GrapheneOS 的 Storage Scopes 提供了一种超越 AOSP 权限模型的可能性。它不是简单地“更严格”,而是通过“权限欺骗”实现了兼容性与安全性的统一

这一思路值得所有 Android 安全增强方案借鉴:与其简单地拒绝权限(导致应用崩溃),不如给应用一个“虚拟权限”,在底层进行实际控制。这种方法既保证了应用的正常运行,又实现了真正的隐私保护。

GrapheneOS 的硬件级内存隔离(hardened_malloc + MTE)则提醒我们:存储安全不能孤立地看。存储访问控制、内存安全、IPC 边界、硬件加密——这些环节必须协同工作,才能构建真正的纵深防御。

7.3 给开发者和企业的建议

对于应用开发者:

  1. 立即行动:Android 17 的适配截止日期是 2026 年 7 月 1 日,现在就是迁移的最佳时机。
  2. 拥抱 SAF:不要再试图绕过 Scoped Storage。SAF 不是障碍,而是标准。
  3. 关注 GrapheneOS:即使你的应用不直接支持 GrapheneOS,理解其 Storage Scopes 的实现方式可以帮助你设计更健壮的存储访问逻辑。

对于企业 IT 和安全团队:

  1. 评估 GrapheneOS 作为高安全场景的选择:对于处理敏感数据的企业用户、记者、安全研究人员,GrapheneOS 提供的存储硬化可能是值得的。
  2. 关注供应链安全:金标联盟的强制适配要求意味着,如果你的应用通过中国应用商店分发,Android 17 适配是强制性的。

Android 17 不是终点,而是新的起点。 当 Scoped Storage 的所有例外都被消除,当 SAF 成为唯一的文件访问通道,当硬件级内存隔离与存储权限控制开始融合——我们正在见证 Android 存储安全架构的终极形态的成型。

而 GrapheneOS,这个始终走在 AOSP 前面的安全操作系统,正在为我们展示这条路的尽头是什么样子。


参考资料:Android Open Source Project 官方文档、GrapheneOS 官方发布说明与使用指南、Android 17 稳定版发布公告、Android 17 QPR1 Beta 2 开发者文档、金标联盟 Android 17 适配公告等。所有信息均来自 2026 年 3 月至 6 月的公开技术资讯。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐