Linux Sudo 权限绕过缝隙安全公告

颁布功夫 2019-10-15

缝隙编号和级别


CVE编号:CVE-2019-14287,危险级别:高危,CVSS分值:官方未评定


影响版本


Sudo 1.8.28之前的所有版本


缝隙概述


Sudo 的全称是“superuserdo”,它是Linux系统治理指令,允许用户在不必要切换环境的前提下以其它用户的权限运行利用法式或号令,通常是以 root 用户身份运行号令,以削减 root 用户的登录和治理功夫,同时提高安全性。


该缝隙是 sudo安全战术绕过问题,可导致恶意用户或法式在指标 Linux 系统上以 root 身份执行肆意号令,即便 “sudoers configuration” 明确不容该 root接见权限也不例表。


利用该缝隙要求用户拥有 sudo 权限,从而以肆意用户 ID 运行号令。通常而言,这意味着用户的 sudoers 条款在 Runas 规范中拥有特殊值 ALL。Sudo 支持在 sudoers 战术允许的情况下,以用户指定的名称或用户 ID 运行号令。例如,如下 sudoers 条款允许 id 号令以肆意用户身份运行,由于它蕴含 Runas 规范中的关键字ALL。


myhost alice = (ALL) /usr/bin/id


用户不仅可能以其它合法用户身份运行该 id 号令,还能使用 #uid 语法以肆意用户 ID 运行该号令,例如:


sudo -u#1234 id -u


将返回1234,然而,sudo 在运行号令前用户批改用户 ID 的setresuid(2) 和 setreuid(2)系统挪用将特殊对待用户 ID为-1(或其未署名的等同值 4294967295)并且并不会批改该值的用户 ID。因而,


sudo -u#-1 id -u


或


sudo -u#4294967295 id -u


现实上会返回 0。这是由于 sudo号令自身就已经以用户 ID 为0 运行,因而当 sudo 试图将用户 ID 批改成 -1时,不会产生任何变动。这就导致 sudo 日志条款将该号令汇报为以用户 ID 为 4294967295而非 root (或者用户ID为 0)运行号令。此表,由于通过–u 选项指定的用户 ID 并不存在于密码数据库中,因而不会运行任何 PAM 会话� ?�。


若是sudoers 条款被写入允许用户以除 root 身份以表的用户身份运行号令,则可利用该 bug 绕过该限度。例如,给定如下 sudoers 条款:


myhost bob = (ALL, !root) /usr/bin/vi


用户 bob 被允许以除了 root以表的其它用户身份运行 vi。然而,由于存在该缝隙,bob 现实上可能通过运行 sudo –u#-1 vi 的方式以 root 身份运行 vi,从而违反了安全战术。只有Runas 规范中存在关键字 ALL 的sudoers 条款受影响。例如,如下sudoers 条款并不受影响:


myhost alice = /usr/bin/id


在这个例子中,alice仅被允许以 root身份运行 id 号令。任何以其它用户身份运行该号令的尝试都将遭回绝。


此缝隙是治理员在配置文件中用了ALL关键词后造成的。但默认的sudo配置文件不受影响。


缝隙验证


复现环境:


宝运莱·(中国区)最新官方网站



当/etc/sudoers文件存在如下大局的配置会导致缝隙的产生:


宝运莱·(中国区)最新官方网站


宝运莱·(中国区)最新官方网站



建复建议


官方已经推出安全更新,请更新至1.8.28版本:https://www.sudo.ws/download.html。


以下为各厂商给出的布告及建议:


Red Hat Enterprise Linux / CentOS

https://access.redhat.com/security/cve/CVE-2019-14287


Ubuntu

https://people.canonical.com/~ubuntu-security/cve/2019/CVE-2019-14287.html


SUSE / openSUSE

https://www.suse.com/security/cve/CVE-2019-14287.html


参考链接


https://www.sudo.ws/alerts/minus_1_uid.html