谷歌改善 Chrome 内存安全:通过 heap scanning 算法减少 C++ 代码库安全漏洞

简介: 谷歌改善 Chrome 内存安全:通过 heap scanning 算法减少 C++ 代码库安全漏洞

据外媒报道,谷歌 Chrome 团队正在研究通过 heap scanning 技术来提高 C++ 代码库内存安全。据悉,该技术会对内存造成消耗,除非使用较新的 Arm 硬件。

image.png

众所周知,谷歌、微软是快速编程语言 C++ 的主要用户和贡献者,C++ 主要被用于 Chromium、Windows 内核和 Android 等项目。但由于其内存安全保证问题,人们开始对使用 Rust 语言越来越感兴趣。

尽管存在安全漏洞隐患,但谷歌不能简单地用内存更安全的 Rust 来替换掉 Chromium 现有的 C++ 代码,起码在短期内,将 Chrome 中的 C++ 大规模转换到 Rust 是不可能的。

好在,谷歌正在研究通过 heap scanning 算法来提高 C++ 的内存安全性。当然,这种方式也有个问题,由于这种技术非常消耗内存,因此目前只是实验性的。

image.png

谷歌 Chrome 安全团队的 Anton Bikineev、Michael Lippautz 和 Hannes Payer 表示,尽管大家认为 C++ 之外的其他语言或有着更强的内存安全保证,但在可预见的未来,Chrome 等大型代码库将依旧会使用 C++。

考虑到这种情况,Chrome 工程师已经找到了让 C++ 更安全的方法,如缓冲区溢出和 use-after free(UAF),以减少与内存相关的安全漏洞(这些漏洞占所有软件安全漏洞的 70%)。

当然,C++ 不能保证总是使用其结构的最新信息访问内存,因此谷歌 Chrome 团队一直在探索使用“内存隔离”(memory quarantine)和 heap scanning 来阻止对仍可访问内存的重复使用。

“内存隔离”(memory quarantine)和 heap scanning 的工作原理是,通过隔离和堆扫描确保内存时间安全,以证明不再有(悬空的)指针引用内存之前,避免重复使用内存。为了避免更改 C++ 用户代码或其语义,会截取提供 new 和 delete 的内存分配器。

谷歌表示,调用 delete 时,内存实际上处于隔离状态,无法被应用程序重新用于后续的新调用。在某个时候会触发堆扫描,它像垃圾收集器一样扫描整个堆,以查找对隔离内存块的引用。没有来自常规应用程序内存的传入引用的块会被传输回分配器,在那里它们可以重新用于后续的分配。

由于 UAF 构成了影响浏览器的大多数高严重性问题,近日 Chrome 102 就刚刚修复了一个关键的 UAF,在 8 个高危漏洞里面有 6 个是 UAF。

所谓 heap scanning 内存中的 UAF 访问,是由“悬空指针”(dangling pointers)引起的,即当应用程序使用的内存返回到底层系统,但指针指向过期对象时,就会发生悬空指针。通过悬空指针进行访问会导致 UAF,这在大型代码库中很难发现。

为了检测 UAF,Google 已经使用了如 MiraclePtr 这类 C++ “智能指针”,这也会对性能造成影响,还使用了编译器、C++ 清理器、代码模糊器及一款名为 Oilpan 的垃圾收集器的静态分析。

如果 heap scanning 突破实验阶段,谷歌后期可能会增加该算法项目投入,但能否采用将取决于使用最新 Arm 硬件的设备。

报道称,谷歌已经尝试通过 ARM v8.5A 中的相对内存标记扩展(MTE)进行硬件辅助内存标记,以减少性能消耗。通过用 MTE 基准测试的实验结果显示,内存消耗显著降低。尽管如此,接下来 MTE 会否被更广泛地采用,以不会产生不可接受的性能影响的方式进行堆扫描,这仍然是未来的事情。

Chrome 安全团队表示“C++ 允许编写高性能应用程序,但这需要付出安全性的代价。硬件内存标记可能会修复 C++ 的一些安全漏洞,同时仍然允许高性能。”“我们期待着看到硬件内存标签在未来得到更广泛的采用,并建议在硬件内存标签上使用heap scanning(堆扫描)”。

参考链接:https://www.zdnet.com/article...'t%20just%20rip%20and%20replace%20Chromium's%20existing,expensive%20on%20memory%20and%20for%20now%20only%20experimental.

相关文章
|
6天前
|
存储 C语言 C++
C++:C/C++内存管理
C++:C/C++内存管理
20 0
|
7天前
|
Rust 安全 程序员
Rust与C++:内存管理与安全性的比较
本文将对Rust和C++两种编程语言在内存管理和安全性方面进行深入比较。我们将探讨Rust如何通过其独特的所有权系统和生命周期管理来消除内存泄漏和悬挂指针等常见问题,并对比C++在这方面的挑战。此外,我们还将讨论Rust的类型系统和编译器如何在编译时捕获许多常见的运行时错误,从而提高代码的安全性。
|
17天前
|
Rust 安全 编译器
Rust中的生命周期与借用检查器:内存安全的守护神
本文深入探讨了Rust编程语言中生命周期与借用检查器的概念及其工作原理。Rust通过这些机制,在编译时确保了内存安全,避免了数据竞争和悬挂指针等常见问题。我们将详细解释生命周期如何管理数据的存活期,以及借用检查器如何确保数据的独占或共享访问,从而在不牺牲性能的前提下,为开发者提供了强大的内存安全保障。
|
1月前
|
存储 编译器 程序员
【C++入门到精通】C++入门 —— 内存管理(new函数的讲解)
一、C/C++内存分布 1. 栈(Stack) 2. 堆(Heap) 3. 全局区/静态区(Global Area/Static Area) 4. 常量区(Constant Area) 5.
73 0
|
1天前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
|
1天前
|
程序员 编译器 C++
C++核心编程一:内存分区模型(持续更新)
C++核心编程一:内存分区模型(持续更新)
|
10天前
|
Rust 安全 开发者
Rust的安全特性概览:守护内存安全与空指针的终结者
Rust作为一种系统级编程语言,以其独特的内存安全特性和对空指针的严格管理,为开发者提供了更加稳健和安全的编程环境。本文将对Rust的内存安全机制、空指针处理策略以及其他安全特性进行概览,旨在展示Rust如何帮助开发者构建更加安全和可靠的软件系统。
|
21天前
|
安全 C++ 开发者
c++动态内存管理(二)
c++动态内存管理(二)
73 0
|
21天前
|
存储 安全 算法
c++动态内存管理(一)
C++ 动态内存管理 在 C++ 中,动态内存管理是一个核心概念,它允许在运行时分配和释放内存。以下是 C++ 动态内存管理需要掌握的关键知识点:
93 0
|
22天前
|
缓存 Java
8 种 Java 内存溢出之一:Java Heap Space
8 种 Java 内存溢出之一:Java Heap Space