撰稿 | 言征
大家对于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 编写的 sudo 和 su 的、面向安全和内存安全的实现。官网声明中显示,sudo-rs 目前仅针对基于 Linux 的操作系统;运行 sudo-rs 需要 Linux 内核 5.9 或更高版本。
sudo-rs 是用 Rust 编写的。所需的最低 Rust 版本是 1.70。如果所用的Linux 发行版未打包该版本(或更高版本),可以通过rustup安装最新版本。此外,开发者还需要 PAM 的 C 开发文件(比如在 Debian上的libpam0g-dev、Fedora上的pam-devel等)。
安装依赖项后,构建 sudo-rs 就变得简单了:
cargo build --release
这会产生一个二进制文件target/release/sudo。但是,此二进制文件必须设置 setuid 标志,并且必须由 root 用户拥有,才能提供任何有用的功能。同时,sudo-rs 需要 sudoers 配置文件。如果sudoers 配置文件存在,则将从该文件加载,否则将使用/etc/sudoers-rs原始位置。
二、与C版sudo有何不同?
sudo-rs 支持的功能比 sudo 少。其中一些是设计使然。在大多数情况下,如果你尝试不支持的操作(例如,使用未实现的配置标志或命令行选项),你将收到明显的错误。除上述情况外,用户配置/etc/sudoers需要注意:
(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&Embedded Rust、Go、React、Symfony和Flutter,以及操作端的Docker、Ansible和Kubernetes等等。可谓实力不俗。
最后,我们从项目的官网上也可以看到,亚马逊为这个项目提供了资金支持,并表示支持想内存安全软件的过渡。
值得一提的是,就连最初的基于 C 的 sudo 实用程序的维护者Todd C. Miller也参与了进来, Todd 也抽出时间为该项目提供了有关实施 sudo-rs 方面的中肯建议。
六、接下来计划:增加企业功能、更多发版支持
但启动这个项目要更早,是在2022年的12月份就已经启动。现在sudo-rs这个项目将获得了里程碑式的成果,从即将到来的9月份开始,这个联合开发团队将开始 2023 年 9 月的里程碑 4我们的工作计划,主要是围绕企业功能展开,比如多用户系统的安全功能(例如NOEXEC)、审核跟踪日志、sudoers的主机名匹配、支持16个以上的用户组(group_file插件)等。
第五个里程碑则可能更为诸位所期待:除了Debian/Ubuntu以外的发行版以外,Fedora版本也将提供支持,SELinux和AppArmor支持、sudoedit实现等等。
七、写在最后:Linux面临的安全债
Linux现在无处不在,但并不意味着万事大吉。
在Lorenc 看来,开发 “内存安全版” Linux 系统意义重大,目的在于提供一个更安全的平台来保护严重依赖 Linux 来部署应用程序的软件供应链,今天在非内存安全平台上开发应用程序是不负责任的。
“sudo utility是安全关键工具的完美示例,它既普遍应用又未被充分重视。对此类工具的安全性改进将对整个行业产生巨大影响。构建第一个 sudo-rs 版本的工作通过采用 Rust 等内存安全语言,在消除潜在安全问题方面迈出了一大步。这对于维护和维护 Wolfi 作为想要解决大多数现代供应链威胁的开发人员的默认安全基础至关重要。” 这位ChainGuard 创始人非常看好sudo-rs。
与此同时,绝大多数安全漏洞都可以追溯到涉及应用程序如何访问内存的问题。然后,网络罪犯利用这些漏洞发起攻击,例如,利用缓冲区溢出来访问数据等等。
而包括Linux之父在内的维护者们,也已经开始接受 Rust 作为 C 的替代品,来消除 Linux 内核中的这些类型的漏洞。
虽然,这些遗留代码数以万亿计,现在看起来是一项难以完成的艰巨任务,但正如同Linus在去年的开源峰会上所做的那样:在声称在6.1版本将Rust合并到主线上的同时,提前给各位打个预防针:
“以防此事搞砸了我又发脾气,先给大家道个歉!”