← LeisureLinux 文章索引
LeisureLinux · 微信公众号文章

剑指核心:uutils coreutils 0.9.0,Linux 底层江湖的又一波澜

安全/漏洞 阅读原文(微信)↗

GNU coreutils 这个 1984 年生的老家伙,终于有了一个用 Rust 写就的现代化镜像。

2026 年 5 月 30 日,uutils coreutils 0.9.0 版本正式发布。这不仅仅是一个版本迭代,更是 Linux 底层江湖的一次暗流涌动,一场关于\"安全与性能\"的深刻论道。其核心主题——Safety and Security,并非空穴来风,而是经过第三方独立审计,并伴随着一系列深远的架构变革。

一、四十四道\"旧伤\":CVE 的真相与警示

此次发布,最引人注目的莫过于 Zellic 安全审计报告中揭示的 44 个 CVE。初闻此数,或有不明就里者惊呼\"Rust 亦有如此多漏洞?\"然而细究这些\"旧伤\",便能窥见其本质:它们并非 Rust 语言常见的内存安全问题,而是集中于 TOCTOU(Time-of-Check to Time-of-Use)竞态条件和文件系统边界条件处理。

TOCTOU,这个在并发编程中如影随形的幽灵,其核心在于\"检查\"与\"使用\"之间的时间窗口。攻击者若能在此间隙篡改文件或状态,便可造成意想不到的危害——例如一个 rm 命令在检查文件权限后、实际删除前,文件路径被符号链接替换,指向了系统关键文件。这类问题与 C 语言的 coreutils 同样面临,甚至在某些场景下,uutils 早期版本因追求与 GNU coreutils 的行为一致性,不经意间也\"继承\"了这些潜在的逻辑缺陷。

这 44 个 CVE 的发现,恰恰说明了 uutils 项目在安全性上的自我审视与成长。它不再满足于仅仅是功能上的 drop-in replacement,更要成为行为上更健壮、更可预测的替代品。这些问题暴露的,是文件系统操作的复杂性、竞态条件的隐蔽性,以及在不同操作系统环境下,文件系统语义差异带来的挑战。这并非 Rust 的\"锅\",而是底层工具在面对真实世界复杂性时,必须经历的洗礼。

延伸阅读:Zellic 审计报告原文 · corrode.dev 评论:\"Bugs Rust won\'t catch\"

二、内功精进:Zellic 审计、unsafe 收缩与 rustix 迁移

Zellic 的第三方安全审计,无疑是 uutils 项目迈向成熟的里程碑。这犹如武林高手在闭关修炼后,邀请武林盟主进行公正裁决,以证明其内功已臻化境。审计报告不仅揭示了上述 44 个 CVE,更重要的是,它提供了一份详尽的风险评估与改进建议,为 uutils 的安全之路指明了方向。

与之相伴的,是 uutils 团队在代码层面进行的\"内功修炼\":大规模收缩 unsafe 代码块。Rust 语言以其内存安全保证而闻名,但这并非魔法,而是通过所有权系统和借用检查器在编译时强制执行。然而当需要与底层操作系统进行交互时,例如进行系统调用,仍需借助 unsafe 块来调用 C 语言接口或执行一些绕过 Rust 安全检查的操作。

此次 0.9.0 版本的一大亮点,便是从 nixlibc 库大规模迁移到 rustixnixlibc 是 Rust 生态中与操作系统底层交互的常用库,但它们往往提供了更接近 C 语言的接口,需要开发者自行管理 unsafe 上下文。而 rustix 则是一个旨在提供更安全、更符合 Rust 习惯的系统调用封装库——它通过精心设计的 API,将底层的 unsafe 操作封装在库内部,向用户暴露安全的 Rust 接口。

这意味着什么?uutils 项目的\"破绽\"更少了,其核心逻辑的安全性得到了进一步提升。通过将 unsafe 代码的责任下沉到 rustix 这样的专业库,uutils 团队可以将更多的精力集中在核心业务逻辑的正确性和健壮性上,而无需时刻担忧底层系统调用的安全边界。

三、零拷贝神功:splice / tee / pipe 的性能飞跃

在底层江湖,性能永远是衡量实力的重要标准。uutils coreutils 0.9.0 在性能优化上,祭出了\"零拷贝神功\",通过 splice()tee()pipe() 等系统调用,实现了跨 catwcheadtailyescpteeunexpand 等命令的零拷贝 I/O。

传统的 I/O 操作,数据往往需要在内核空间和用户空间之间进行多次拷贝——从文件读取数据到用户缓冲区,再从用户缓冲区写入到另一个文件或网络套接字。每一次拷贝,都意味着 CPU 周期和内存带宽的消耗。而零拷贝技术,顾名思义,旨在减少甚至消除这些不必要的数据拷贝。

splice()tee() 是 Linux 内核提供的强大系统调用:splice() 可以在两个文件描述符之间直接移动数据,无需经过用户空间;tee() 则可以将数据从一个文件描述符复制到另一个,同时保留原始数据流,常用于管道中数据的分流。

当这些技术被巧妙地应用于 catcptee 等 I/O 密集型命令时,性能提升是显而易见的。release notes 中给出的具体数字包括:unexpand +7.5%、从管道读取的 cp 速度提升、tee 通过原始系统调用直跑。在理想情况下,可以实现数倍乃至数十倍的性能提升。

数据来源:uutils coreutils 0.9.0 Release Notes

四、跨越山海:WASI、Cygwin、Windows、OpenBSD

uutils coreutils 0.9.0 的发布,也标志着其在跨平台道路上迈出了坚实的一步。WASI (WebAssembly System Interface) 和 wasm 的支持,意味着 coreutils 不再局限于传统的操作系统环境——有望在浏览器、边缘计算、无服务器函数等新兴领域发挥作用。想象一下,一个 ls 命令在 WebAssembly 运行时中执行,直接操作虚拟文件系统,这为云原生和沙箱环境提供了全新的可能性。

Cygwin 和 Windows 平台的进展,则进一步拓宽了 uutils 的用户基础。对于 Windows 平台的开发者和运维人员而言,一个功能完备、性能优异的 coreutils 工具集,无疑能极大地提升其命令行体验和脚本编写效率。0.9.0 还在 WASI/wasm 中为 lnddmktemp 增加了支持,在 Cygwin 中跑通了 datestdbuf,在 Windows 上则完善了 tty 命令(包含 msys2 路径)。

OpenBSD 的支持则展现了 uutils 在追求安全性和健壮性方面的决心——OpenBSD 以其严格的安全策略和高质量的代码而闻名,能在那里跑起来,本身就是一种背书。

coreutils 不再只是 Linux/Unix 的专属工具,它正在成为一个真正的\"跨平台底层基石\"。

五、江湖地位:Ubuntu 25.10 的默认预装

在 Linux 的广阔江湖中,发行版的选择和默认配置,往往代表着一种趋势和认可。uutils coreutils 自 Ubuntu 25.10 起默认预装,并作为 GNU coreutils 的 drop-in replacement——这无疑是 uutils 项目迄今为止最重要的里程碑。

Ubuntu 作为全球最流行的桌面和服务器 Linux 发行版之一,其默认采用 uutils,意味着数以百万计的用户将直接体验到 Rust 编写的 coreutils。这不仅是对 uutils 项目质量和稳定性的高度肯定,更是对 Rust 在系统编程领域潜力的有力背书。

\"drop-in replacement\" 的承诺,意味着用户无需改变其习惯,现有的脚本和工作流将无缝迁移——但其底层却是更安全、更高效的实现。对于 Linux 生态而言,这是一次意义深远的\"换血\"。

详细背景:Ubuntu 官方公告 An update on Rust CoreUtils

六、微软的\"橄榄枝\":oech3 与 WSL 的深度融合

值得一提的是,微软这位昔日与开源社区\"水火不容\"的巨头,如今也伸出了橄榄枝。项目长期核心贡献者 oech3 来自微软,0.9.0 版本的 530 次提交中,oech3 一人贡献了 cat、chroot、coreutils 三个核心模块的大头——splice 优化、unsafe 收缩、Linux 6.4 兼容性,这些关键工作都出自其手。

uutils 在 Windows 端的进展,包括 PowerShell、WSL (Windows Subsystem for Linux) 以及 Office 内部工具链的采用,都受益于微软的投入。微软近年来在开源领域的策略转变,以及对 Rust 语言的积极拥抱,使得 uutils 成为其战略布局中的重要一环。

WSL 的成功,在于将 Linux 环境无缝集成到 Windows。而一个用 Rust 编写、性能优异、跨平台兼容的 coreutils,无疑能进一步增强 WSL 的体验,并为微软内部的开发和运维提供更现代化的工具链。这不仅是微软对 uutils 项目的认可,更是其在底层技术栈上,拥抱开放、追求效率的体现。

七、老骥伏枥,新血注入:coreutils 的时代变迁

GNU coreutils,这个在 1984 年诞生的老骥,在过去 42 年间默默支撑着整个 Linux/Unix 世界的运转。它犹如武林中的老宗师,功力深厚,德高望重。然而岁月不饶人,C 语言的固有缺陷、单线程模型的局限、以及在现代化多核、并发、跨平台场景下的挑战,都使得这位老宗师面临着\"换血\"的时代需求。

uutils coreutils 并非要取而代之,而是作为一股清新的\"新血\",为这个古老的江湖注入新的活力。它以 Rust 的内存安全、并发优势和现代化设计理念,重新诠释了 coreutils 的定义。从 Zellic 的安全审计,到 unsafe 代码的收缩,再到零拷贝的性能突破,乃至 Ubuntu 的默认预装和微软的深度参与——uutils 0.9.0 的发布,无疑是其走向成熟、挑战传统核心地位的关键一步。

但 GNU coreutils 那边也并非坐以待毙——0.9.0 release notes 提到,uutils 团队\"持续向 GNU coreutils 上游贡献测试和 bug 报告\",这本质上是一场良性的\"竞合\"。你追我赶,工具链的极限才能被一次次打破。

这并非一场你死我活的争斗,而是一场技术演进的接力。GNU coreutils 的历史功绩不可磨灭,而 uutils coreutils 则承载着将这些核心工具带入下一个十年的使命。

八、江湖再见,自有波澜

底层江湖风云变幻,技术浪潮永不停歇。uutils coreutils 0.9.0 的发布,犹如一声惊雷,震动了沉寂已久的 Linux 底层世界。它告诉我们,即使是最基础的工具,也需要不断地审视、优化和现代化。

参考链接

  • uutils coreutils GitHub 仓库
  • 0.9.0 Release Notes
  • Zellic 安全审计报告
  • Ubuntu 官方公告:An update on Rust CoreUtils
  • corrode.dev:Bugs Rust won\'t catch

Rust Coreutils 0.7 发布:性能大跃进与架构深层优化

用 Rust 重写的 Bash: Brush v0.4的重大更新

不仅仅是 AI:Gilfoyle——那个冷酷且永不宕机的数字 SRE 代理

常见问题(FAQ)

Q1:这篇文章主要讲什么? GNU coreutils 这个 1984 年生的老家伙,终于有了一个用 Rust 写就的现代化镜像。 Q2:还有哪些关键事实? 审计报告不仅揭示了上述 44 个 CVE,更重要的是,它提供了一份详尽的风险评估与改进建议,为 uutils 的安全之路指明了方向。 Q3:有哪些值得注意的细节? 项目长期核心贡献者 oech3 来自微软,0.9.0 版本的 530 次提交中,oech3 一人贡献了 cat、chroot、coreutils 三个核心模块的大头——splice 优化、unsafe 收缩、Linux 6.4 兼容性,这些关键工作都出自其手。 Q4:核心结论是什么? 从 Zellic 的安全审计,到 unsafe 代码的收缩,再到零拷贝的性能突破,乃至 Ubuntu 的默认预装和微软的深度参与——uutils 0.9.0 的发布,无疑是其走向成熟、挑战传统核心地位的关键一步。

本文整理自微信公众号 LeisureLinux 的原创内容(Linux / AI / 安全 硬核技术)。

· 阅读原文(微信公众号)

· 关注公众号 LeisureLinux,第一时间获取技术深度内容。

LeisureLinux 公众号二维码(微信扫一扫关注)