今天,著名的Linux安全工具sudo被发现存在严重的基于堆的缓冲区溢出漏洞,任何本地用户都可以利用该漏洞。它的发现者将其命名为“BaronSamedit”。即使用户未在sudoers文件中列出,也可以利用此漏洞升级到root用户。利用此漏洞不需要用户身份验证。此漏洞已分配为CVE-2021-3156,风险评分为7。概述在sudo中发现了一个缺陷。在sudo解析命令行参数的方式中发现了基于堆的缓冲区溢出。任何本地用户(普通用户和系统用户,sudoers和非sudoers)都可以在不需要身份验证的情况下利用这个漏洞(即攻击者不需要知道用户的密码),利用这个漏洞可以为普通用户提供无差别的漏洞对数据机密性和完整性以及系统可用性构成严重威胁。漏洞详情当sudo通过-s或-i命令行选项以shell模式运行命令时,它会在命令参数中使用反斜杠转义特殊字符。如果该命令在shell模式下运行,则sudoers-policy插件将在评估sudoers策略(不需要转义字符)之前从参数中删除转义字符。如果代码中的错误以未转义的反斜杠字符结尾,那么它会消除字符串最后一个字符之外的转义字符的错误。在正常情况下,该错误是无害的,因为sudo会转义命令参数中的所有反斜杠。但是,由于命令行解析代码中的逻辑错误,可以使用-s或-i选项运行sudoedit并设置一个标志,指示启用shell模式。因为实际上没有运行任何命令,所以sudo不会转义特殊字符。最后,决定是否删除转义字符的代码不检查命令是否实际运行,只检查shell标志是否已设置。有关详细信息,请参阅Qualys咨询(blog.qualys.com/vulnerabilities-research/2021/01/26/cve-2021-3156-heap-based-buffer-overflow-in-sudo-baron-samedit)。漏洞验证普通用户登录,在shell界面执行:sudoedit-s/如果输出为:usage:sudoedit[-AknS][-rrole][-ttype][-Cnum][-Ddirectory][-ggroup][-hhost][-pprompt][-Rdirectory][-Ttimeout][-uuser]file...系统不受影响或漏洞已修复。如果输出为:sudoedit://notaregularfile,说明系统存在该漏洞。受影响的版本Sudo1.8.2到1.8.31p2和1.9.0到1.9.5p1受到影响。根据RedHat官方调查:RedHatEnterpriseEdition6、7、8(对应centos6、7、8)、OpenShiftContainerPlatform4.4.、4.5、4.6版本均受到影响。解决方案安装Sudo1.9.5p2版本或补丁供应商支持的版本。RedHat官方已经针对该漏洞发布了补丁(国内镜像可能会在一天后同步),可以直接通过yum升级:yumupdatesudo对于Cent7,笔者在1.8.23-10.1版本(10.e17_9.1)。升级后可使用rpm-qisudo对应如下:缓解措施针对无法更新的用户,RedHat官方发布了漏洞缓解方法,推荐使用systemtap进行缓解:(1)安装所需的systemtap软件包,并依赖项:systemtapyum-utilskernel-devel-"$(uname-r)"然后对于RHEL7,安装内核:debuginfo-install-ykernel-"$(uname-r)"然后对于RHEL8,安装:debuginfo-安装sudo(2)创建以下systemtap脚本:(调用文件sudoedit-block.stap)probeprocess("/usr/bin/sudo").function("main"){command=cmdline_args(0,0,"");if(strpos(command,"edit")>=0){raise(9);}}(3)使用以下命令安装脚本(root执行):nohupstap-gsudoedit-block.stap&(这将输出systemtap脚本的PID号)该脚本将导致易受攻击的sudoedit二进制文件停止工作。sudo命令仍将照常工作。上述更改不会在重新启动后持续存在,需要重新启动才能继续。(4)安装新的固定包后,可以通过杀死systemtap进程来删除systemtap脚本。例如,通过使用以下命令:kill-sSIGTERM7590(其中7590是systemtap进程的PID)
