2024年的一次安全补丁,让NixOS在两年后栽了跟头。项目团队本周披露,那次修复本身引入了更危险的权限提升漏洞——所有默认配置的NixOS系统,以及任何构建不可信软件包的环境,全部暴露在root提权风险之下。

一个补丁的回旋镖

一个补丁的回旋镖

漏洞编号CVE-2024-27297的修复代码,成了新漏洞CVE-2025-3278的源头。问题出在"固定输出构建"(fixed-output derivation)的输出注册环节:Nix守护进程在复制构建结果时,会跟随构建环境内的符号链接,而那个临时输出目录恰好位于构建沙盒(chroot)内部。

攻击者只需在沙盒内创建一个指向系统任意位置的符号链接,Nix守护进程(以root权限运行)就会乖乖地把构建内容写到那个位置。沙盒的隔离墙,变成了特洛伊木马的传送门。

Linux系统的沙盒构建受影响,macOS的沙盒构建侥幸逃过一劫。多用户安装模式下,任何被允许提交构建的用户——默认配置下就是所有本地用户——都能利用这个路径修改敏感系统文件,最终获得root权限。

为什么沙盒会叛变

为什么沙盒会叛变

这事有点像银行金库的设计悖论。Nix的沙盒本意为隔离不可信代码,但"固定输出构建"是个特例:这类构建需要访问网络(比如下载源码),所以Nix允许它们在受控环境下运行,同时用哈希值验证输出结果是否可信。

验证通过后的输出注册阶段,Nix守护进程需要把构建产物从沙盒复制到真正的存储位置。问题就出在这个"复制"动作上——守护进程运行在宿主机的挂载命名空间,却要去读取沙盒内的临时路径。如果那个路径是个符号链接,守护进程不会察觉,直接跟着链接走到了宿主机的任意角落。

2024年的CVE-2024-27297修复,本意是加强路径验证,却在实现中留下了这个符号链接跟随的口子。换句话说,补丁的副作用比原漏洞更危险。

Guix的镜像问题

Guix的镜像问题

NixOS公告发布当天,GNU Guix社区就有人追问:我们受影响吗?Guix与Nix共享相似的包管理架构,同样使用守护进程模式和沙盒构建。Guix开发者atai在邮件列表的回复目前仅收到1条跟进,具体评估结果尚未公开。

这两个项目的代码库早已分道扬镳,但核心机制的同源性意味着类似的攻击面。Guix用户正在等待自家的安全公告——或者是一份庆幸的免责声明。

修复与暴露面

修复与暴露面

NixOS项目已发布更新版本。但真正的麻烦在于部署节奏:NixOS以声明式配置和可复现构建著称,这也意味着大量用户可能长期运行着"稳定但过期"的系统版本。企业环境中,一次Nixpkgs通道的更新可能牵扯数百个依赖包的重新构建,管理员往往在风险与稳定性之间艰难权衡。

这次漏洞的讽刺之处在于,它恰恰利用了Nix最核心的安全机制——沙盒隔离。就像一把设计用来防盗的锁,钥匙孔的位置却让小偷有了可乘之机。

你的NixOS系统上次更新是什么时候?如果答案超过两周,现在可能是检查nix-channel --list的好时机。