Kroah-Hartman称Rust可保护Linux
ZDNET AI··作者 Steven Vaughan-Nichols
关键信息
Kroah-Hartman 指出,漏掉错误检查、忘记加锁以及资源泄漏等问题在内核里很常见,而 Rust 的编译器和锁抽象可以在构建阶段捕捉很多此类错误。他还认为,即使只是借鉴 Rust 的思路,也已经让内核中的 C 代码和接口得到改进。
资讯摘要
在 Rust Week 上,Greg Kroah-Hartman 对听众表示,Rust 将帮助 Linux 处理未受信任的数据,并应对日益增多的安全问题。他说,内核团队最近正面对一波由 AI 漏洞挖掘工具发现的严重问题,包括 Dirty Frag、Copy Fail 和 Fragnesia 等漏洞。按他的说法,相关报告的数量高到惊人,内核安全流程现在大约每天要处理 13 个 CVE。Kroah-Hartman 认为,问题不仅在于新的 AI 工具,也在于 C 语言在错误处理、锁管理和内存管理方面长期存在的弱点。
他举例说,内核里有一个存在了 15 年的蓝牙漏洞,原因是解引用指针前没有检查;还有一个 Xen 漏洞,是因为错误路径上忘记释放锁。 在他看来,这些看似细小的错误长期累积,就会变成安全漏洞。他指出,Rust 的价值在于能把很多这类错误提前到构建阶段发现,而不是等到代码审查时才暴露出来。他还说,Rust 影响下的思路已经推动内核采用更安全的 C 保护机制、作用域锁和更清晰的接口,即使不直接使用 Rust,Linux 也因此变得更好。

资讯正文
ZDNET 的核心要点:Rust 将凭借 C 语言固有的安全弱点拯救 Linux。
面对源源不断、由 AI 发现的安全问题,Linux 可能需要这样的帮助。
展望未来,越来越多的 Linux 代码将会用 Rust 编写。
在荷兰乌得勒支举行的 Rust Week 大会上——这是全球最大的 Rust 语言会议——Linux 稳定内核维护者 Greg Kroah-Hartman 开场便表示:“我来这里是要谈谈不可信数据和 Linux,以及 Rust 将如何拯救我们。”在经历了“内核安全列表上漫长的一两个月”之后,他把这一观点说得更直白:“我要说得更大胆一些——‘你们将拯救 Linux。’抱歉,这全都得靠你们。”
拯救?Linux 需要被拯救吗?他所指的是,近期突然涌现出大量严重的 Linux 安全漏洞,例如 Dirty Frag、Copy Fail 和 Fragnesia,这些漏洞都得益于最新的 AI 漏洞检测程序而被发现。因此,自 2005 年以来“见过内核里每一个安全漏洞”的 Kroah-Hartman 说,内核团队现在“每天会发出 13 个 CVE[Common Vulnerabilities and Exposures,常见漏洞与披露],或者差不多这个数,疯狂得很”。他认为,Rust 是少数几种现实可行的方法之一,能够大幅减少那些源自 C 语言传统错误处理和资源管理陷阱的漏洞类型。
此外:我用过的最友好的 Linux 发行版之一,同时也是最安全的之一。
Kroah-Hartman 用内核里真实存在的 C 语言漏洞来说明这些陷阱,其中包括一个 15 年前的蓝牙漏洞:它在未检查的情况下解引用了一个指针;还有一个 Xen 漏洞,在错误处理路径中“我们忘了解锁”。他解释说:“内核里的大多数漏洞都是这种微小、琐碎的东西。错误条件没有检查,锁忘了释放,未释放的内存泄漏,漏洞随着时间累积。它们会让内核崩溃。这就是我们在 C 语言里所面对的。这就是我们不喜欢它的原因。”
Kroah-Hartman 认为,Rust “最美妙的地方”在于,它会在构建时而不是在代码审查时捕捉到这些错误。例如在锁方面,他强调了 Rust 在内核中的锁抽象:“你能访问结构体内部指针的唯一方式,就是先获取那把锁,并且锁会自动释放。编译器来做这件事,它会保护起来,锁会被获取,一切都很顺利。你就是不能在不获取锁的情况下写代码去访问这些值……编译器不会允许你这么做。”他认为,这些特性会直接消除他所见到的大量漏洞:“这会帮我们解决那两件事。首先,内核里 60% 的漏洞就此没了。谢谢。”
其回报是更早、更自动化的约束执行:“如果这件事发生在构建时,而不是审查时,就别让我这个维护者去读你的代码,然后说,‘哦,你确实正确检查了那个错误值。哦,你在正确的位置正确获取了锁吗?’Rust 免费给了我们这些。这是史上最棒的事。”
Kroah-Hartman 认为,即便 Rust 明天就消失了,它也已经迫使内核去清理 C 代码和接口。
他直截了当地称赞了 Rust 的影响力:“我们是从 Rust 那里‘偷’来的。谢谢。这是个好主意,所以如果明天 Rust 消失了,我们已经把内核里的 C 代码清理得这么多了,也吸收了这些想法。我们感谢你们,光是你们的存在就让 Linux 变得更好了。”
他还谈到了从 Rust 获得启发而引入的新 C“守卫”和作用域锁:“现在我们有了这些,有了 C 的作用域锁和分配器,而且我们加入了这段新代码,这让我们更不容易出错,但最重要的是,它让编码更简单。”在超过 5,000 名开发者而维护者只有大约 700 名的情况下,他说,审阅时间是最稀缺的资源——因此,那些能让正确性一目了然的模式至关重要:“我们的优化目标是让代码更容易审阅……如果我能更轻松地审阅你的代码,我看一眼就能说,‘嘿,看,你显然是对的,因为你用了那个模式。一切都很好,而且 bug 更少。’”
Rust 绑定也在迫使 C 端进行更深入的变更。回忆起一次早期的 Rust-for-Linux 会议时,他说,当他看到“为了处理两行 C 代码却要写几百行 Rust 代码”时,他意识到:“我可以改 C 代码。我们可以修改 C 代码,让 Rust 代码更简单。我们对跨越这道边界的两侧都进行修改没有问题。那就这么干吧。”他现在称赞 Rust-for-Linux 团队重塑了驱动接口:“相关规则,以及 traits 和接口如何在驱动核心中工作,以及它们与内核中 C 代码的交互方式,将会让驱动更容易编写,也更难写错……他们干得非常非常出色。”
除了语言特性之外,Kroah-Hartman 还把 Rust 直接与围绕不可信数据和“所有输入都邪恶”这一理念的更广泛推动联系起来。借用微软安全团队的一句话,他对与会者说:“如果你对我的演讲其他内容都记不住,就只记住这四个词。它来自很多很多年前的微软安全团队。他们意识到,所有输入都是邪恶的。你必须验证所有输入。”他描述了一个正在推进的“不可信”类型包装器,以及 Rust 中的一个 validate 方法,它会在数据从不可信转为可信的那个点强制进行显式验证。“我们有个叫做 untrusted 的东西,把它加到数据上,每次你想真正访问这些数据时,它只是一个类型,它实际上不是代码,它会向编译器发出提示。你必须先经过验证,才能真正访问它。”他表示,这对审阅者的关键好处是“一切都聚焦”在那些转换点上:“在代码的一个部分里,你可以在一个地方看到所有执行验证、把用户空间中的不可信数据转换为可信数据的代码。”
这种模型还会延伸到越来越不可信的硬件:“这个模型和这些内核,我们甚至都不信任硬件。”
硬件本来就充满 bug,但现在你还可以遇到恶意硬件,而且我们看到的恶意硬件越来越多。”他的目标是把这类数据标记为不受信任,并通过类型系统跟踪它,然后把审查精力集中到重点上:“这才是真正能救我们的东西,因为我们不信任数据……我觉得我要把这句话说得有点不那么科学一点。真正能拯救 Linux 的,就是其他所有这些东西加上不受信任的数据。我认为这会消除我们现有 CVE 的 80%,而这可是个巨大、巨大的数字。”
Rust 不是魔法
不过,这并不意味着他认为 Rust 是魔法。并不是这样。他提到了最早并入内核的 Rust 组件之一:在内核崩溃时使用的二维码显示逻辑。“那段逻辑是用 Rust 写的。众所周知,它曾有一个内存 bug。它拿到了一个缓冲区和它的大小,而那段代码的其余部分从未检查缓冲区大小……结果可以把内存到处乱写,因为 Rust 照样会像 C 一样严重崩溃。”因此,Rust“并不是银弹。”
他也并不鼓励任何人把 Linux 内核重写成 Rust。现场有一位与会者问道:“你真的会鼓励把内核里已经存在的东西用 [Rust] 重写吗?” Greg 回答说:“不,我们不想搞重写,所以除非你是那个文件的维护者和拥有者,否则只把它用于新东西。别动现有的 C 代码,让我们在此基础上继续演进。”他以 Binder 为例,它是 Android 的核心进程间通信(IPC)机制,C 和 Rust 实现会在一段时间内并存,以达到功能对等,之后“他们会删掉 C 代码,因为我信任他们,而且他们同时是这两部分代码的所有者和维护者。”
此外:你现在可以在这 7 个发行版上使用 Linux 7.0——以下是你可以期待的内容
随着时间推移,他预计新的硬件支持会明显向 Rust 倾斜:“Rust 会随着时间在内核中不断演进。一些子系统已经表示,‘嘿,图形相关的新驱动只能用 Rust 写。’……随着时间推移,我们现在已经到达一个临界点,你可以用 Rust 和 Linux 为各种不同类型的子系统编写非常出色的驱动。我认为在接下来一两年里,你会看到这一点。”按照 Kroah-Hartman 一贯的风格,他把这种模式总结为一种进化过程:“Linux 是进化,不是智能设计。我们随着时间演进,而随着时间推移,新的硬件会带着新的驱动进入。你会开始使用那种新硬件。旧驱动就不会再被用了。最终,我们会像往常那样,在大约 20 年后把它们删除。”
与此同时,Kroah-Hartman 对听众说:“今天,Linux 有 3600 万行 C 代码,以及 11.3 万行 Rust 代码。最重要的是,这一切都依赖于绑定。”由于驱动程序构成了内核的大部分,“顶级的 Rust Android 程序员 Alice Ryhl 以及 Rust-for-Linux 的开发者们,不得不去为所有东西编写绑定,才能用 Rust 写一个很小的驱动。”这迫使社区放宽了通常反对未使用代码的规则:“我们也不喜欢往内核里添加不会被使用的代码,所以要加一个绑定会很难……除非你有一个会用到它的用户。所以这有点像先有鸡还是先有蛋的问题。”
我们不得不稍微放宽了那条规则。”他还指出,真正的部署很快就会到来:“Android 手机很快就会上市,希望很快就能在 Binder 中运行所有这些 [Rust] 代码。所以这又意味着,数十亿台设备很快就可以在 Linux 中运行 Rust。”最终让包括他在内的多位核心维护者选择 Rust 的,是它“让代码审查变得更容易”。在 CI [Continuous Integration,持续集成] 机器人负责强制构建、而 Rust 的类型系统负责约束关键不变量的情况下,维护者就可以“专注于逻辑”,而不是资源记账:“我可以只关心那一个函数。我不必担心其他所有这些东西,因为我假定它们运行得正确,因为它们是正确构建出来的。”另见:Linus Torvalds 那个让他发火的 AI 说法,以及安全研究人员绝对不该做什么
他表示,从内部看,最核心的维护者们其实已经就 Rust 的地位做出了决定:“Linux 内核维护者每年都会聚在一起,讨论这些流程在做什么。去年,我们说 Rust 实验结束了。它不是实验了。这是认真的。”其理由是:“背后的人是认真的。我们信任他们。我们知道他们在做什么。他们已经展示并付出了努力,让 Rust 成为内核里可行的语言,而我们会让这件事落地。让我们全速前进。而且,一如既往,”他带着讽刺地说,“世界统治仍在继续。”
来源与参考
收录于 2026-05-28