Linux sudo許可權提升漏洞(CVE-2019-14287)
- 2019 年 11 月 11 日
- 筆記
目錄
0x01 漏洞介紹
0x02 漏洞影響
0x03 漏洞復現
0x04 漏洞細節
0x05 參考
0x01 漏洞介紹
此漏洞可以使受限制的用戶運行root命令
0x02 漏洞影響
1.8.28之前的sudo版本均會受到影響
此漏洞的利用需要使用戶具有sudo的許可權
0x03 漏洞復現

0x04 漏洞細節
因為需要用戶擁有root許可權,這也意味著用戶的sudoers中的runas說明符中具有特殊值ALL
我們這裡來查看一下/etc/sudoers

授權用戶/組 主機=[(切換到哪些用戶或組)][是否需要輸入密碼驗證] 命令1,命令2
第一個欄位中,不以%開頭的,代表「將要授權的用戶」,例如其中的root;以%開頭的表示「將要授權的組」,比如其中的%admin、%sudo
第二個欄位表示允許登陸的主機,ALL表示所有,這裡指明的是用戶可以在哪些伺服器上登陸本伺服器來執行sudo命令,比如
wuxin ALL=/usr/sbin/reboot,/usr/sbin/shutdown
表示的是普通用戶wuxin在所有主機上,都可以通過sudo運行reboot和shutdown兩個命令
第三個欄位如果省略的話,表示切換到root用戶,如果為ALL,則表示可以切換到任何用戶,裡面的(ALL:ALL)表示的是允許切換到任何(用戶:組)
PS:如果沒有省略,必須使用括弧將兩個值括起來
第四個參數為NOPASSWD,這個文件中的這個省略掉了,意味著都是需要密碼來進行操作的,如果為下面這個樣子就不需要輸入密碼了
wuxin ALL=(ALL:ALL) NOPASSWD:ALL
第五個參數為授權操作的命令,如果值為ALL的話,就可以執行任意的命令了
這裡解釋了這麼多,也就是說明了我們這個環境下的所有的用戶都是可以執行sudo的。
在這種情況下,我們就可以使用#uid語法以任意用戶ID來運行它
例如執行
sudo -u#1234 id -u
將會返回1234

但是sudo執行前用於更改用戶ID的setresuid(2)和setreuid(2),特別對待用戶ID-1(或其等效的4294967295),不會更改此用戶的ID值,實際上他們返回的值為0

這是因為sudo本身已經用用戶ID 0運行,因此在嘗試更改用戶ID為-1時,是不會發生任何更改的,另外由於通過-u指定的用戶ID在密碼資料庫是不存在的,因此不會允許任何PAM會話模組
0x05 參考
https://www.sudo.ws/alerts/minus_1_uid.html