谷歌改善 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++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
3天前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
110 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
算法
虚拟内存的页面置换算法有哪些?
【10月更文挑战第25天】不同的页面置换算法各有优缺点,在实际应用中,操作系统会根据不同的应用场景和系统需求选择合适的页面置换算法,或者对算法进行适当的改进和优化,以平衡系统的性能、开销和资源利用率等因素。
69 5
|
2月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
358 9
|
3月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
3月前
|
Web App开发 开发者
|
3月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
795 0
高精度算法(加、减、乘、除,使用c++实现)
|
3月前
|
SQL 存储 Java
关于内存安全问题,你应该了解的几点!
关于内存安全问题,你应该了解的几点!