C 和 C 不安全?Android 支持 Rust 开发操作系统

Rust这两年实火了。

近年来,Rust凭借着出色的内存效率、速度与安全性,深受亚马逊、微软、华为、Facebook等科技巨头的青睐。Rust从根本上考虑安全性,提出了“没有数据竞争的并发性”、“没有垃圾收集的内存安全”及最终的“无恐惧的黑客“等概念,反映了Rust独特的学术研究和工业实用性结合价值。除了企业使用Rust语言的场景逐步扩大,操作系统也不例外。
而作为一个完善的移动操作系统,Android系统涉及到很多组件,可以广义地概括为两部分:生态系统及操作系统本身。
作为开发者来说,你开发Android的哪个部分决定了你所选择的编程语言;对于应用开发者来说,Java和Kotlin是比较流行的选择;而对于操作系统及其内部底层的开发者来说,C语言和C 语言是目前更受欢迎的选项。
如今,谷歌为操作系统开发者增加了第3个选择:Rust。因为Android Open Source Project现在支持Rust语言来开发操作系统了。
C和C 有哪些限制?
Android系统的底层需要C和C 这样的系统编程语言,因为这类语言可以为开发者提供控制和可预测性,这在访问底层系统资源和硬件时非常重要。
但问题是,C和C 并不能提供内存安全保证。这样一来使它们很容易出现错误和安全漏洞,开发者需要在复杂和多线程的代码库中管理这些语言的内存寿命,并非一件易事。
C和C 构成了Android平台上数千万行代码,这使得一旦发生内存安全漏洞,就形成最难以解决的代码错误来源,占Android高严重度安全漏洞的70%左右。所以与其事后再解决这些Bug,不如从一开始就预防。
因为缺乏内存安全保障,迫使开发者在严格约束和无权限沙盒内运行Android进程。但使用沙盒是成本很高的,不仅会消耗额外的开销还会引起延迟,并且不能完全消除代码的漏洞,而且由于Bug密度高,沙盒的有效性降低了,这样的情况让攻击者可以将多个漏洞连接起来。
缺乏内存安全保障迫使开发者在严格受限和无特权的沙箱中运行Android进程。但是沙箱在资源上是昂贵的,消耗额外的开销并引入延迟。沙箱也没有完全消除代码的漏洞,而且由于漏洞密度高,沙箱的有效性降低了,进一步允许攻击者将多个漏洞链接起来。
另一方面的限制是,为了检测到错误状态,必须在工具化的代码中实际触发才能被检测到。因此即使你的代码经过了严密的测试,也可能发现不了隐藏的Bug。而等到发现Bug的时候,修复他们又是一个漫长而高成本的过程了,而且还不一定能得到最准确的修复。
这导致Bug的检测变得很不可靠,鉴于这些限制,事前预防Bug是最好的方法。针对这些问题,Rust这样的语言就到了发挥的时候了。
从C和C 转向Rust,对Android意味着什么?

为Android系统增加一种新语言,实际上是一项很艰巨的任务,包括工具链和依赖项需要维护、测试基础设施和工具必须更新、开发人员需要接受培训等。不过在谷歌方面,最近一年多时间里已经一直在大力推广Rust了。
在谷歌看来,想要预防非安全语言编写软件的Bug,现在是内存安全编程语言切入的好时机。因为谷歌已经在其免费OSS-Fuzz服务的375个开源项目里发现了由内存安全错误引起的5500多个漏洞;还发布了Syzkaller来监测操作系统内核中的Bug,并通过gVisor等沙盒来减少Bug检测期间造成的实际影响。
在使用Rust方面,谷歌用Rust将Android中的操作系统模块进行了优化,包括蓝牙和Keystore2.0,Keystore 2.0模块就是用Rust编写的;在底层的项目中使用Rust,如ChromeOS中的crosvm虚拟机监视器和驱动程序;包括curl的HTTP和TLS后端、以及Apache httpd新的TLS库,这些代码库位于Internet的网关,需要保护全球数百万用户的数据,它们的安全性极其重要。所以这些作为相关工作重要起点的代码库,均已开始接受Rust语言改造。
虽然目标已经定下了,但谷歌方面也很明确,真正将Rust扩展到更多的操作系统,需要很多年的时间。
而对于应用开发者来说,这样的切换不会改变其编写应用的方式,也不会改变框架API的工作方式,只是会影响操作系统的编写方式。根据Android开发者团队透露,谷歌目前也没有发布Rust NDK的计划,支持应用程序开发的语言还继续是Kotlin、Java、C和C 。
(0)

相关推荐