同一个sudo漏洞报告,两个人看出了截然相反的未来:有人说run0这种新架构才是解药,有人却说只要换个操作系统,根本不需要sudo。这事得从sudo自身那两个老问题说起。

sudo从1980年代服务至今,代码量早已超过10万行。10万行意味着什么?用攻击者的话说,代码的海量本身就成了隐藏漏洞的最佳掩护。第二个麻烦是setuid权限位——sudo的可执行文件属主是root,普通用户一运行,这个二进制就会以root权限执行。只要二进制文件里藏着任何一个能被利用的缺陷,未提权的用户就能注入攻击代码,完成本地提权。这在安全圈里叫任意代码执行,本质上是让没权限的人运行了有权限的代码。

打开网易新闻 查看精彩图片

run0给出的解法很干脆:不继承执行环境。它不再走setuid那条老路,而是通过polkit策略守护进程实现权限提升,让权限控制变得可粒度化。实际运行时,run0会在一个派生的伪终端(PTY)里启进程,环境变量、cgroup分配、安全上下文、文件描述符统统被隔离在外,原本进程的上下文干扰被一刀切断。代价是它用起来还有点粗粝,比如不会缓存认证凭据,连续几条命令都得反复输密码,但这只是体验问题,不是架构缺陷。任何装了systemd v256以上的系统都能直接用run0 ls试试,或者不加命令直接跑个交互式终端。

另一边,sudo-rs走的则是“用内存安全重写”的路线。它由Trifecta Tech Foundation开发,已被Canonical纳入Ubuntu氧化计划,目标是成为一个几乎可以直接替换sudo的二进制。它的逻辑非常直白:本地提权攻击的常见突破口就是内存破坏,如果代码本身是内存安全的,那些内存腐败型漏洞就没了土壤。从这个角度看,它的确不需要把整个权限模型推翻重来,只专注于消除那一类最突出的攻击面。

然而有一个更极端的思路常常被忽略——隔离到让sudo变得无关紧要。Qubes OS的做法不是去修sudo,而是让每个应用甚至每个任务都跑在独立的虚拟化隔间里,特权提升这个命题本身就被拆解了。当攻击者即使拿到root也碰不到其他隔间的数据时,sudo这个中间人的存在感就变得极其微弱。当然,这种方案的门槛是全系统替换,不像前两者那样可以在既有Linux发行版上渐进引入。

如果你面对的是需要紧急收缩攻击面的现有系统,sudo-rs的替换成本和run0的原生可用性是立等可取的安全收益。但如果愿意连同基础设施一起重新思考,那么把sudo从必需品变成可选项,或许是比修补一个40年历史的权限桥梁更根本的解。