Ubuntu被曝嚴(yán)重漏洞:切換系統(tǒng)語言+輸入幾行命令,就能獲取root權(quán)限
無需系統(tǒng)密碼,就能添加新的sudo用戶、獲取root權(quán)限,事后還能刪除不留痕跡。
這是GitHub安全研究員Kevin Backhouse發(fā)現(xiàn)的一個Ubuntu系統(tǒng)大漏洞。
這種攻擊方法非常簡單,Backhouse在官方博客中寫道:“使用終端中的一些簡單命令,并單擊幾次鼠標(biāo),標(biāo)準(zhǔn)用戶就可以為自己創(chuàng)建一個管理員帳戶。”
目前還在維護(hù)的Ubuntu操作系統(tǒng)均受到影響,包括20.10以及20.04、18.04、16.04三個LTS版。
Backhouse是如何操作的?我們接著往下看。
攻擊方法
首先打開終端,在你的主目錄下創(chuàng)建一個軟鏈接:
- ln -s /dev/zero .pam_environment
(注:如果以上命令無法運(yùn)行,說明已經(jīng)存在名為.pam_environment的文件,請把這個文件重命名做好備份!)
接下來,在系統(tǒng)設(shè)置中打開“區(qū)域和語言”,然后嘗試更改語言。
該對話框會凍結(jié),只需忽略它,然后返回到終端即可。
此時(shí),一個名為accounts-daemon的程序正在消耗100%的CPU內(nèi)核,因此你的計(jì)算機(jī)可能會變慢并開始變熱。
在終端中,刪除軟鏈接。否則,你可能無法使用自己的帳戶!
- rm .pam_environment
下一步是將SIGSTOP信號發(fā)送到accounts-daemon,阻止它破壞該CPU內(nèi)核。但是要做到這一點(diǎn),首先需要知道accounts-daemon的PID。
你可以通過運(yùn)行top來找到PID。由于accounts-daemon被卡在一個無限循環(huán)中,因此它很快進(jìn)入top列表的頂部。
或者使用pidof命令來查找PID:
- $ pidof accounts-daemon
- 597
接著用kill命令殺死SIGSTOP信號:
- kill -SIGSTOP 597
然后注銷帳戶,但首先需要設(shè)置一個計(jì)時(shí)器,保證在注銷后重置accounts-daemon。否則,前面的努力都將白費(fèi)。
- nohup bash -c “sleep 30s; kill -SIGSEGV 597; kill -SIGCONT 597”
注銷后等待幾秒鐘,讓SIGSEGV起效。如果漏洞利用成功,則會顯示一系列對話框,讓你創(chuàng)建一個新的用戶帳戶。這個新帳戶具有管理員權(quán)限,可以運(yùn)行sudo命令。
攻擊原理
該漏洞利用了Ubuntu系統(tǒng)中的兩個錯誤:
- 第一個是accountservice,它是管理計(jì)算機(jī)上用戶帳戶的服務(wù)。
- 第二個是GNOME顯示管理器(gdm3),它可以處理登錄屏幕。
accounts-daemon漏洞
accountsservice守護(hù)程序(accounts-daemon)是一項(xiàng)系統(tǒng)服務(wù),可以執(zhí)行諸如創(chuàng)建新用戶帳戶或更改用戶密碼的操作,但也可以執(zhí)行對安全性較不敏感的操作,例如更改用戶的圖標(biāo)或首選語言。
Ubuntu使用了經(jīng)過修改的accountservice服務(wù)版本,添加了一個名為is_in_pam_environment的函數(shù),該函數(shù)會在用戶的主目錄中查找一個名為.pam_environment的文件并進(jìn)行讀取。
將.pam_environment鏈接到/dev/zero可以讓accountservice服務(wù)被拒絕。
因?yàn)?dev/zero實(shí)際上是磁盤上不存在的特殊文件。它由操作系統(tǒng)提供,其行為就像一個無限長的文件,其中每個字節(jié)均為0。
當(dāng)is_in_pam_environment嘗試讀取.pam_environment時(shí),它會通過軟鏈接重定向到/dev/zero,然后由于/dev/zero無限長而陷入無限循環(huán)。
如此操作會讓accounts-daemon喪失其root權(quán)限,轉(zhuǎn)而采用用戶的較低特權(quán)。然后將SIGSEGV發(fā)送給帳戶守護(hù)程序使其崩潰。
GNOME漏洞
GNOME顯示管理器(gdm3)是Ubuntu用戶界面的基本組件。它可以處理用戶登錄和注銷時(shí)啟動和停止用戶會話之類的事情,還管理登錄屏幕。
當(dāng)用戶進(jìn)行新系統(tǒng)的初始設(shè)置時(shí),會啟動一個對話框,它其實(shí)是一個單獨(dú)的應(yīng)用程序,稱為gnome-initial-setup。
當(dāng)gdm3查詢到用戶數(shù)量為0時(shí),會啟動這個程序。那么gdm3如何檢查系統(tǒng)上有多少用戶?通過詢問accounts-daemon!
不幸的是,accounts-daemon已經(jīng)被我們前面的操作整崩潰了,所以gdm3在檢查超時(shí)后認(rèn)為帳戶數(shù)量為0,并啟動gnome-initial-setup。
而初始化設(shè)置的用戶必須有管理員權(quán)限。
官方緊急修復(fù)
Backhouse于10月17日向Ubuntu和GNOME維護(hù)人員報(bào)告了這些錯誤,官方已經(jīng)最新代碼中提供了修復(fù)程序。建議所有Ubuntu用戶都盡快安裝更新。
不過,該漏洞僅對桌面版Ubuntu有效。如果使用的是命令行界面,或者是GNOME之外的其他桌面環(huán)境,則暫時(shí)不受影響。