跳转到帖子

Sudo Baron Samedit(CVE-2021-3156)本地提权漏洞排查与修复

精选回复

发布于

漏洞背景CVE-2021-3156,常称 Baron Samedit,是 sudo 在命令行参数解析过程中产生的堆缓冲区溢出漏洞。攻击者只要取得 Linux 或类 Unix 系统的普通本地账户,便可能利用该漏洞突破 sudoers 权限边界并获得 root 权限;账户本身不需要被授予 sudo 权限。该问题影响 sudo 1.8.2 至 1.8.31p2,以及 1.9.0 至 1.9.5p1。上游修复版本为 1.8.32、1.9.5p2 及之后版本,但发行版通常会将补丁回移到旧版本,因此不能只根据上游版本号判断是否存在漏洞,应同时核对发行版安全公告和软件包修订号。以下操作仅用于已授权主机的漏洞确认。生产环境优先采用软件包版本和厂商公告进行无损排查,不建议直接运行公开利用程序。问题定位该漏洞位于 sudo 对 sudoedit 模式参数的处理路径中。当程序以 sudoedit 方式运行,并配合特定命令行选项时,参数中的反斜杠转义与缓冲区长度计算不一致,可能导致数据越界写入堆内存。风险链路通常表现为:攻击者先通过弱口令、Web 漏洞或泄露密钥取得普通 shell,再利用本漏洞跨越本地权限边界。由于提权发生在主机内部,外围 WAF 或网络访问控制无法直接阻断。技术分析漏洞类型:堆缓冲区溢出。利用前提:具备本地命令执行能力,无需位于 sudoers 列表。主要影响:普通用户提权至 root,继而读取凭据、修改系统服务或清理日志。关键程序:通常为带 SUID 位的 /usr/bin/sudo 与指向它的 sudoedit。常见误区:sudo -l 显示用户无权限,并不代表该漏洞不可利用。sudo 会依据 argv[0] 或相关模式进入 sudoedit 处理流程。漏洞版本在复制经过转义处理的参数时,可能继续写入超出目标堆缓冲区的内容。实际利用通常还会结合环境变量影响后续堆对象,但在漏洞库排查中没有必要部署完整利用链;确认受影响的软件包并验证补丁状态即可形成可靠结论。无损排查步骤首先确认 sudo 的真实路径、版本、SUID 权限以及软件包来源:command -v sudo
readlink -f "$(command -v sudo)"
sudo --version | head -n 3
ls -l /usr/bin/sudo /usr/bin/sudoedit 2>/dev/null

# Debian / Ubuntu
dpkg-query -W -f='${Package} ${Version}\n' sudo 2>/dev/null
apt-cache policy sudo 2>/dev/null

# RHEL / CentOS / Rocky / AlmaLinux
rpm -q sudo 2>/dev/null
rpm -q --changelog sudo 2>/dev/null | grep -i -m 3 'CVE-2021-3156\|Baron'

yum updateinfo info --cves CVE-2021-3156 2>/dev/null || true随后核对发行版公告。判断依据应是“当前软件包修订版是否包含 CVE-2021-3156 回移补丁”,而不是简单比较 sudo --version 输出。例如,发行版包可能仍显示 1.8.31,但其 release 字段已包含安全修复。若必须做运行时验证,应安排维护窗口并限制在测试主机。公开的最小触发方式可能导致 sudo 进程异常退出,并在系统日志或内核日志中留下堆损坏信息,因此不应在高可用节点批量执行。优先使用供应商提供的检测脚本,并校验脚本来源与哈希。补丁状态与完整性检查更新后重新读取包版本,并验证关键文件未被替换。以下命令不会验证漏洞可利用性,但能发现补丁未生效、文件被手工覆盖或包完整性异常等问题:# Debian / Ubuntu
sudo apt-get update
sudo apt-get install --only-upgrade sudo
dpkg-query -W -f='${Version}\n' sudo
dpkg -V sudo

# RHEL 系列
sudo dnf upgrade sudo
rpm -q sudo
rpm -V sudo

# 检查进程实际加载的文件及文件时间
stat /usr/bin/sudo
sha256sum /usr/bin/sudo
getcap /usr/bin/sudo 2>/dev/null
ls -l /usr/bin/sudo正常情况下,sudo 通常依赖 SUID root 权限工作,不能把“删除 SUID 位”作为长期通用修复,否则可能破坏运维流程。确需临时缓解时,应先确认已有 root 控制台、带外管理或其他可靠管理通道,并评估自动化任务是否依赖 sudo。日志留痕与入侵排查漏洞本身不会生成唯一且稳定的利用特征。排查时应综合 sudo 日志、认证日志、进程执行审计、异常 root 文件和持久化配置。重点关注普通用户会话后紧接出现的 root shell、sudoedit 异常退出、堆损坏提示以及非预期 SUID 文件。# Debian / Ubuntu
zgrep -Ei 'sudoedit|sudo:|segfault|malloc|corrupt' /var/log/auth.log* 2>/dev/null

# systemd 日志
journalctl --since '7 days ago' | grep -Ei 'sudoedit|sudo.*segfault|malloc|corrupt'
journalctl _COMM=sudo --since '7 days ago'

# 内核异常记录
dmesg -T | grep -Ei 'sudo|segfault|general protection|corrupt'

# 查找近期新增或修改的 SUID 文件
find / -xdev -perm -4000 -type f -mtime -30 -ls 2>/dev/null

# 检查常见持久化位置
find /etc/systemd/system /etc/cron.d /var/spool/cron -type f -mtime -30 -ls 2>/dev/null如果主机已部署 auditd,可临时增加 sudo 执行监控。规则应在评估日志量后上线,避免繁忙服务器产生过多事件:auditctl -w /usr/bin/sudo -p x -k sudo_exec
auditctl -w /usr/bin/sudoedit -p x -k sudoedit_exec

ausearch -k sudo_exec -i
ausearch -k sudoedit_exec -i

# 排查结束后删除临时规则
auditctl -W /usr/bin/sudo -p x -k sudo_exec
auditctl -W /usr/bin/sudoedit -p x -k sudoedit_exec若发现疑似成功提权,不应只升级 sudo 后直接恢复业务。应隔离主机,保全 journal、audit、auth.log、进程列表和磁盘时间线,并轮换该主机可访问的 SSH 密钥、服务账号口令、云凭据及配置中心令牌。root 权限失陷意味着本机日志也可能被修改,需要结合集中日志、堡垒机和网络侧记录交叉验证。修复与加固建议通过发行版官方仓库安装包含 CVE-2021-3156 修复的 sudo 软件包,避免来源不明的二进制替换。补丁后同时检查软件包完整性与 /usr/bin/sudo 的实际文件时间,防止旧文件被配置管理工具回滚。清理不必要的本地账户、过期 SSH 公钥和共享运维账号,降低攻击者取得本地执行入口的概率。将 sudo、认证和 audit 日志发送至集中日志平台,避免主机提权后日志被本地删除。复核 sudoers 中的 NOPASSWD、通配符、可写脚本和编辑器配置。修复本 CVE 不等于消除其他 sudo 权限绕过路径。对暂时无法更新的遗留系统实施隔离,限制交互式登录,并制定明确的升级时间;临时措施不能替代补丁。总结CVE-2021-3156 的核心风险不是远程直接入侵,而是攻击者获得普通 shell 后突破 root 权限边界。漏洞确认应以发行版安全公告和软件包修订号为主,运行时触发仅适合隔离测试环境。处置时除升级 sudo 外,还要检查异常提权痕迹、持久化配置及凭据暴露范围,才能完整闭环。

服务器与云环境安全示意图
服务器、云资产与权限边界梳理示意
漏洞验证与修复流程示意图
漏洞成因、验证条件与修复闭环示意

这类漏洞排查不要只看 sudo --version 是否低于 1.9.5p2,很多发行版会在原版本号上回补补丁,应以发行版安全公告和包修订号为准。

先确认实际安装包及来源:

# Debian / Ubuntu
sudo --version | head -n1
dpkg-query -W -f='${Package} ${Version} ${Status}\n' sudo
apt-cache policy sudo
zgrep -i 'CVE-2021-3156' /usr/share/doc/sudo/changelog.Debian.gz 2>/dev/null

# RHEL / CentOS / Rocky / Alma
sudo --version | head -n1
rpm -q sudo
rpm -q --changelog sudo | grep -i -m1 'CVE-2021-3156'
dnf updateinfo info --cves CVE-2021-3156 2>/dev/null || \
yum updateinfo info --cves CVE-2021-3156

# SUSE
rpm -q sudo
zypper lp --cve CVE-2021-3156

上游受影响范围主要是 1.8.2–1.8.31p2 和 1.9.0–1.9.5p1,但不能直接套这个范围判断发行版包。例如 Ubuntu、RHEL 的修复包可能仍显示较旧的上游版本,只是带有新的发行版 release。

修复建议直接升级发行版提供的安全包,不建议通过复现 PoC、制造崩溃来判定:

# Debian / Ubuntu
apt-get update
apt-get install --only-upgrade sudo

# RHEL 系
dnf upgrade sudo
# 老系统
yum update sudo

# SUSE
zypper update sudo

# 升级后再次确认
sudo --version
stat /usr/bin/sudo
rpm -V sudo 2>/dev/null || dpkg -V sudo 2>/dev/null

如果暂时无法升级,可以移除 sudo 的 SUID 位作为应急止血,但这会导致普通用户无法通过 sudo 提权,执行前要确保有 root 控制台、带外管理或其他恢复路径:

chmod 0755 /usr/bin/sudo
# 正式升级并验证后恢复;通常包升级也会恢复正确权限
chown root:root /usr/bin/sudo
chmod 4755 /usr/bin/sudo

仅修改 sudoers、禁用 sudoedit 规则并不能可靠缓解。该漏洞利用发生在策略校验前,攻击者也不必原本拥有 sudo 权限;只要能获得本地低权限 shell 就应视为有风险,尤其要关注已存在 Web Shell、CI Runner、共享主机账号和容器逃逸前置落点的机器。

事后排查方面,日志里没有稳定的成功利用特征,不能因为 auth.log 中没有 sudo 成功记录就判定安全。可结合漏洞暴露时间检查异常 root 文件、SUID 文件和持久化项:

# 最近变化的 SUID/SGID 文件
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f \
  -newermt '2021-01-26' -ls 2>/dev/null

# root 持有且近期修改的常见持久化位置
find /etc/cron* /var/spool/cron /etc/systemd/system /root/.ssh \
  -xdev -type f -newermt '2021-01-26' -ls 2>/dev/null

# 账号和 sudo 配置变化
stat /etc/passwd /etc/shadow /etc/group /etc/sudoers
find /etc/sudoers.d -type f -ls -exec sed -n '1,160p' {} \;

# Debian/Ubuntu 与 systemd 日志中的相关进程痕迹
zgrep -Ei 'sudoedit|sudo:|segfault.*sudo' /var/log/auth.log* /var/log/syslog* 2>/dev/null
journalctl --since '2021-01-26' | grep -Ei 'sudoedit|sudo.*segfault'

时间范围应按该主机实际补丁日期调整。若发现补丁前已有非可信用户落地、异常 SUID 或 root 持久化,建议按已失陷主机处理,而不是只升级 sudo 后继续使用。

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。