sudo 漏洞集
2019-10-19 08:17:54 阿炯

Sudo 是一个允许系统管理员向用户授予有限的 root 权限的程序。


提权漏洞-任意用户均能以 root 身份运行命令

根据外媒的报道,Linux sudo 被曝出存在一个提权漏洞,可完全绕过 sudo 的安全策略。该报道指出:sudo 存在一个安全策略隐患,即便"sudoers configuration"配置文件中明确表明不允许以 root 用户进行访问,但通过该漏洞,恶意用户或程序仍可在目标 Linux 系统上以 root 用户身份执行任意命令。

sudo,也就是以超级管理员身份运行(superuser do)的意思。是 Unix/Linux 中最常使用的重要实用程序之一,它功能十分强大,几乎安装在每一款基于 UNIX 或 Linux 的操作系统上,也是这些操作系统的核心命令。作为一个系统命令,普通用户可通过它以特殊权限来运行程序或命令(通常以 root 用户身份运行命令),而无需切换使用环境。

默认情况下,在大多数 Linux 发行版中,/etc/sudoers 文件中 RunAs 规约的 ALL 关键字允许 admin 或 sudo 组中的所有用户以系统中的任何有效用户身份运行任何命令。如下图所示:


然而,在 Linux 系统中存在一条基本安全范式 -- 权限划分(privilege separation)。管理员可以配置 sudoers 文件,来指定哪些用户可以运行哪些命令。这样即使限制了用户以 root 用户身份运行特定命令或任何命令,该漏洞也可能允许用户绕过此安全策略并完全接管系统。

Sudo 开发者说到:“即便 RunAs 规约明确禁止 root 用户访问,但如果 Runas 规约文件中首先列出了 ALL 关键字,具有 sudo 权限的用户就可以使用它来以 root 身份运行任意命令。”


如何利用此漏洞?

Sudo User ID -1 or 4294967295

据悉,该漏洞由苹果信息安全部门的 Joe Vennix 追踪发现(漏洞的 CVE ID 为 CVE-2019-14287 )。如果想要利用这个漏洞,只需按以下的方式运行即可:
sudo -u#-1 id -u
或者
sudo -u#4294967295 id -u

不过我们也能看到这里存在一个这样的前提,那就是你的安全策略设置如下:
eviluser = (ALL, !root) /usr/bin/vi

然后这个 eviluser 就能够通过sudo -u#-1 vi命令以 root 身份运行vi。


之所以会产生这个漏洞,是因为将用户 ID 转换为用户名的函数会将 -1(或无效等效的 4294967295)误认为是 0,而这正好是 root 用户 User ID 。由于通过 -u 选项指定的 User ID 在密码数据库中不存在,因此不会运行任何 PAM 会话模块。

将 sudo 升级到 1.8.28 最新版本吧,该漏洞会影响 1.8.28 之前的所有版本。


新的 Linux sudo 漏洞使本地用户获得 root 权限

2021年1月下旬,被技术专家所发现的新 sudo 漏洞允许任何本地用户在不需要任何身份验证的情况下就可以在类 Unix 操作系统上获得 root 权限。


sudo 实际上就是一个 Unix 程序,它使系统管理员可以为 sudoers 文件中列出的普通用户提供有限的 root 权限,与此同时保留其活动日志。sudo 按照“最小权限原则”工作,基于该原则,sudo 程序仅授予用户足够的权限来完成工作,而不会损害系统的整体安全性。当在类似 Unix 的系统上执行命令时,普通用户可以使用 sudo(superuser do)命令来以超级用户身份执行命令(如果他们具有权限或知道超级用户的密码)—— root 是系统的超级用户,即一个特殊的系统管理帐户。

任何本地用户的 root 权限

Qualys 的安全研究人员发现并跟踪了被命名为 CVE-2021-3156 的 sudo 权限升级漏洞。根据 Qualys 研究人员的发现,此漏洞产生的原因是基于任何本地用户(普通用户和系统用户,无论是否在 sudoers 文件中列出)都可以利用基于堆的缓冲区溢出而实现的,攻击者无需知道用户密码即可成功利用此漏洞。

sudo 错误地在参数中转义了反斜杠字符,从而触发了缓冲溢出,最终导致任何本地用户都可以获得 root 权限。通常,在 shell 中(sudo -s 或 sudo -i)运行命令时,sudo 都会转义特殊的字符。但是,在使用 sudoedit -s 或 sudoedit -i 时实际上又没有进行转义,这使得缓冲区溢出成为了可能。利用这些漏洞,Qualys 的研究人员能够在多个 Linux 发行版上获得完整的 root 权限,研究人员分别在 Debian 10(sudo 1.8.27)、Ubuntu 20.04(sudo 1.8.31)和 Fedora 33(sudo 1.9.2)上重现了 CVE-2021-3156 漏洞。根据 Qualys 的说法,CVE-2021-3156 漏洞在其他 sudo 所支持的操作系统和发行版中同样存在。

漏洞在对外公开前就已修复

该漏洞最早是在 2011 年 7 月由 sudo 程序引入进系统之中,距今已接近 10 年时间。它会影响从 1.9.0 到 1.9.5p1 的所有稳定版本,以及从 1.8.2 到 1.8.31p2 的所有旧版本的默认配置。

Qualys 于 1 月 13 日就在 sudo 程序的内部社群披露了此漏洞,而今天 sudo 开发者正式推出 sudo 1.9.5p2 版本,并在该版本中修复了漏洞。为了防止该漏洞被滥用,因此直到现在 Qualys 才正式对外披露了他们的发现。要测试你的系统是否受到该漏洞影响,首先必须以非 root 用户的身份登录系统并运行 “*sudoedit -s /*”命令。易受攻击的系统将引发以 “sudoedit:” 开头的错误,而已修补系统将显示以 “usage:”开头的错误。

使用 sudo 将 root 权限委派给其他用户的系统管理员应尽快升级到 sudo 1.9.5p2 或更高版本。想要了解更多详情, 可以查看 Qualys 发布的技术细节

内存越界读取漏洞

Sudo 在 1.8.0 到 1.9.12 版本中由于 plugins/sudoers/auth/passwd.c 中存在数组越界错误从而存在内存越界读取漏洞,具有执行 Sudo 命令权限的本地用户可通过输入七个或更少字符的密码来触发此漏洞,从而造成拒绝服务或恶意代码执行。

漏洞名称:Sudo 存在内存越界读取漏洞
漏洞类型:跨界内存读
发现时间:2022-11-05
CVE 编号:CVE-2022-43995
影响范围:sudo@[1.8.0, 1.9.12p1)
修复方案:将组件 sudo 升级至 1.9.12p1 及以上版本

sudoedit 功能存在权限管理不当漏洞

sudoedit是用于以另外一个用户身份编辑文件。受影响版本的 sudoedit 功能存在权限管理不当漏洞,漏洞源于 sudo_edit.c@sudo_edit () 方法未对用户通过 “--” 参数传入的文件名进行过滤,导致具有 sudoedit 权限的恶意用户可编辑系统中的任意文件(如通过 “EDITOR='vim -- /etc/passwd' sudoedit /etc/custom/service.conf” 命令编辑 “/etc/passwd” 文件)。
漏洞名称:Sudo(sudoedit 功能)存在权限管理不当漏洞
漏洞类型:特权管理不恰当
发现时间:2023-01-19
MPS 编号:MPS-2023-0514
CVE 编号:CVE-2023-22809
影响范围:sudo@[1.8.0, 1.9.12p2)
修复方案:升级 sudo 到 1.9.12p2 或更高版本,或:
1、为防止 sudoedit 使用用户指定的编辑器,可向 sudoers 文件中添加以下内容:Defaults!sudoedit env_delete+="SUDO_EDITOR VISUAL EDITOR"

2、使用 “Cmnd_Alias” 限制编辑器编辑指定文件时,如:Cmnd_Alias EDIT_MOTD = sudoedit /etc/motd Defaults!EDIT_MOTD env_delete+="SUDO_EDITOR VISUAL EDITOR" user ALL = EDIT_MOTD

Rust 重写 sudo 和 su


互联网安全研究小组 (ISRG) 的 Prossimo 项目在用 Rust 重写 sudo 和 su,目标是提升它们在内存方面的安全性,确保其不再遭受内存安全漏洞的困扰,并进一步增强 Linux 和开源生态系统的安全性。据悉 Prossimo 选择的软件会重点关注以下方面:
使用非常广泛(几乎每个服务器/客户端都在使用)
位于临界边界与执行关键功能
是否使用了内存不安全的语言编写(例如 C、C++、asm)

而 sudo 刚好满足了上面的情况,因此 Prossimo 决定保护这款最关键的软件,尤其是避免内存安全漏洞。

sudo(substitute user [或 superuser] do),是一种计算机程序,用于类 Unix 操作系统如 BSD、Mac OS X/macOS 以及 GNU/Linux,该计算机程序可以让用户以安全的方式使用特定的权限执行程序(通常为操作系统的超级用户)。其最早开发于 1980 年代。几十年来,sudo 已成为执行更改同时最大程度降低操作系统风险的重要工具。但因为它是用 C 编写的,所以 sudo 经历了很多与内存安全问题相关的漏洞。为了确保关键软件的安全性,防止内存安全漏洞,由 AWS 资助的 Ferrous Systems 和 Tweede Golf 正在联合将 sudo 和 su 从 C 移植到 Rust。该项目现在托管于GitHub

该项工作从2022年 12 月开始,计划于 2023 年 9 月结束。具体开发计划查看工作计划

<1.9.15 故障注入导致权限提升漏洞

Sudo 1.9.15 之前的版本存在绕过认证或特权升级漏洞,由于应用程序逻辑基于不等于错误值执行某些操作,而非成功值,攻击者可能利用该实现欺骗系统,从而获取未授权的特权或执行特权操作。并且这些数值可能会因为硬件问题而发生意外改变导致 Rowhammer 攻击,从而导致认证绕过或特权升级。

漏洞名称:Sudo <1.9.15 故障注入导致权限提升漏洞
漏洞类型:非预期数据类型处理不恰当
发现时间:2023-12-23
CVE 编号     CVE-2023-42465

影响范围
sudo@(-∞, 1.9.15)
sudo@(-∞, 1.9.15p2-2)

修复方案
将组件 sudo 升级至 1.9.15p2-2 及以上版本。