过去五年中,Android(安卓)系统的内存安全漏洞比例从2019年的76%大幅下降至2024年的24%,下降幅度超过68%。且Android安全性得到显著改善的同时,并未影响向后兼容性。
谷歌双管齐下治理内存安全
与Chromium系统内存安全漏洞70%的比例相比,Android的表现尤为突出,展示了一个庞大的项目如何在保持系统稳定性的同时,实现安全性提升。谷歌表示,这一成果主要得益于优先使用内存安全语言(如Rust)编写新代码,大大减少了新漏洞的引入。
过去五年安卓内存安全漏洞持续减少
与此同时,谷歌强调对旧代码进行维护时,只做最小的必要修改,专注于重要的安全修复,而非进行大规模重写,避免破坏系统的互操作性。谷歌的报告指出:“我们认识到,无需全部重写现有的非内存安全代码,而是将重点放在确保互操作性的安全和便捷性上。”
这一策略使得旧代码随着时间推移变得更加成熟和安全,无论它最初是用何种语言编写的,内存相关漏洞的数量都会逐渐减少。谷歌采用的两大核心策略产生了协同效应,推动了Android作为全球最广泛使用的移动平台内存漏洞数量的显著下降。
解决内存安全问题的四个阶段
谷歌指出,行业在应对内存安全漏洞方面经历了四个主要阶段:
- 被动修补:最初,行业主要在漏洞发现后进行修复,这种方式虽然解决了问题,但导致频繁的更新,用户在漏洞未修复期间处于危险中。
- 主动缓解措施:随着时间推移,人们采取了多种策略(如堆栈金丝雀、控制流完整性)来增加漏洞利用的难度,但这些措施通常伴随性能的下降,并形成了与攻击者的“猫鼠游戏”。
- 主动发现漏洞:此阶段引入了模糊测试和工具来提前发现漏洞,虽然有效,但这种方法仍然只是治标不治本,且需要持续投入大量资源。
- 高安全保障的预防措施(安全编码):第四阶段强调通过内存安全语言(如Rust)从源头防止漏洞发生,采用“设计即安全”的方法,从根本上减少了漏洞的产生,提供了可扩展的长期保障。
谷歌的实践方法不仅增强了其自身产品的安全性,还为整个行业提供了有益的经验。然而,谷歌也指出,传统的修补和缓解措施带来了不断增加的成本,尤其是在内存安全领域。只有采用安全设计的实践,才能有效终止这一“修补—漏洞”循环。
应对未来的内存安全挑战
尽管谷歌和其他公司已经取得显著进展,但内存安全仍然是行业面临的主要挑战之一。2023年6月,美国网络安全和基础设施安全局(CISA)警告称,52%最广泛使用的开源项目仍在使用非内存安全语言。即便是使用内存安全语言编写的项目,往往也依赖于非内存安全组件,这使得风险更加复杂化。
CISA建议软件开发人员应尽量使用内存安全语言(如Rust、Java和Go)编写新代码,并逐步将现有项目,特别是关键组件,转向这些语言,以提高整体安全性。