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

相关文章
|
10天前
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
10天前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
37 15
|
10天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
39 12
|
1天前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
11 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
2月前
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
203 68
|
1月前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
61 19
|
8天前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
54 2
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
1月前
|
存储 算法 安全
基于哈希表的文件共享平台 C++ 算法实现与分析
在数字化时代,文件共享平台不可或缺。本文探讨哈希表在文件共享中的应用,包括原理、优势及C++实现。哈希表通过键值对快速访问文件元数据(如文件名、大小、位置等),查找时间复杂度为O(1),显著提升查找速度和用户体验。代码示例展示了文件上传和搜索功能,实际应用中需解决哈希冲突、动态扩容和线程安全等问题,以优化性能。