上周,谷歌工程师表示,Chrome 代码库中70%的严重漏洞与内存管理和安全有关。
在这70%的漏洞中,一半是释放后使用漏洞,因对内存指针(地址)的管理不正确造成,使攻击者能够攻击 Chrome 的内部组件。这是谷歌工程师分析 Chrome 自2015年稳定版起修复的912个安全漏洞分析得出的结果,这些漏洞的评级为“高危”或“严重”。
而在2019年2月,微软在一次安全会议上分享了类似数据,并表示,在过去12年中,大约70%的微软产品更新解决的是内存安全漏洞问题。
无穷尽的内存管理问题
谷歌和微软处理的本质上是一类问题,即“不安全的”编程语言 C和 C++ 中的问题。
这两种语言都是几十年前创建的老旧编程工具,当时安全利用和网络攻击尚未构成威胁模型,且很多早期软件开发人员并未考虑到这个问题。结果,C和 C++ 使得编程人员能够完全控制管理应用的内存指针(地址),在犯下基本的内存管理错误时不会受到限制或得到警告信息。
这些早期编程错误导致应用程序中引入内存管理漏洞,包括释放后使用、缓冲区溢出、竞争条件、双重释放、通配符指针等等。这些内存管理漏洞是攻击者试图查找并利用的最爱,因为他们能借此获得在设备内存中植入代码的能力并由受害者应用程序(浏览器、服务器、操作系统等)执行。
MITRE 公司在年初发布一份榜单,缓冲区溢出漏洞高居榜首,其它两个内存管理问题(界外读取排名第五,释放后使用排名第七)也位列前十。
近年来软件工程不断发展,开发人员从根本上排除多数安全缺陷的能力以及部署安全防护措施的能力有所增强。
但,在内存管理漏洞方面却是个例外。
谷歌将着手处理
谷歌表示,自2019年3月起,在130个Chrome 漏洞中,其中125个“严重”等级的漏洞和内存损坏问题相关,这表明,虽然在修复其它漏洞类型方面取得进展,但内存管理仍然是个问题。
内存管理漏洞的问题如此巨大,谷歌 Chrome 工程师现在不得不遵守“The Rule of 2”规则。按照规则,工程师编写好 Chrome 新功能后,代码不得违反两个以上的如下条件:
代码处理不可信输入。
代码未在沙箱环境下运行。
代码用不安全的编程语言(C/C++)编写而成。
虽然软件公司之前都试图修复 C和 C++ 的的内存管理问题,但 Mozilla 是其中最为成功的,该公司通过赞助、推广和在火狐浏览器中大力使用 Rust 编程语言而取得突破。
如今,Rust 被视作最安全的编程语言,是 C和C++ 语言的理想替代者,这都要归功于 Mozilla 早期付出的努力。但 Mozilla 并非唯一一家获得突破的公司。微软也在积极探索 C和 C++ 的替代品。从早期的 Checked C 项目开始,微软现在正在试验 Rust 语言,而且也在构建自己的类似 Rust 的“安全”编程语言(Project Verona 秘密项目的一部分)。上周,微软在 Build 虚拟大会上表示,这两个项目都获得成功,未来将致力于采用安全编程语言。
上周,谷歌也宣布推出类似规划。谷歌表示也计划研究“解决Chrome 中的内存不安全问题”。Chrome 是当前最流行的网络浏览器,70%的互联网用户都在使用它。
Chrome 沙箱已达峰值
直到今天,谷歌工程师一直不遗余力地支持在 Chrome 中实现沙箱方法。他们将数十个进程隔离到自己的沙箱中并于近期推出 Site Isolation 功能,将每个站点的资源也融合到自己的沙箱进程中。
然而,谷歌工程师表示,考虑到性能问题,沙箱 Chrome 组件的方法已达到最大收益,因此公司必须探索新方法。谷歌表示未来计划为Chrome 代码库开发定制化 C++ 库,从而更好地防范内存相关问题。
谷歌也在探索 MiraclePtr 项目,旨在“将可利用的释放后使用问题转变为非安全性崩溃问题,具有可接受的性能、内存、二进制大小和最小稳定性影响。”
最后但也同样重要的一点是,谷歌表示计划探索适时使用“安全的”编程语言,比如 Rust、Swift、JavaScript、Kotlin 或 Java。
原文链接
https://www.zdnet.com/article/chrome-70-of-all-security-bugs-are-memory-safety-issues/
声明:本文来自代码卫士,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。