根据谷歌发布的最新公告:在过去五年的Android 系统版本中,内存安全漏洞的数量大幅下降了68%。这远远低于之前在 Chromium 中发现的 70%,使安卓成为大型项目如何在不破坏向后兼容性的情况下逐步、有条不紊地转向安全领域的绝佳范例。
谷歌表示,实现这一结果的方法是优先使用 Rust 等内存安全语言编写新代码,从而随着时间的推移最大限度地减少新漏洞的引入。与此同时,对旧代码也进行了最小限度的修改,重点放在重要的安全修复上,而不是进行大范围的重写,因为重写也会破坏互操作性。
谷歌在报告中写道:根据我们所了解到的情况,很明显,我们不需要丢弃或重写所有现有的内存不安全代码。相反,Android 正专注于将互操作性的安全和便捷作为我们内存安全之旅的主要能力。
多年来的安卓内存安全,资料来源:谷歌
随着时间的推移,这种策略会使旧代码变得更加成熟和安全,从而减少与内存相关的漏洞数量,无论这些漏洞是用哪种语言编写的。
Android 构建策略中的这两大支柱产生了协同效应,使世界上使用最广泛的移动平台的内存漏洞大幅减少。
谷歌解释说,虽然让旧代码基本保持不变似乎有风险,而且新代码有望得到更好的测试和审查,但事实恰恰相反,尽管这似乎有违直觉。
这是因为最近的代码修改引入了大多数漏洞,因此新代码几乎总是包含安全问题。与此同时,除非开发人员对旧代码进行大量修改,否则旧代码中的漏洞就会被消除。
内存漏洞概率与代码寿命的关系,来源:谷歌
谷歌表示,包括其自身在内,业界在处理内存安全漏洞方面主要经历了以下四个阶段:
- 被动打补丁:最初的重点是在发现漏洞后进行修复。这种方法导致持续的成本,因为需要频繁更新,而用户在此期间仍然容易受到攻击。
- 主动缓解:下一步是实施策略,增加漏洞利用的难度(如堆栈金丝雀、控制流完整性)。然而,这些措施往往需要牺牲性能,并导致与攻击者之间的猫鼠游戏。
- 主动发现漏洞:这一代人使用模糊处理和消毒器等工具主动发现漏洞。这种方法虽然有用,但只能治标,需要持续的关注和努力。
- 高保障预防(安全编码): 最新的方法强调通过使用 Rust 等内存安全语言从源头上预防漏洞。这种 “设计安全 ”方法提供了可扩展的长期保证,打破了被动修复和代价高昂的缓解措施的循环。
谷歌解释称:通过这些方法,整个行业的产品都得到了显著增强,我们将继续致力于应对、缓解和主动查找漏洞。
尽管如此,越来越明显的是,这些方法不仅不足以在内存安全领域达到可接受的风险水平,而且还会给开发人员、用户、企业和产品带来持续且不断增加的成本。
正如包括 CISA 在内的众多政府机构在其 “按设计保证安全 ”报告中所强调的,只有采用按设计保证安全的做法,我们才能打破不断创建和应用修复程序的恶性循环”。
去年 6 月,美国网络安全和基础设施安全局(CISA)警告说,在使用最广泛的开源项目中,有 52% 使用了内存不安全的语言。
即使是用内存安全语言编写的项目,也往往依赖于用内存不安全语言编写的组件,因此安全风险的解决非常复杂。
CISA 建议软件开发人员使用 Rust、Java 和 GO 等内存安全语言编写新代码,并将现有项目,特别是关键组件过渡到这些语言。
参考来源:Google sees 68% drop in Android memory safety flaws over 5 years (bleepingcomputer.com)