如何在 Linux 上更新 sudo 版本
问题:我了解到
sudo
命令中发现了一个严重的安全漏洞,我想立即将sudo
升级到最新版本以修复我的Linux系统上的漏洞。如何更新 [插入您的 Linux 发行版] 上的sudo
版本?
在 Linux 上,sudo
命令(“substitute user do”或“superuser do”的缩写)旨在允许用户使用另一个用户(最常见的是超级用户“root”)的访问能力来运行程序。 sudo
通常用于为选定的用户提供 Linux 系统上的管理控制权。尽管 sudo 具有防止误用的内置机制(例如安全策略、输入/输出日志记录),但 sudo 命令中任何漏洞的潜在影响仍然非常高。
例如,在 sudo
中发现的最新堆缓冲区溢出漏洞 (CVE-2021-3156) 可以触发权限提升,并允许任何非特权用户(不在 sudoers
列表中,甚至 nobody
中的用户)绕过密码身份验证并获得 root 访问权限。一旦低级别服务帐户通过暴力攻击被破坏,该漏洞很容易被利用作为第二阶段攻击。
由于大多数 Linux 发行版默认都提供 sudo
,因此 sudo
中的任何漏洞很可能会直接影响您。
如何检查您的 sudo
是否存在漏洞 (CVE-2021-3156)
这里我介绍如何检查您的 sudo 是否容易受到最新的堆缓冲区溢出漏洞 (CVE-2021-3156) 的影响。虽然该指令非常针对此漏洞,但可以根据相应的 CVE 漏洞披露轻松针对任何其他 sudo
漏洞进行调整。
方法一:检查sudo
版本
您可以使用以下命令检查 sudo
的版本,并将其与受影响的版本进行比较。
$ sudo --version
受 CVE-2021-3156 影响的 sudo
版本:
从 1.8.2 到 1.8.31p2 的所有旧版
sudo
sudo
从 1.9.0 到 1.9.5p1 的所有稳定版本
方法二:通过命令行测试CVE-2021-3156漏洞:
仅从 sudo
版本来看,您可能无法判断 sudo
是否存在漏洞,因为补丁可以向后移植。更可靠的方法是直接测试漏洞。要测试您的 sudo 是否受到堆缓冲区溢出漏洞的影响,您可以使用以下命令行。
首先以非 root 用户身份登录 Linux 系统,然后运行:
$ sudoedit -s /
如果您的 sudo
容易受到攻击,它将显示一条错误消息,内容为“sudoedit: /: 不是常规文件
”

如果您的 sudo
已修补,它将显示一条以 usage
开头的使用消息:

更新受支持的 Linux 发行版上的 sudo
版本
一旦您发现您的 sudo
受到已知漏洞的影响,您应该立即更新 sudo
。最简单的方法当然是使用 Linux 系统的默认包管理器。但是,此方法仅适用于您的 Linux 发行版尚未达到生命周期 (EOL) 的情况。如果您的 Linux 发行版因其支持生命周期已过期而不再维护,则存储库将不会使用安全补丁进行更新。在这种情况下,您无法使用包管理器更新 sudo
,而需要手动更新,如下所述。
这里我假设你的Linux系统仍然受支持。在更新 sudo
之前,一个可选步骤是检查 sudo
软件包的更改日志,以确认 sudo
软件包已针对已知漏洞进行了修补。在此示例中,考虑的漏洞是 CVE-2021-3156。如果您将升级 sudo
作为定期维护的一部分,则可以跳过检查更改日志。
在 Ubuntu、Debian 或 Linux Mint 上更新 sudo
:
要在 DEB 包的更新日志中检查 sudo
的漏洞补丁:
$ sudo apt update; apt changelog sudo | grep CVE-2021-3156
- debian/patches/CVE-2021-3156-pre1.patch: check lock record size in
- debian/patches/CVE-2021-3156-pre2.patch: sanity check size when
- debian/patches/CVE-2021-3156-1.patch: reset valid_flags to
- debian/patches/CVE-2021-3156-2.patch: add sudoedit flag checks in
- debian/patches/CVE-2021-3156-3.patch: fix potential buffer overflow
- debian/patches/CVE-2021-3156-4.patch: fix the memset offset when
- debian/patches/CVE-2021-3156-5.patch: don't assume that argv is
一旦您确认补丁可用,请继续更新 sudo
:
$ sudo apt update; sudo apt --only-upgrade install sudo
请注意,即使更新成功后,sudo
版本也可能保持不变或受影响的版本之一。放心。这只是因为漏洞补丁通常只是向后移植到现有的 sudo
版本。因此,为了验证补丁是否已成功应用,建议针对该漏洞测试 sudo
,如前所述。
在 Fedora 或 CentOS 上更新 sudo
:
在 RPM 包的更新日志中检查 sudo 的漏洞补丁:
$ repoquery --changelog sudo | grep CVE-2021-3156
Fedora 33 openh264 (From Cisco) - x86_64 3.6 kB/s | 3.2 kB 00:00
Fedora Modular 33 - x86_64 952 kB/s | 1.5 MB 00:01
Fedora Modular 33 - x86_64 - Updates 1.5 MB/s | 1.5 MB 00:01
Fedora 33 - x86_64 - Updates 2.0 MB/s | 10 MB 00:05
Fedora 33 - x86_64 1.3 MB/s | 15 MB 00:10
RPM Fusion for Fedora 33 - Free - Updates 1.1 MB/s | 414 kB 00:00
RPM Fusion for Fedora 33 - Free 1.3 MB/s | 964 kB 00:00
- fixed CVE-2021-3156 sudo: Heap buffer overflow in argument parsing
确认补丁存在后,继续更新 sudo
:
$ sudo dnf update sudo
请注意,即使更新成功后,sudo
版本也可能保持不变或受影响的版本之一。放心。这是因为漏洞补丁通常只是反向移植到现有的 sudo
版本。要仔细检查这一点,如前所述,针对该漏洞重新测试 sudo 始终是一个好主意。
如果您的 CentOS 或 Fedora 系统已达到 EOL,您将需要手动更新 sudo
,如下所述。
更新不受支持的 Linux 发行版上的 sudo
版本
如果您运行的是已达到 EOL 且不受支持的旧版 Linux 发行版(例如 CentOS 6、Ubuntu 17.04),那么不幸的是,您只能靠自己来应用安全补丁。对于某些Linux发行版,至少可以从官方网站下载最新稳定版本的sudo
二进制包。例如,他们为不受支持的 RHEL/CentOS 5 和 6 提供了最新 sudo 的 RPM 包。
如果预构建的二进制包不可用,您可以从源代码构建最新的稳定版本(截至目前为 1.9.5p2)sudo
,然后手动安装它。您还可以考虑使用 CheckInstall
从源代码构建 DEB/RPM 包。
下面介绍如何从源代码手动构建和安装 sudo
。
对于 Ubuntu、Debian 或 Linux Mint:
$ sudo apt install make gcc
$ wget https://www.sudo.ws/dist/sudo-1.9.5p2.tar.gz
$ tar -xf sudo-1.9.5p2.tar.gz
$ cd sudo-1.9.5p2
$ ./configure --prefix=/usr
$ make
$ sudo make install
对于 CentOS 或 Fedora:
$ sudo dnf install make gcc
$ wget https://www.sudo.ws/dist/sudo-1.9.5p2.tar.gz
$ tar -xf sudo-1.9.5p2.tar.gz
$ cd sudo-1.9.5p2
$ ./configure --prefix=/usr
$ make
$ sudo make install
安装后,验证 sudo 是否是最新的:
$ sudo --version
Sudo version 1.9.5p2
Sudoers policy plugin version 1.9.5p2
Sudoers file grammar version 48
Sudoers I/O plugin version 1.9.5p2
Sudoers audit plugin version 1.9.5p2