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