技术

Ubuntu 26.04将Rust sudo设为默认,终结46年C语言漏洞类别

Adrian Kessler

Ubuntu 26.04 LTS(2026年4月发布)将 sudo-rs 设为控制 Linux 系统级访问工具的默认实现。当用户或进程需要提升权限——安装软件、修改系统文件、以 root 身份运行服务——sudo 就是守门人。原版 sudo 用 C 语言编写。sudo-rs 是用 Rust 完全重写的版本,现在已成为全球最广泛使用的 Linux 发行版默认搭载的版本。

原版 sudo 编写于1980年。在那段时间里,C 代码库除了功能之外,还积累了一些别的东西:一类 Rust 在编译器层面就能消除的内存管理漏洞。其中最著名的是 CVE-2021-3156,名为 Baron Samedit。该漏洞潜伏了大约十年未被发现,允许在所有主流 Linux 发行版上进行本地提权。拥有非 root shell 账户的本地攻击者可以成为 root。Canonical 在披露后24小时内打了补丁。但导致漏洞的架构条件——C 语言的手动内存管理——并未得到修补。

Rust 改变的不是代码的编写方式,而是代码中可能存在的漏洞类别。缓冲区溢出、释放后使用错误和空指针解引用是 Rust 在编译时就能消除的一类漏洞——编译器在代码运行前就会拒绝包含这些模式的代码。对于处理权限提升的软件来说,这是从威胁模型中移除的一个重大约束。

sudo-rs 于2023年完成了完整的独立安全审计。该项目实现了与 C 实现的性能持平。Canonical 在早期 Ubuntu 版本中将其作为可选选项提供,然后在 26.04 中设为默认。这种分阶段的方法反映了替换一个工具时应有的谨慎——如果该工具失败,可能会导致用户无法访问系统,或者将攻击者提升为 root。

Ubuntu 26.04 还搭载了 uutils coreutils——对 ls、cat 和 mv 等基础工具用 Rust 重写的版本。但 cp、mv 和 rm 在此版本中仍使用 GNU C 实现。Canonical 的理由是:这些 Rust 实现中的 TOCTOU 竞态条件存在数据破坏风险,团队认为对于 LTS 版本来说风险过高。这种分阶段推出揭示了“直接重写为 Rust”方法的一个诚实之处:工具已经存在,但迁移需要逐案进行安全分析,而不是全面切换。

Linux 内核于2022年开始接受 Rust 驱动代码。Android 团队自2021年起在新系统代码中使用 Rust。微软用 Rust 重写了内存敏感的 Windows 组件。Ubuntu 将 sudo-rs 设为默认是一个有意义的里程碑,因为它不是新驱动的实验或可选组件——它是系统访问的认证层,默认搭载到每个新 Ubuntu 安装中。

在这种配置下,产生 Baron Samedit 的 CVE 模式对 Ubuntu 用户来说结束了。其他主要发行版——Debian、Red Hat、Fedora、Arch——是否会跟随 Ubuntu 将 sudo-rs 设为默认,这个问题决定了变革的规模。sudo-rs 对它们都可用。Canonical 认为审计结果已经足够。下一个决定权在于其他维护者。

标签: , , , , ,

讨论

有 0 条评论。