撰稿 | 言征
大家对于sudo命令太熟悉了,这个实用又危险的命令,甚至衍生出了“sudo rm -rf”类似的Linux圈的流行梗。近年来,sudo命令已经被一些开发组织盯上,开始了安全重构。现在,已经有Linux发行版本开始用上了诸如Rust等内存安全的语言重写过的sudo命令。
好消息是,就在今天,Rust版本的sudo出道了!互联网安全研究小组(ISRG)的Prossimo项目刚刚宣布了sudo-rs的第一个稳定版本。
用Rust重写的sudo到底有什么不同?目前进展如何?本文这就带领诸君一览首个用Rust重构的内存安全版的sudo -rs项目。
一、内存安全的sudo首个稳定版本
近两年,“内存安全软件”已经被美国**机构提上了安全议程。而早在今年5月,就有报道称Prossimo正计划将sudo从C移植到Rust的说法。
在无处不在的 Linux 操作系统中,sudo 实用程序是工程师跨越用户和管理帐户之间隐私边界的最常用方法之一。因此,其安全性至关重要。
sudo-rs 是用 Rust 编写的。所需的最低 Rust 版本是 1.70。如果所用的Linux 发行版未打包该版本(或更高版本),可以通过rustup安装最新版本。此外,开发者还需要 PAM 的 C 开发文件(比如在 Debian上的libpam0g-dev、Fedora上的pam-devel等)。
安装依赖项后,构建 sudo-rs 就变得简单了:
复制
cargo build --release1.
这会产生一个二进制文件target/release/sudo。但是,此二进制文件必须设置 setuid 标志,并且必须由 root 用户拥有,才能提供任何有用的功能。同时,sudo-rs 需要 sudoers 配置文件。如果sudoers 配置文件存在,则将从该文件加载,否则将使用/etc/sudoers-rs原始位置。
(1)use_pty默认情况下启用,可禁用。
(2)env_reset被忽略——这总是启用的。
(3)visiblepw被忽略——这始终被禁用。
(4)verifypw目前被忽略;始终需要密码sudo -v。
(5)mail_badpass、always_set_home、always_query_group_plugin和 match_group_by_gid不适用于该版本的实现,但出于兼容性原因而被忽略。
(1)部分功能尚不支持,特别是使用和sudoedit,以及防止 shell 逃逸时的NOEXEC和NOINTERCEPT。
(2)Defaults(尚)不支持用于更细粒度控制的每用户、每命令、每主机sudoers 条目。
(3)此时 sudo-rs 始终使用 PAM 进行身份验证,你的系统必须设置为 PAM。
(4)sudo-rs 将使用sudo服务配置。这也意味着资源限制、umask 等必须通过 PAM 配置,而不是通过 sudoers 文件。
sudo-rs 将不包括原始 sudo 的 sendmail 支持。sudoers 文件必须是有效的 UTF-8。如果你发现缺少原始 sudo 的常见用例,请在我们的问题跟踪器中为其创建功能请求。
三、为什么要重写sudo?
其实,原始的sudo已经变得相对不安全了。最早的sudo开发始于 1980 年代(早于GNU/Linux的发布),几十年来,它已经成为在执行更改的同时将操作系统的风险降到最低的一个基本的命令工具。但因为它是 C 语言编写的,近些年来时不时就会曝出一些错误或漏洞,而这其中有专业分析估计有三分之一的安全错误都是内存管理问题。
另外,sudo有许多不常用的功能,也会为安全风险带来更多的攻击面。为此,使用Rust重写后的sudo -rs项目则大大提高了原始sudo的安全性:
(1)使用内存安全语言 (Rust),解决因内存管理而产生的的内存方面的安全错误问题;
(2)省略不常用的功能以减少攻击面;
(3)开发一个广泛的测试套件,甚至设法找到原始 sudo 中的错误。
四、已经有Linux发版采用了!
早在今年1月,就有企业宣布推出了内存安全版的Linux系统:Wolfi Linux,宣称能从根本上杜绝大量已知软件漏洞。而有意思的是,这家企业:Chainguard 的首席执行官 Dan Lorenc 表示,并不是完全由内存安全语言编写的,而是一个组合——“Wolfi 是使用以内存安全语言编写的新库和不安全语言编写的库的组合开发的,是内存安全的系统级实现。”
此外,Chainguard 还与互联网安全研究小组 (ISRG) 合作,为 Wolfi 创建了一个 Rustls TLS 库,可用作 libcurl 中的默认后端。所有 curl 镜像或任何其他依赖于 curl 的镜像都能够利用 Wolfi 的内存安全属性。
sudo -rs的初衷与Wolfi Linux所致力的内存安全方向完全一致,因此,Wolfi Linux系统已经可以使用 sudo -rs命令。Dan Lorenc 表示:“当我们第一次着手构建 Wolfi 时,确保内存安全始终是首要任务。”
相信之后也会有不少打算与Rust兼容的发行版也会渐渐采用sudo -rs。
五、开发团队的阵容也相当硬核
首先,该项目是互联网安全研究小组 (ISRG) 的 Prossimo 项目发起的,目的是为了保护关键软件的内存安全性。当时选择Rust来“保护”Sudo,也是因为sudo完美地契合以下四个条件:
(1)使用非常广泛(几乎每个服务器 / 客户端都在使用)
(2)被应用于重要的安全边界
(3)执行关键功能
(4)是否使用了内存不安全的语言编写(例如 C、C 、asm)
其次,其实这个项目早在今年5月份就有报道,Ferrous Systems 和 Tweede Golf 都是致力于软件安全的公司,前者有着非常丰富经验的Rust大神坐镇,服务了诸如mozilla、安卓等全球知名的项目;后者公司的大佬则开发过许多的开源工具包,诸如Node.js、Rust