5

sudo报严重缓冲区溢出漏洞,可致无差别提权

 3 years ago
source link: http://netsecurity.51cto.com/art/202101/643199.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今日,著名Linux安全工具sudo被发现应严重的基于堆缓冲区溢出,任何本地用户都可以利用该溢出。它的发现者将其命名为"Baron Samedit"。即使未在sudoers文件中列出用户,也可以利用该错误进行提权获得root用户用户。利用该漏洞不需要用户认证,此漏洞已分配为CVE-2021-3156,危险等级评分为7分。

qaYVR3b.png!mobile

概述

在sudo中发现一个缺陷。在sudo解析命令行参数的方式中发现了基于堆的缓冲区溢出。任何本地用户(普通用户和系统用户,sudoers和非sudoers)都可以利用此漏洞,而无需进行身份验证(即,攻击者不需要知道用户的密码),利用此漏洞可以用于普通用户无差别提权,漏洞对数据机密性和完整性以及系统可用性带来严重威胁。

漏洞细节

当sudo通过-s或-i命令行选项在shell模式下运行命令时,它将在命令参数中使用反斜杠转义特殊字符。如果命令在外壳模式下运行,那么sudoers策略插件将在评估sudoers策略(不希望使用转义字符)之前从参数中删除转义字符。

如果代码中的错误以未转义的反斜杠字符结尾,那么它将删除转义字符的错误会超出字符串的最后一个字符。在正常情况下,该错误将是无害的,因为sudo对命令参数中的所有反斜杠进行了转义。但是,由于在命令行解析代码中存在一个逻辑错误,导致可以使用-s或-i选项运行sudoedit,并设置一个指示启用Shell模式的标志。因为实际上没有运行命令,所以sudo不会转义特殊字符。最后,决定是否删除转义符的代码并没有检查命令是否正在实际运行,仅检查了设置了shell标志。

aQ7zeqE.png!mobile

有关更多信息,请参阅Qualys通报

(blog.qualys.com/vulnerabilities-research/2021/01/26/cve-2021-3156-heap-based-buffer-overflow-in-sudo-baron-samedit)。

zYJbUfq.png!mobile

漏洞验证

用普通用户登陆,在shell界面执行:

sudoedit -s / 

如果输出为:

usage: sudoedit [-AknS] [-r role] [-t type] [-C num] [-D directory] [-g group] 
                [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] 
                file ... 

则系统不受影响或者已经修复了漏洞。

如果输出为:

sudoedit: /: not a regular file 

则表示系统存在该漏洞。

受影响版本

Sudo 1.8.2到1.8.31p2和1.9.0到1.9.5p1均会受到影响。

根据红帽子官方调查:

红帽子企业版 6,7,8版本(对应centos 6,7 ,8),OpenShift容器平台 4.4.,4.5,4.6 版本均受影响

解决方法

安装Sudo 1.9.5p2版本或修补的供应商支持的版本。

红帽官方已经发布漏洞补丁(国内镜像可能要一天后同步到),可以直接通过yum升级:

yum update sudo 

对于Cent 7,笔者测试在 1.8.23-10.1(10.e17_9.1)版本中解决,升级后可以用

rpm -qi sudo 

对应如下:

BfaMbyj.png!mobile

bmuEV3V.png!mobile

减轻

对无法更新的用户,红帽官方发布了漏洞减缓方法,建议使用systemtap进行缓解:

(1) 安装所需的systemtap软件包和依赖项:

systemtap yum-utils kernel-devel-"$(uname -r)" 

然后对于RHEL 7,使用以下命令安装内核:

debuginfo-install -y kernel-"$(uname -r)" 

然后对于RHEL 8,使用以下命令安装:

debuginfo-install sudo 

(2) 创建以下systemtap脚本:(将文件称为sudoedit-block.stap)

probe process("/usr/bin/sudo").function("main") { 
command = cmdline_args(0,0,""); 
if (strpos(command, "edit") >= 0) { 
raise(9); 
} 
} 

(3) 使用以下命令安装脚本(root执行):

nohup stap -g sudoedit-block.stap & 

(这将输出systemtap脚本的PID编号)

该脚本将导致易受攻击的sudoedit二进制文件停止工作。sudo命令仍将照常工作。上述更改在重启后不会持久存在,需要重启继续执行。

(4) 一旦安装了新的固定软件包,就可以通过终止systemtap进程来删除systemtap脚本。例如,通过使用以下命令:

kill -s SIGTERM 7590 

(其中7590是systemtap进程的PID)

【责任编辑:赵宁宁 TEL:(010)68476606】


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK