共计 1685 个字符,预计需要花费 5 分钟才能阅读完成。
据外媒报道,谷歌 Chrome 团队正在钻研通过 heap scanning 技术来进步 C++ 代码库内存平安。据悉,该技术会对内存造成耗费,除非应用较新的 Arm 硬件。
家喻户晓,谷歌、微软是疾速编程语言 C++ 的次要用户和贡献者,C++ 次要被用于 Chromium、Windows、Linux 内核和 Android 等我的项目。但因为其内存平安保障问题,人们开始对应用 Rust 语言越来越感兴趣。
只管存在安全漏洞隐患,但谷歌不能简略地用内存更平安的 Rust 来替换掉 Chromium 现有的 C++ 代码,起码在短期内,将 Chrome 中的 C++ 大规模转换到 Rust 是不可能的。
好在,谷歌正在钻研通过 heap scanning 算法来进步 C++ 的内存安全性。当然,这种形式也有个问题,因为这种技术十分耗费内存,因而目前只是实验性的。
谷歌 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.