谷歌的安卓13大幅度从C/C++迁移到Rust

22-12-02 banq

从Android 12起,谷歌宣布在Android平台中支持Rust编程语言,作为C/C++的内存安全替代语言。
谷歌的目标不是将现有的C/C++转换为Rust,而是随着时间的推移将新代码的开发转移到内存安全的语言。

Android 13 是第一个添加到版本中的大部分新代码都采用内存安全语言的 Android 版本。
Rust 不是Android 中唯一使用的内存安全语言(Java 和 Kotlin 也算在内),但它是一个主要的语言。

在Android 13中,约21%的新原生代码(C/C++/Rust)使用Rust。Android开源项目(AOSP)中总共有大约150万行Rust代码,涉及新的功能和组件,如Keystore 2、新的超宽带(UWB)堆栈、DNS-over-HTTP 3、Android的虚拟化框架(AVF)和各种其他组件及其开源依赖项。这些是需要系统语言的低级组件,否则这些系统语言将以C++实现。

到目前为止,Android的Rust代码中没有发现内存安全漏洞。
我们不希望这个数字永远为零,但考虑到两个Android版本中新Rust代码的数量,以及使用它的安全敏感组件,这是一个重要的结果。它表明Rust正在实现其防止Android最常见漏洞来源的预期目的。在许多Android的C/C++组件(例如媒体、蓝牙、NFC等)中,历史漏洞密度大于1/kLOC(每千行代码1个漏洞)。根据这一历史漏洞密度,使用Rust可能已经阻止了数百个漏洞进入生产环境。

从C/C++迁移是一项挑战,但我们正在取得进展。Rust在Android平台上的使用正在增长,但这并不是故事的结束。为了实现在Android范围内提高安全性、稳定性和质量的目标,我们需要能够在需要本地代码的代码库中的任何地方使用Rust。我们正在Rust中实现用户空间HAL。我们正在添加对受信任应用程序中Rust的支持。我们已将Android虚拟化框架中的虚拟机固件迁移到Rust。随着Linux 6.1对Rust登陆的支持,我们很高兴能将内存安全性引入内核,从内核驱动程序开始。

我们在Java中看到的漏洞类型主要是逻辑错误,如上所述,严重性通常较低。接下来,我们将探索Rust更丰富的类型系统如何帮助防止常见类型的逻辑错误

随着Android从C/C++迁移到Java/Kotlin/Rust,我们预计内存安全漏洞的数量将继续下降。为Android上内存损坏错误罕见的未来干杯!





 

1