Android 更新至 2025 年的数据表明,内存安全漏洞首次降至漏洞总数的 20% 以下,这与 Rust 在平台新增和活跃部分中的使用扩展同步发生。根据 Google Security Blog 于 2025 年 11 月 12 日发布的分析,从 C 和 C++ 转向 Rust 的影响不仅限于降低安全风险,还包括加快代码审查和改善变更稳定性。
这些数据基于 Android 代码中的变更,无论相关代码是由 Google 直接开发,还是属于第三方的开源代码,涵盖 C、C++、Java、Kotlin 和 Rust。由于该分析发表于 2025 年结束前几个月,Google 说明,标准的 90 天修复窗口使结果非常接近最终数字,同时在必要时也可以加快修复速度。
更高的安全性与更快的交付
Google 将 Rust 引入 Android,作为低级编程中 C 和 C++ 的直接替代方案,在保留相近控制能力和可预测性的同时,大幅降低与内存安全相关的风险。分析指出,Rust 新增代码量急剧上升,而新增 C++ 代码则持续但较缓慢地减少,直到新加入的 Rust 代码量接近 C++,从而能够更可靠地比较两种开发路径。
Google 使用 DORA 框架衡量生产力和稳定性两个方面。为减少不同语言之间的比较困难,该公司重点分析规模相近的变更和由相似开发者群体完成的工作,这些开发者均参与 Android 平台开发;同时,Google 还在 Rust 采用率上升的过程中持续跟踪趋势。
规模相近的 Rust 变更所需的审查次数比 C++ 同类变更少约 20%。目前,其代码审查所耗时间也少约 25%。Google 推测但不确定地认为,2023 年至 2024 年间的明显改善,可能源于 Android 团队对 Rust 的经验增加。
在稳定性方面,中型和大型 Rust 变更的回退率比 C++ 变更低约四倍。Google 强调,回退操作减少不仅反映变更质量,也会提高生产力,因为回退可能导致返工、额外审查、重新构建、事后事故报告以及其他团队受到干扰。
Rust 扩展到系统服务和库之外
Google 表示,Rust 已经足够成熟,可用于构建 Android 系统服务和库,因此该公司正努力将其使用扩展到生态系统的其他层:
- 内核:Android 专用的 Linux 6.12 内核是 Google 首个启用 Rust 支持的内核,也包含首个生产级 Rust 驱动程序。Google 继续与 Arm 和 Collabora 合作,开发一个在内核模式下运行的图形处理器驱动程序。
- 固件:Google 认为,高权限、性能限制以及部分防护措施的局限性,使固件具有较高风险且难以保护。该公司表示,自己使用 Rust 开发固件已有多年,并向社区提供培训课程和代码,尤其重视与 Arm 在 Rusted Firmware-A 项目中的合作。
- Google 应用:Nearby Presence 协议用于通过 Bluetooth 安全且私密地发现本地设备,目前在 Google Play Services 中使用 Rust 实现。面向 RCS 的安全消息协议 MLS 也将在未来版本中集成到 Google Messages 应用内。
- Chromium:PNG 和 JSON 解析器以及 Web 字体已被采用 Rust 编写的内存安全实现所替代,这使 Chromium 工程师更容易处理来自 Web 的数据,同时遵循 Rule of 2。
险些到达用户手中的漏洞
尽管重点介绍 Rust 的优势,Google 仍讲述了一起险些成为 Android 中首个基于 Rust 的内存安全漏洞的事件。在 CrabbyAVIF 到达公开版本之前,发现了一个线性缓冲区容量溢出问题;该修复被赋予 CVE-2025-48530 标识,以确保其获得高优先级,并跟踪其通过发布渠道到达用户的情况。
分析显示,Scudo Hardened Allocator 内存分配器借助围绕次级分配的保护页,使漏洞无法被确定性地利用。Scudo 还将溢出从静默的内存损坏转变为明显的崩溃,从而帮助发现问题。另一方面,该事件暴露出崩溃报告系统的不足:系统没有明确说明崩溃源于溢出,导致分类和响应速度变慢。Google 表示,这一不足已经得到修复,系统现在会在发生溢出并触及 Scudo 保护页时提供明确信号。
为什么 Rust 即使存在 unsafe 仍然重要?
Google 认为,无论是在 C、C++ 还是 Rust 中,禁止不安全代码都不是操作系统开发的实际解决方案,因为开发过程中需要处理应用程序编程接口和硬件。因此,该公司正在 Comprehensive Rust 培训中开发一个围绕不安全代码的高级模块,用于教导开发者如何评估此类代码的安全性和未定义行为,使用安全注释,并将不安全部分封装在安全抽象之中。
基于 Android 平台约五百万行 Rust 代码,以及一个在发布前得到处理的潜在案例,Google 估计 Rust 的内存安全漏洞密度约为每百万行代码 0.2 个漏洞。该公司将其与 C 和 C++ 中每百万行代码约 1,000 个漏洞的历史密度进行比较,表示按照其估算,这意味着漏洞减少了 1000 多倍。Google 还指出,约 4% 的代码位于 unsafe{} 块中,但表示,假定每一行不安全代码都面临与 C 或 C++ 相同的风险,会高估风险,因为 Rust 的大多数检查仍然有效,不安全代码可以被封装,并且还会接受额外审计。
Google 总结认为,采用 Rust 改变了传统的等式:传统上,安全性提升往往与性能、流程或功能发布速度方面的额外成本相关。在 C 和 C++ 仍然重要,以及软件和硬件防护机制仍属于纵深防御的一部分的情况下,该公司认为,转向 Rust 同时提供了更安全、更高效的路径,而不是先加速发展、再在之后处理后果。