Synth Daily

Rust加持Android:提速创新,修复漏洞

在 Android 平台中引入 Rust 语言,不仅显著提升了安全性,同时也加快了软件的交付速度,成功打破了安全与效率之间的传统权衡。数据显示,得益于 Rust 的采用,内存安全漏洞在总漏洞中的占比首次降至 20% 以下,其漏洞密度相比 C/C++ 代码降低了 1000 倍。此外,Rust 还带来了更高的开发效率,代码回滚率降低了 4 倍,审查时间减少了 25%。尽管出现过一次与 Rust 相关的“近失误”漏洞,但通过多层防御策略也得到了有效遏制,证明了该方法的稳健性。

构建更好、更快的软件

我们将 Rust 引入 Android,作为 C/C++ 的直接替代品,它提供了相似的系统控制能力,但规避了许多固有的风险。分析显示,随着 Rust 使用量的急剧上升和新建 C++ 代码的减少,Rust 已成为系统开发的主力之一。

我们使用行业标准的 DORA 框架来评估软件工程团队的绩效,重点关注两个指标:

  • 吞吐量 (Throughput): 衡量交付软件变更的速度。数据显示,Rust 代码的审查时间比 C++ 减少了 25%。这验证了工程师的反馈:Rust 代码更容易审查且正确性更高。

  • 稳定性 (Stability): 衡量变更的质量。对于中大型变更,Rust 代码的回滚率比 C++ 低了约 4 倍。低回滚率不仅意味着代码更稳定,还直接提升了整体开发吞吐量,因为回滚会引发大量额外工作,严重干扰生产力。

谷歌软件工程师在 2022 年的一项调查中表示,他们认为 Rust 代码更容易审查,也更有可能是正确的。回滚率和审查时间的硬数据证实了这些印象。

扩展应用范围

我们正努力将安全代码推广到整个软件栈,Rust 的应用范围已扩展到多个关键领域。

  • 内核: Android 的 6.12 Linux 内核是我们第一个启用 Rust 支持并部署生产级 Rust 驱动程序的版本。更多项目正在进行中,例如与 Arm 和 Collabora 合作开发的基于 Rust 的内核模式 GPU 驱动程序。

  • 固件: 固件因其高权限、性能限制和难以应用通用安全措施的特点,属于高风险领域。我们将固件迁移到 Rust,显著提升了安全性,并已与社区分享了相关教程和代码。

  • 第一方应用: Rust 正在多个安全攸关的谷歌应用中确保内存安全。

    • Nearby Presence: 用于安全发现本地蓝牙设备的协议,已在 Google Play 服务中运行。
    • MLS: 用于安全 RCS 消息传递的协议,将在未来的 Google Messages 应用中发布。
    • Chromium: PNG、JSON 和 Web 字体的解析器已被 Rust 的内存安全实现所取代。

首个 Rust 内存安全漏洞…的险情

我们遇到了一个代号为 CVE-2025-48530 的“近失误”漏洞,它从未进入公开发布版本,但这次事件为我们提供了宝贵的经验。它清晰地展示了纵深防御策略的价值。

Scudo 强化分配器的作用

Android 的 Scudo 强化分配器通过在内存分配周围设置“保护页”,使这个漏洞无法被利用。当溢出发生时,它不会悄无声息地破坏内存,而是会触发一个明确的崩溃。

这次事件凸显了一个事实:即使是内存安全的语言,也需要一个多层次的防御策略来应对意外情况。

Unsafe 代码审查与培训

这次事件也促使我们加强了对 unsafe Rust 代码的审查和培训。我们正在开发一个新的培训模块,旨在教导开发者如何正确理解和使用 unsafe 代码,包括如何通过安全注释和封装来确保其稳健性。

漏洞密度对比

数据显示,与 Android 的 C/C++ 代码相比,Rust 代码在内存安全漏洞密度上实现了超过 1000 倍的降低

一个普遍的担忧是,Rust 代码中约 4% 的 unsafe{} 代码块可能会引入风险。然而,经验证据表明这种担忧被夸大了。即使我们保守地假设一行 unsafe Rust 代码与一行 C/C++ 代码具有相同的漏洞风险,实际的风险也远低于此。原因可能包括:

  • unsafe{} 并未禁用所有安全检查,这是一个常见的误解。
  • unsafe 代码封装在安全的抽象中,使得对安全性的局部推理成为可能。
  • unsafe{} 代码块通常会受到更严格的审查

大幅降低漏洞密度不仅减少了错误的数量,还极大地提升了我们整个安全架构的有效性。

结语

过去那种“快速行动,打破常规”的开发模式常常以牺牲安全为代价。现在,通过采用 Rust,我们证明了可以在修复问题的同时更快地行动。随着代码变得越来越安全,我们或许能够重新获得过去为了安全而牺牲的性能和生产力,同时实现更高的安全性。