谷歌正寻求提高 C++ 内存安全


谷歌 Chrome 安全团队称其一直在致力于改善 Chrome 浏览器的内存安全;近期,该团队正在研究使用 heap scanning 技术来提高 C++ 的内存安全。

虽然从内存安全方面出发,Rust 当下可能更受大众喜爱。但 Chrome 安全团队认为,尽管人们对比 C++ 具有更强内存安全保证的其他语言有兴趣,但在可预见的未来,像 Chromium 这样的大型代码库将使用 C++。鉴于此,Chrome 工程师已经找到了使 C++ 更安全的方法,以减少缓冲区溢出和 use-after free (UAF) 等与内存相关的安全漏洞。数据表明,这些漏洞占所有软件安全漏洞的 70%。

auto* foo = new Foo();

delete foo;

// The memory location pointed to by foo is not representing

// a Foo object anymore, as the object has been deleted (freed).

foo->Process();

如上示例,当应用程序使用的内存被返回到底层系统,但指针指向一个过期的对象时,就会出现一个被称为悬空指针(dangling pointers)的情况,通过它进行的任何访问都会导致 UAF 访问。在最好的情况下,此类错误会导致 well-defined 的崩溃;在最坏的情况下,它们会造成可以被恶意行为者利用的破坏。 

在较大的代码库中,UAF 通常很难被发现,因为对象的所有权是在不同组件之间转移的。这个问题非常普遍,以至于到目前为止,工业界和学术界都在频繁地针对其提出缓解策略。而 Chrome 中 C++ 的使用也没有什么不同,大多数高严重性安全漏洞都是 UAF 问题。近期发布的 Chrome 102 中,就修复了一个关键的 UAF 问题,且八个高危漏洞中有六个是 UAF。

为了解决这一问题,Chrome 方面已经使用了各种技术手段;包括 C++ 智能指针(如 MiraclePtr)、编译器中的静态分析、动态工具(如 C++ sanitizers )、代码模糊器,以及一个名为  Oilpan 的 C++ 垃圾回收器。Oilpan、MiraclePtr 和基于智能指针的解决方案需要大量采用应用程序代码。

此外,谷歌还探索了另一种方法:内存隔离(memory quarantine)。基本思路是将 explicitly freed memory 放入隔离区,并且仅在达到特定安全条件时才使其可用。Chrome 安全团队在博文中总结了在 Chrome 中实验隔离和 heap scanning 的历程。

工作原理在于,用隔离和 heap scanning 保证 temporal safety 的主要思想是避免重用内存,直到证明没有更多的(悬空的)指针指向它。为了避免改变 C++ 用户代码或其语义,提供 new 和 delete 的内存分配器被拦截。

在调用删除时,内存实际上被放入隔离区,无法再用于应用程序的后续新调用。“在某些时候触发了 heap scan,它扫描整个堆,就像垃圾回收器一样,以查找对隔离内存块的引用。那些没有从常规应用内存中获得引用的块被转移回分配器,在那里它们可以被重新用于后续的分配。”

根据介绍,谷歌的 heap scanning 由一套被命名为 StarScan(简称为 *Scan)的算法组成。他们将 *Scan 应用于渲染器进程的非托管部分,使用 Speedometer2 评估性能影响,并尝试了不同版本的 *Scan。

测试结果表明,*Scan 的一个基础版本造成了 8% 的内存回归。“所有这些开销从何而来?不出所料,heap scanning 极其受 memory bound 影响,因为扫描线程必须遍历和检查整个用户内存的引用”。在进行了多方面优化之后,Speedometer2 回归从 8% 降低到了 2%。此外,有关内存消耗的测量结果则表明,渲染进程中的扫描使内存消耗减少约 12%。

MTE(内存标签扩展,Memory Tagging Extension)是 ARM v8.5A 架构上的一个新扩展,有助于检测软件内存使用中的错误;这些错误可以是 spatial errors(如 out-of-bounds accesses),也可以是 temporal errors(use-after-free)。谷歌方面获得了一些支持 MTE 的 actual hardware,并在渲染器过程中重新进行了实验。结果表明,虽然 MTE 和 memory zeroing 会带来一些成本,但 Speedometer2 中的内存回归约为 2%。实验还表明,在 MTE 之上添加 *Scan 没有可衡量的成本。 

Chrome 安全团队最后总结称,C++ 可以编写出高性能应用程序,但需要付出安全性方面的代价。Hardware memory tagging 可以修复 C++ 的一些安全缺陷,同时保持高性能。“我们期待在未来看到更广泛地采用 Hardware memory tagging,并建议在 Hardware memory tagging 之上使用 *Scan 来修复 C++ 的 temporary memory safety。使用的 MTE 硬件和 *Scan 的实现都是 prototypes,我们预计仍有性能优化的空间。”


相關推薦

2023-01-14

项目中使用来自 C++ 的第三方 Rust 库。目前他们正在积极寻求将可用于生产环境的 Rust 工具链添加到 Chromium 构建系统中,以实现在明年将 Rust 代码引入到 Chrome 二进制文件中。 Google 根据 Chromium 的项目体量和自身需求,暂时只

2023-06-17

路透社援引消息人士报道称,谷歌母公司 Alphabet 正在建议其员工不要将内部机密信息输入人工智能(AI)聊天机器人,包括 ChatGPT 和他们自己的 Bard。同时还提醒其工程师,避免直接使用聊天机器人可以生成的计算机代码。 谷

2022-07-27

谷歌工程师 Chandler Carruth 此前在多伦多举办的 CppNorth 大会上宣布,正式开源谷歌内部打造的编程语言 Carbon,并号称 Carbon 是 C++ 的继任者(目前处于实验性阶段)。此举不可避免的在 C++ 社区中引发了很多讨论,同时也引来了 C++

2023-04-02

NGPTL++ 的发布似乎已经引起了科技巨头们的关注。据悉,谷歌、微软和苹果等公司已经开始研 NGPTL++ 的潜力,并考虑将其应用到未来的项目中。开源PHP(OSCHINA)将持续关注 NGPTL++ 的动态。 项目地址:https://github.com/NGPTLlang-projec/

2024-03-21

C 语言等易受攻击的语言,以减少内存安全漏洞的数量来提高软件安全性。 C++ 之父 Bjarne Stroustrup 在日前与 InfoWorld 的采访中针对白宫的这些言论进行了反驳。“我感到惊讶的是,这些政府文件的作者似乎对当代 C++ 的优势和提

2022-07-26

谷歌工程师 Chandler Carruth 近日在多伦多举办的 CppNorth 大会上宣布,正式开源谷歌内部打造的编程语言:Carbon,并称 Carbon 是 C++ 的继任者(目前处于实验性阶段)。 Chandler 列举了当今流行编程语言演进的一些例子,比如:Java

2022-09-15

了一笔资金,以支持一名专门的安全工程师。Alpha-Omega 由谷歌和微软资助,其使命是直接参与提高 OSS 项目的安全性。“我们正在学习如何把钱变成安全”。

2023-02-03

例也停留在遥远的过去而忽视了改进,其中就包括极大地提高安全性的方法。 现在,如果我认为这些"安全"语言中的任何一种在我关心的使用范围内都比 C++ 优越,我就不会认为 C/C++ 的淡出是一件坏事,但事实并非如此。另

2022-11-13

2006 年到 2018 年 70% 的漏洞是由于内存安全问题造成的;谷歌的 Chrome 在几年内也发现了类似比例的内存安全漏洞。 该组织认为,恶意的网络行为者会利用不良的内存管理问题来访问敏感信息、颁布未经授权的代码执行、以

2023-10-19

(的前两天),相约开源PHP办公室,我们一起聊 AI!>>> 谷歌工程师近日向 Linux 内核提交了一个新补丁,希望为其添加名为 mseal() 的系统调用「mseal() syscall」。 据介绍, 谷歌这个独立于架构的系统调用最初由 Chrome OS 上的

2022-10-21

谷歌宣布将其 Go 应用镜像构建器 ko 作为沙箱项目提交给 CNCF。ko 是谷歌在 2019 年开源的 Go 应用程序的简单、快速和安全的容器镜像构建器,最近还添加了一些新功能,包括多平台支持和自动 SBOM 生成。 就像谷歌

2022-07-29

性,Rust 如今备受青睐,包括已在苹果、亚马逊、微软、谷歌和 Linux 内核开发中被采用。但 The Register 指出,对 Meta 来说,内存安全在短期内可能不如客户安全重要。咨询公司 Everest Group 发布的一份有关“元宇宙中信任和安

2022-09-30

PI、架构支持,以及 ABI 与内核的兼容性问题。 2021 年,谷歌称 AOSP (Android Open Source Project) 现已支持使用 Rust 开发 Android 操作系统(Android 也属于 Linux 发行版)。 2021 年,Linus 再度发表自己对 Linux 内核支持 Rust 的看法,他

2022-11-25

库的开发 C++ 互操作性工作组 —— 孵化语言提案以提高与 C++ 的互操作性 根据介绍,这些新的工作组加入了长期存在的 Swift on Server 和 Diversity 工作组,使感兴趣的用户可以更有针对性的加入专门的工作组来做出贡献。核