谷歌正寻求提高 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++

2024-08-06

特别是对于最相关的程序构造。” 过去几年来,包括谷歌和微软在内的科技巨头一直在宣传内存安全漏洞带来的问题,并推广使用 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 在几年内也发现了类似比例的内存安全漏洞。 该组织认为,恶意的网络行为者会利用不良的内存管理问题来访问敏感信息、颁布未经授权的代码执行、以

2022-10-21

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

2023-10-19

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

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 的看法,他