Chipzilla手冊更新,請及時(shí)打上補(bǔ)丁。
Linux、Windows、macOS、FreeBSD和Xen的某些實(shí)現(xiàn)都存在設(shè)計(jì)缺陷,攻擊者可利用該缺陷導(dǎo)致英特爾和AMD計(jì)算機(jī)系統(tǒng)崩潰。
更糟的情況是,黑客還有可能獲取到敏感內(nèi)存信息或控制底層操作系統(tǒng)功能,也就是能窺探內(nèi)核內(nèi)存或劫持機(jī)器運(yùn)行的關(guān)鍵代碼。
惡意登錄用戶或計(jì)算機(jī)上運(yùn)行的惡意軟件都可以利用該漏洞。不過,這一幾乎波及全行業(yè)范圍的編程缺陷目前已有可用補(bǔ)丁加以緩解。
5月8號(hào)CERT發(fā)布的公告稱,該編號(hào)為CVE-2018-8897的安全漏洞,是因?yàn)槲④洝⑻O果和其他公司錯(cuò)誤理解了英特爾和AMD芯片處理某一特定異常的方式。
CERT寫道:“該錯(cuò)誤似乎是因開發(fā)人員對(duì)現(xiàn)有文檔的解釋而產(chǎn)生的。”換句話說,程序員理解錯(cuò)了英特爾和AMD的手冊,雖然這些手冊可能寫得不是特別清楚。
觸發(fā)中斷
問題的核心是 POP SS 指令。該指令從當(dāng)前程序的堆棧取得用于堆段選擇的值,并將該值放入CPU的堆棧選擇寄存器。但現(xiàn)代操作系統(tǒng)大多忽略了內(nèi)存分段問題。CPU會(huì)特別處理 POP SS 指令,以便執(zhí)行中遇到中斷時(shí)堆棧能保持一致狀態(tài)。
應(yīng)用程序可為堆棧選擇器即將被 POP SS 指令從堆棧中取出的內(nèi)存位置設(shè)置調(diào)試斷點(diǎn)。設(shè)置了該調(diào)試斷點(diǎn)后,當(dāng)應(yīng)用程序調(diào)用 POP SS 指令時(shí),只要處理器訪問RAM特定位置讀取該堆棧選擇器,就會(huì)拋出一個(gè)特殊異常。
問題就出在這兒。要利用這一情況,緊跟在 POP SS 指令后的那條指令必須是觸發(fā)中斷的INT指令。這些由軟件產(chǎn)生的中斷有時(shí)候是用戶程序用以激活內(nèi)核,讓內(nèi)核為當(dāng)前進(jìn)程干活的,比如打開個(gè)文件之類。
在英特爾和AMD機(jī)器上,緊跟在 POP SS 后面的軟中斷指令會(huì)讓處理器進(jìn)入內(nèi)核的中斷處理過程。然后調(diào)試異常就出現(xiàn)了,因?yàn)?POP SS 導(dǎo)致該異常被延遲。
操作系統(tǒng)設(shè)計(jì)者并沒有預(yù)期到這一點(diǎn)。他們閱讀英特爾的x86-64手冊,認(rèn)為內(nèi)核中斷處理過程是在不可中斷的狀態(tài)下開始的。但如今,中斷處理過程在初期就遭遇到了非預(yù)期的調(diào)試異常。
漏洞發(fā)現(xiàn)者的技術(shù)報(bào)告中解釋稱,這導(dǎo)致了內(nèi)核的混亂,特定情況下,內(nèi)核的動(dòng)作完全依賴于非特權(quán)用戶所控制的數(shù)據(jù)。
如果 POP SS 指令執(zhí)行時(shí)調(diào)試寄存器設(shè)置了堆棧位置訪問的斷點(diǎn),且緊跟的指令就是 INT N,那么在進(jìn)入中斷門之后,掛起的 #DB 就會(huì)被觸發(fā),因?yàn)槟鞘亲钣锌赡艿姆种е噶睢2皇遣豢善帘蔚闹袛啵膊皇菣C(jī)器檢查異常,操作系統(tǒng)開發(fā)人員直接為中斷門語義假定了一個(gè)不可中斷的狀態(tài)。這會(huì)導(dǎo)致操作系統(tǒng)監(jiān)管軟件在設(shè)計(jì)時(shí)出現(xiàn)漏洞,使用中可能會(huì)錯(cuò)誤地采用了非特權(quán)軟件選擇的狀態(tài)信息。
這是操作系統(tǒng)提供商因?yàn)?POP SS 指令及其與中斷門語義互動(dòng)的文檔不清晰不完整而犯下的嚴(yán)重安全疏漏。
其結(jié)果就是,在英特爾主機(jī)上,用戶應(yīng)用程序可使用 POP SS 和 INT 指令來利用上述的錯(cuò)誤理解,控制中斷處理過程中的特殊指針GSBASE;而AMD主機(jī)上,應(yīng)用程序可控制GSBASE和堆棧指針。黑客可利用該漏洞觸及未分配內(nèi)存,抽取部分受保護(hù)內(nèi)核內(nèi)存,最終使內(nèi)核崩潰;或者調(diào)整其內(nèi)部結(jié)構(gòu),擾亂系統(tǒng)運(yùn)行。
雖然任何漏洞利用嘗試都更容易搞崩內(nèi)核而不是引起什么嚴(yán)重傷害,但是與熔斷之類的漏洞一樣,這是整個(gè)行業(yè)的恥辱,應(yīng)該盡快被補(bǔ)上。
操縱
FreeBSD對(duì)該問題的解釋則更進(jìn)一步:“在x86架構(gòu)的系統(tǒng)上,堆棧是由堆棧段和堆棧指針共同表示的,其正常運(yùn)行需要二者協(xié)調(diào)一致。操作堆棧段的指令有特殊的處理過程來保持與堆棧指針的改變相一致。”
MOV SS 和 POP SS 指令會(huì)抑制調(diào)試異常直到下一條指令的邊界。如果該指令是一條系統(tǒng)調(diào)用或者將控制傳遞到操作系統(tǒng)的類似指令,調(diào)試異常就會(huì)在內(nèi)核環(huán)境中處理,而不是在用戶環(huán)境中處理。
其結(jié)果就是通過了身份驗(yàn)證的本地攻擊者可以讀取到內(nèi)核內(nèi)存中的敏感數(shù)據(jù),控制底層操作系統(tǒng)功能,或者直接搞崩系統(tǒng)。
微軟的內(nèi)核建議表明,在Windows主機(jī)上利用該漏洞,需要攻擊者先登錄到系統(tǒng),再運(yùn)行精心制作的應(yīng)用程序以奪取受影響系統(tǒng)的控制權(quán)。
這并非危言聳聽,除非你的主機(jī)上從來都不運(yùn)行任何不可信的代碼。
Red Hat 已經(jīng)準(zhǔn)備好放出補(bǔ)丁,Ubuntu和macOS同樣做好了補(bǔ)丁準(zhǔn)備。
Linux內(nèi)核早在 2018年3月23號(hào)就打上了補(bǔ)丁,版本4.15.14、4.14.31、4.9.91、4.4.125以及更老的4.1、3.16和3.2都已修復(fù)。
微軟也解決了該問題,補(bǔ)丁覆蓋 Windows 7 到 Windows 10,Windows Server 2008 到 Windows Server 1803。Xen為版本4.6到4.10打了補(bǔ)丁。VMware的虛擬機(jī)管理程序沒有風(fēng)險(xiǎn),但 vCenter Server 的一個(gè)工作區(qū)和vSphere集成的容器需要打補(bǔ)丁,但都只是“可能”受影響。
所有資料來源都痛苦地指出,雖然該問題源自x86-64指令集,但需承擔(dān)責(zé)任的卻是內(nèi)核程序員而(不是Chipzilla)。似乎是很多程序員都理解錯(cuò)了調(diào)試異常的處理方法,在很長一段時(shí)間里重復(fù)著相同的錯(cuò)誤。
既然英特爾已經(jīng)更新手冊澄清了堆棧選擇器指令的處理方式,或許大量操作系統(tǒng)開發(fā)人員都得去重新學(xué)習(xí)x86-64架構(gòu)。用戶也得緊急修復(fù)自己的系統(tǒng)——這種事如今用戶應(yīng)該已經(jīng)非常習(xí)慣了。
英特爾發(fā)言人稱:
我們重視客戶和合作伙伴的安全。 為確保與開發(fā)者社區(qū)的明晰溝通,我們更新了《軟件開發(fā)者手冊》(SDM),澄清了 POP/MOV-SS 指令的安全用法。我們建議系統(tǒng)軟件廠商評(píng)估其軟件以證實(shí)自身產(chǎn)品能處理上述問題。