sudo報嚴重緩沖區溢出漏洞,可致無差別提權
今日,著名Linux安全工具sudo被發現應嚴重的基于堆緩沖區溢出,任何本地用戶都可以利用該溢出。它的發現者將其命名為"Baron Samedit"。即使未在sudoers文件中列出用戶,也可以利用該錯誤進行提權獲得root用戶用戶。利用該漏洞不需要用戶認證,此漏洞已分配為CVE-2021-3156,危險等級評分為7分。
概述
在sudo中發現一個缺陷。在sudo解析命令行參數的方式中發現了基于堆的緩沖區溢出。任何本地用戶(普通用戶和系統用戶,sudoers和非sudoers)都可以利用此漏洞,而無需進行身份驗證(即,攻擊者不需要知道用戶的密碼),利用此漏洞可以用于普通用戶無差別提權,漏洞對數據機密性和完整性以及系統可用性帶來嚴重威脅。
漏洞細節
當sudo通過-s或-i命令行選項在shell模式下運行命令時,它將在命令參數中使用反斜杠轉義特殊字符。如果命令在外殼模式下運行,那么sudoers策略插件將在評估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] [-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
對應如下:
減輕
對無法更新的用戶,紅帽官方發布了漏洞減緩方法,建議使用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)