谷歌改善 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.

相关文章
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
65 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
16天前
|
算法
虚拟内存的页面置换算法有哪些?
【10月更文挑战第25天】不同的页面置换算法各有优缺点,在实际应用中,操作系统会根据不同的应用场景和系统需求选择合适的页面置换算法,或者对算法进行适当的改进和优化,以平衡系统的性能、开销和资源利用率等因素。
36 5
|
20天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
134 9
|
24天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
Web App开发 开发者
|
2月前
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
41 1
|
1月前
|
SQL 存储 Java
关于内存安全问题,你应该了解的几点!
关于内存安全问题,你应该了解的几点!
|
2月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
65 11
|
2月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
97 11