sudo報嚴(yán)重緩沖區(qū)溢出漏洞,可致無差別提權(quán)
今日,著名Linux安全工具sudo被發(fā)現(xiàn)應(yīng)嚴(yán)重的基于堆緩沖區(qū)溢出,任何本地用戶都可以利用該溢出。它的發(fā)現(xiàn)者將其命名為"Baron Samedit"。即使未在sudoers文件中列出用戶,也可以利用該錯誤進(jìn)行提權(quán)獲得root用戶用戶。利用該漏洞不需要用戶認(rèn)證,此漏洞已分配為CVE-2021-3156,危險等級評分為7分。
概述
在sudo中發(fā)現(xiàn)一個缺陷。在sudo解析命令行參數(shù)的方式中發(fā)現(xiàn)了基于堆的緩沖區(qū)溢出。任何本地用戶(普通用戶和系統(tǒng)用戶,sudoers和非sudoers)都可以利用此漏洞,而無需進(jìn)行身份驗證(即,攻擊者不需要知道用戶的密碼),利用此漏洞可以用于普通用戶無差別提權(quán),漏洞對數(shù)據(jù)機(jī)密性和完整性以及系統(tǒng)可用性帶來嚴(yán)重威脅。
漏洞細(xì)節(jié)
當(dāng)sudo通過-s或-i命令行選項在shell模式下運(yùn)行命令時,它將在命令參數(shù)中使用反斜杠轉(zhuǎn)義特殊字符。如果命令在外殼模式下運(yùn)行,那么sudoers策略插件將在評估sudoers策略(不希望使用轉(zhuǎn)義字符)之前從參數(shù)中刪除轉(zhuǎn)義字符。
如果代碼中的錯誤以未轉(zhuǎn)義的反斜杠字符結(jié)尾,那么它將刪除轉(zhuǎn)義字符的錯誤會超出字符串的最后一個字符。在正常情況下,該錯誤將是無害的,因為sudo對命令參數(shù)中的所有反斜杠進(jìn)行了轉(zhuǎn)義。但是,由于在命令行解析代碼中存在一個邏輯錯誤,導(dǎo)致可以使用-s或-i選項運(yùn)行sudoedit,并設(shè)置一個指示啟用Shell模式的標(biāo)志。因為實(shí)際上沒有運(yùn)行命令,所以sudo不會轉(zhuǎn)義特殊字符。最后,決定是否刪除轉(zhuǎn)義符的代碼并沒有檢查命令是否正在實(shí)際運(yùn)行,僅檢查了設(shè)置了shell標(biāo)志。
有關(guān)更多信息,請參閱Qualys通報
(blog.qualys.com/vulnerabilities-research/2021/01/26/cve-2021-3156-heap-based-buffer-overflow-in-sudo-baron-samedit)。
漏洞驗證
用普通用戶登陸,在shell界面執(zhí)行:
- 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 ...
則系統(tǒng)不受影響或者已經(jīng)修復(fù)了漏洞。
如果輸出為:
- sudoedit: /: not a regular file
則表示系統(tǒng)存在該漏洞。
受影響版本
Sudo 1.8.2到1.8.31p2和1.9.0到1.9.5p1均會受到影響。
根據(jù)紅帽子官方調(diào)查:
紅帽子企業(yè)版 6,7,8版本(對應(yīng)centos 6,7 ,8),OpenShift容器平臺 4.4.,4.5,4.6 版本均受影響
解決方法
安裝Sudo 1.9.5p2版本或修補(bǔ)的供應(yīng)商支持的版本。
紅帽官方已經(jīng)發(fā)布漏洞補(bǔ)丁(國內(nèi)鏡像可能要一天后同步到),可以直接通過yum升級:
- yum update sudo
對于Cent 7,筆者測試在 1.8.23-10.1(10.e17_9.1)版本中解決,升級后可以用
- rpm -qi sudo
對應(yīng)如下:
減輕
對無法更新的用戶,紅帽官方發(fā)布了漏洞減緩方法,建議使用systemtap進(jìn)行緩解:
(1) 安裝所需的systemtap軟件包和依賴項:
- systemtap yum-utils kernel-devel-"$(uname -r)"
然后對于RHEL 7,使用以下命令安裝內(nèi)核:
- debuginfo-install -y kernel-"$(uname -r)"
然后對于RHEL 8,使用以下命令安裝:
- debuginfo-install sudo
(2) 創(chuàng)建以下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執(zhí)行):
- nohup stap -g sudoedit-block.stap &
(這將輸出systemtap腳本的PID編號)
該腳本將導(dǎo)致易受攻擊的sudoedit二進(jìn)制文件停止工作。sudo命令仍將照常工作。上述更改在重啟后不會持久存在,需要重啟繼續(xù)執(zhí)行。
(4) 一旦安裝了新的固定軟件包,就可以通過終止systemtap進(jìn)程來刪除systemtap腳本。例如,通過使用以下命令:
- kill -s SIGTERM 7590
(其中7590是systemtap進(jìn)程的PID)