Android 内存安全漏洞大幅下降,Rust 或成关键因素
过去十年,内存漏洞占整个产业漏洞的 65%,但 Google 发现从 2019 年到 2022 年,Android 的内存漏洞年度总数,从 223 个下降到了 85 个,而有这项安全性进展,Google 归因于 Android 的内存安全程序代码比例增加。
Google 的 Jeffrey Vander Stoep 表示,虽然相关性不能代表因果性,但内存安全漏洞的减少与采用 Rust 语言有关。
自 2019 年开始,谷歌一直采用 Rust 编程语言集成到 Android 操作系统中。事实证明,漏洞确实减少了。
Android 内存安全漏洞大幅减少
Google 过去持续投资工具提高 C/C++ 程序代码的安全性,之前几个版本,Google 在 Android 设备上引入 Scudo 强化分配器、HWASAN、GWP-ASAN 以及 KFENCE,同时增加现有程序代码库模糊测试的覆盖率,运用这些工具发现更多 C/C++ 程序代码漏洞,并减少未来新程序代码所包含的漏洞。
但即便 Google 在 C/C++ 程序代码上做了这些努力,但他们认为这仍无法解释 Android 漏洞巨幅减少的变化,而 Google 在审视开发策略后,认为 Android 从内存不安全语言持续转移到内存安全语言,是这个现象的主要原因。
Rust 成关键因素
从 Android 12 开始,Google 就在 Android 支持 Rust 程序语言,作为 C/C++ 内存安全替代方案,而从那时起,Google 也持续扩展 Android 开源项目(AOSP)中的 Rust 体验和使用。Google 表示,他们的目标并不是把现有的 C/C++ 程序代码都转换成为 Rust,而是在新的程序代码使用内存安全语言开发。
在 Android 13 中,大约 21% 的新原生码都是以 Rust 开发,在 AOSP 中已经有大约 150 万行的 Rust 程序代码,涵盖各种功能和组件,包括 Keystore2、UWB堆栈、DNS-over-HTTP3、Android 虚拟化框架等组件和开源相依项目。这些都是需要系统语言开发的低端组件,如果没有 Rust,Google 就必须使用 C++ 来实例。
到目前为止,在 Android 的 Rust 程序代码中发现的内存漏洞为零,Google 提到,这是一个重要发现,因为过去 Android 漏洞密度大于 1/kLOC,也就是说,每一千行程序代码至少会发现一个漏洞,与历史资料相比,Rust 可能已经阻挡数百个漏洞进入产品环境。
使用 C/C++ 开发的功能不如预想中的运行迅速,Google 提到,使用非内存安全语言,反而需要额外添加安全措施,而这些措施会让程序执行的速度更慢。非内存安全的程序代码通常意味着开发者必须在安全性和性能之间权衡,像是添加沙盒、执行时缓解措施或是硬件保护等,都对程序代码的大小、内存和性能产生负面影响。
Google 提到,在 Android 中使用 Rust,能以更少的妥协优化安全性和系统健康。像是使用新的 UWB 堆栈能够节省数MB的内存,并以现存的程序中执行避免 IPC 延迟,又或是新的 DNS-over-HTTP3 实例,能够以安全的方法,使用更少的线程处理相同的工作量。
要从 C/C++ 移植到 Rust 并不是一件简单的事,Google 持续增加 Rust 在 Android 平台上的使用,为了实现更高的安全性和稳定性等目标,Google 需要在更多原生码中使用 Rust,目前他们正在以 Rust 实例用户空间 HAL,并且已经将 Android 虚拟化框架中的虚拟机固件移植到 Rust,也随着 Linux 6.1 对 Rust 的支持,便能够从核心驱动程序开始,对核心提供内存安全。
虽然 Google 认为 摆脱 C/C++ 是一个挑战,但也正在为安卓系统推进该项目。然而,其并没有在 Chrome 上使用 Rust 语言。
据悉,Rust 是一门系统编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust 在语法上和 C++ 类似,但是设计者想要在保证性能的同时提供更好的内存安全。
参考链接:
https://www.theregister.com/2022/12/02/android_google_rust/
https://www.solidot.org/story?sid=73540
https://security.googleblog.com/2022/12/memory-safe-languages-in-android-13.html