自2019年以来,Android团队一直专注于用内存安全语言编写新功能。对于新的系统级组件,他们一直在使Rust而不是C++,因为Rust具有同样的性能并提供内存安全保证。
他们也一直在使用kotlin而不是java,因为它有null安全等优势。这一策略产生了重大影响,在最近一篇题为“从源头上消除内存安全漏洞”的文章中,谷歌的安全团队透露,Android的内存安全漏洞从总漏洞的76%下降到24%,这是一个惊人的50%以上的下降,这真是太疯狂了。
在这里,我们看到一个图表,显示了在代码库中采用内存安全语言来实现新功能的情况。
图片
多年来,使用内存安全语言编写的代码行数急剧增加,而使用内存不安全语言编写的遗留代码则随着代码库的维护而逐渐减少。这种策略导致内存安全漏洞的急剧减少,谷歌发现这是因为随着代码成熟,内存安全漏洞在新代码或最近更改的代码中被压倒性地发现。
它的安全性呈指数级增长,这是通过采用诸如Rust之类的内存安全语言以及在代码库中使用新特性来实现的。
所以只要采用像Rust这样的内存安全语言,并在代码库中添加新功能,你就能大大减少内存安全漏洞,但这只是理论,当你把这种策略应用到真正的代码库中会发生什么,这正是Android团队所尝试的。
你可以从这张图表中看到,随着Android团队优先使用Rust和kotlin构建新功能,使用内存安全语言编写的代码行数逐年增加。
例如,管理文件共享设备的系统是用Rust编写的,管理加密密钥的新密钥存储系统也是用Rust编写的,一般来说,使用Rust来处理这些底层组件是有意义的,因为Rust是一种系统语言。
请注意,在这段时间内,使用内存不安全语言编写的代码行数也有所增加。但尽管如此,内存安全漏洞的数量也急剧下降,这是因为Android团队一直使用Rust和kotlin编写新功能。
他们也注意到使用Rust的一些关键好处,他们提到Rust更改代码后的回滚率不到C++的一半。这意味着,与更改Rust代码相比,更改C++代码导致bug的可能性是更改Rust代码的两倍。
现在,由于这个计划的成功,谷歌对Rust进行了加倍投资,以使用Rust编写新功能变得更容易,并使在Rust和C++之间以及Rust和kotlin之间的互操作性方面变得更容易。
今年早些时候,谷歌向Rust基金会提供了100万美元的资助,以改善Rust和C++之间的互操作性,并且他们正在积极开发开源工具,如Crubit,这是一种C++和Rust双向中断工具,或者Autocxx,这是一种以自动方式从Rust调用C++代码的工具,这样的工具不仅可以让谷歌使用Rust更容易,也可以让其他公司更轻松的使用Rust。
现在我们知道,在2022年,当Android 13发布时,大约21%的Native代码是用Rust编写的,这相当于向Android项目添加了大约150万行Rust代码。
图片
不幸的是,我们没有2024年的最新统计数据,希望我们很快就能得到它们,总的来说,很高兴看到Rust的采用为谷歌带来了回报以及继续对Rust进行投资的承诺。
谷歌的安全团队证实,大多数同事现在都在以这样或那样的形式使用Rust。其他公司很可能会效仿谷歌的做法,特别是知道只要用Rust等内存安全语言编写新代码,内存安全漏洞就会大大减少。