内存安全是生死攸关的问题

Lobsters Hottest 新闻

摘要

作者认为,内存不安全的开源软件极易受到即将到来的人工智能漏洞查找代理的攻击,这使内存安全成为道德义务,并且Rust必须作为领先且零开销的内存安全语言取得成功。

<p><a href="https://lobste.rs/s/67tqpz/memory_safety_is_matter_life_death">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/06/02 15:50

# 内存安全关乎生死存亡 来源:https://joshlf.com/posts/memory-safety-life-and-death/ 2018年,沙特记者贾迈勒·卡舒吉的未婚妻手机遭黑客入侵。同年晚些时候,卡舒吉走进伊斯坦布尔的沙特领事馆,准备获取与计划中婚礼相关的文件,两小时后(https://www.boston25news.com/news/national/journalist-jamal-khashoggis-disappearance-a-timeline-of-events/854679184/) 被人从领事馆抬出,装在尸袋里。¹ (https://joshlf.com/posts/memory-safety-life-and-death/#1) 我们很容易忘记,自己的工作影响着真实的人。人们很容易(哪怕只是潜意识地)觉得,编程的*意义*在于数学之美或使用之趣。也很容易忘记,缓冲区溢出不仅仅在抽象层面是个坏东西——有时,它们会真正害死活生生的人。 而情况即将变得*非常非常*糟糕。 在我的日常工作中,我效力于一个安全团队,因此能接触到硬数据,并与谷歌及其他公司的同事在茶水间讨论那些被安全业界称为"漏洞末日"的智能漏洞发现模型。过去几周,我一直被反复问同一个问题:"Mythos (https://www.anthropic.com/glasswing) 真的*那么*糟糕吗?"一言以蔽之:是的。 这篇文章的目的并非论证这一说法,所以我不打算做严肃论证,只留给你一张图表——来自Firefox (https://hacks.mozilla.org/2026/05/behind-the-scenes-hardening-firefox/): Firefox 安全漏洞修复情况(按月统计) 许多因素将决定漏洞发现的长期均衡态² (https://joshlf.com/posts/memory-safety-life-and-death/#2),但这种均衡需要很多年才能达到。无论长期结果如何,中期影响是明确的:内存不安全³ (https://joshlf.com/posts/memory-safety-life-and-death/#3) 的开源⁴ (https://joshlf.com/posts/memory-safety-life-and-death/#4) 软件,尚未准备好迎接高质量漏洞发现代理的广泛可用。预计广泛可用将在今年夏天某个时刻发生⁵ (https://joshlf.com/posts/memory-safety-life-and-death/#5)。届时,用内存不安全语言编写的开源程序,几乎没有能免受灾难性利用攻击的。许多攻击者会用这些漏洞窃取身份、盗取钱财,或实施其他普通网络犯罪。但还有一些人会利用这些漏洞杀人⁶ (https://joshlf.com/posts/memory-safety-life-and-death/#6)。我并非危言耸听:当这些代理变得可用,会有更多人死去。 虽然内存安全语言并非万能灵药,但它们能防止绝大多数这类漏洞(一个典型估计 (https://www.microsoft.com/en-us/msrc/blog/2019/07/a-proactive-approach-to-more-secure-code) 是70%),并且能防止其中影响最严重的漏洞⁷ (https://joshlf.com/posts/memory-safety-life-and-death/#7)。**这使得改用内存安全语言成为一种道德责任。**像Carbon这样的替代方案正在开发中,也存在其他性能特性不同的语言,如Go或Java。然而,当谈到*已在生产环境中使用*、并且*相对于C或C++没有任何开销*⁸ (https://joshlf.com/posts/memory-safety-life-and-death/#8)的内存安全语言时,Rust是唯一的选择。因此,这是一种道德责任:Rust必须成功。 --- 我有幸将Rust社区中的许多人视为最亲密的朋友。我在会议上、在酒桌旁、在Zulip讨论串和Jitsi会议里听过他们的故事。我们因为各种不同的原因来到Rust(尽管通常都涉及某种形式的"极客狙击")。虽然这个社区也经历过所有开源社区都会经历的挣扎,但它始终是一个绝对的狂欢——在我们更好的时刻,我们彼此友善,写出了令人惊叹的软件。套用Scott McNealy的话,我们"大展拳脚、享受乐趣,并永远地改变了计算世界"。 我不明白为什么我们不能余生都继续享受Rust带来的乐趣。但同时,我们必须承认一个残酷的现实:在我们软件触及的数十亿人中,只有极小一部分知道什么是指针。对这些人来说,Rust是否优美或有趣并不重要。但对其中一些人而言,如果Rust不成功,他们会死。 我的父亲和妹妹都是医生,我一直钦佩他们每天上班面对真实的、关乎生死的后果。他们的工作与真实生命之间的联系是直接而即时的。我注意到两个行业之间的一个对比:在于他们如何衡量什么才是重要的。 想象一下,如果你的父母在年度体检中发现一个可疑的肿块,于是去看放射科医生做检查。想象一下,这位放射科医生可以选择一种高精度的成像技术,却偏偏选择了假阴性率很高的一种。你会对这位放射科医生危及你父母生命的行为感到愤怒,而如果放射科医生试图安慰你,说他选择的技术设计更巧妙、用户界面更好、或让他回想起医学院的时光,这丝毫不会让你好受些。放射科医生的工作是治疗你的父母,其他一切都是次要的。 无论我们每个人最初为何加入Rust,无论是什么让我们坚持下来,我们现在肩负着一项大多数人都未曾要求的新责任:人们正依赖我们生存。他们依赖Rust的安全性。但更重要的是,由于Rust已是现存最安全的系统语言,他们依赖Rust的成功。 --- 我写这篇文章,是为了庆祝我们构建了一门如此安全的语言,以至于人们的生命都依赖于项目选择它。我们应当为我们所取得的成就感到*无比*自豪。 但我写这篇文章,也是一声战斗的号角。如今比以往任何时候都更重要:Rust必须成功。在未来的几个月和几年里,我们将需要做出艰难的选择。我们无法满足所有人的所有需求。我们需要优先考虑某些用例而非其他。我们必须将进步和共识本身视为美德。我们必须学会认识到,什么时候拥有*一个*共识比拥有*正确的*共识更重要,并在这些情况下选择进步而非停滞。无论是C++互操作性、可审计性,还是任何其他虽不光彩却能促进Rust采用度的特性,我们都必须捏着鼻子、深入泥潭,把事情做完。 我想继续享受乐趣、深入思考、写出伟大的代码。我不想放弃那些让参与Rust变成一件乐事的东西。 但我也不想让人死去。如果这意味着少一点乐趣、多一点严肃,那么我相信我们的社区有能力迎接挑战。

相似文章

内存安全绝对主义者

Lobsters Hottest

本文批评了编程语言辩论中的内存安全绝对主义,认为像 Fil-C 这样的新方法也有权衡,而将 Rust 视为不安全忽略了实际好处。

内存安全最棘手的问题

matklad

本文讨论了一个基本的内存安全挑战,涉及带标签的联合体,其中指向一个变体的指针在联合体被覆盖为另一个变体后被使用,导致类型混淆。作者还认为,缓冲区溢出是最容易被利用的内存错误,如果采用更好的数组语法本可以缓解。