信息來源:安全牛
程序員們匆忙上馬,徹底檢查開源Linux內核虛擬內存系統(tǒng)。同時,微軟有望在下一個周二更新日為Windows操作系統(tǒng)做出必要的修改:針對11月和12月推出的 Windows Insider Fast-ring 測試版。
基本上,Linux和Windows的這次更新都將對英特爾產品的性能產生影響。影響有多大尚有待衡量,但粗略估計會在5%-30%之間——依具體任務和處理器模型而定。更新一些有PCID之類功能的英特爾芯片可以減小性能損失。各用戶的情況不一而足。
因為缺陷出自英特爾x86-64硬件,且似乎微代碼更新無法解決該問題,所以類似的操作系統(tǒng)(如蘋果的64位macOS)也需要更新。要么在操作系統(tǒng)級軟件修復該問題,要么新買一塊不帶該設計缺陷的處理器,自己選吧!
該漏洞的細節(jié)目前尚未披露,大概會在微軟下周二的更新日適時推出吧。實際上,Linux內核的補丁已經推出,只是源代碼中抹去了注釋以防漏洞細節(jié)太過明顯。
不過,我們還是可以從中探得幾分究竟。
影響
據了解,該漏洞出現在過去10年中生產的現代英特爾處理器中,可令普通用戶程序——從數據庫應用到瀏覽器JavaScript腳本,在一定程度上獲悉受保護內核內存區(qū)域的布局或內容。
用內核頁表隔離(KPTI)技術將用戶進程與內核內存完全隔開可以解決該問題。事實上,Linux內核團隊曾一度考慮用中斷間接跳轉強制完全解除內核映射(FUCKWIT),這么極端的辦法都認真考慮過,可想而知這個漏洞給開發(fā)人員造成了多大的麻煩。
正在運行的程序無論什么時候想干點兒什么有用的事,比如寫個文件或者打開個網絡連接啥的,都得暫時將處理器控制權交給內核去執(zhí)行這些工作。為使用戶態(tài)和內核態(tài)之間的切換快速高效,即便程序本身看不到內核,內核還是會出現在所有進程的虛擬內存地址空間里。需要內核的時候,程序就執(zhí)行一個系統(tǒng)調用,處理器切換到內核模式。而在用戶態(tài)下,內核的代碼和數據對用戶不可見,但存在于進程的頁表里。
可以把內核比作天上的神仙,端坐云頭俯瞰大地。凡人看不到神仙,但是可以向神仙許愿。
KPTI補丁將內核放到一個完全隔離的地址空間,讓它不僅僅對進程不可見,甚至根本不在進程里了。其實本沒必要做到這一步,但很明顯,英特爾的芯片里確實出現了可令內核訪問防護機制被繞過的漏洞。
這一隔離方式的缺點就在于時間開銷太高昂了。每次系統(tǒng)調用都要在兩個隔離的地址空間來回倒騰,還有超級費時的硬件中斷,想想都讓人生無可戀。這些切換不會即時發(fā)生,還會導致處理器廢棄緩存的數據而去內存中重新加載信息。所有這些都會增加內核的開銷,拖慢計算機的速度。
黑客會怎么濫用這個安全漏洞呢?
至少,這個漏洞可以被惡意軟件用來更加容易地利用其他安全漏洞。
最壞情況的話,就是被程序和已登錄用戶利用來讀取內核內存里的內容了??傊闆r很不妙。內核內存空間之所以對用戶進程不可見,是因為它有可能含有各種各樣的秘密,比如口令、登錄密鑰、緩存的磁盤文件等等。不難想象,一旦瀏覽器里運行的JavaScript腳本,或者共享公共云服務器上的惡意軟件能夠嗅探內核中受保護的數據,那會是怎樣一個恐怖的場景。
尤其是,該漏洞可被濫用來擊潰KASLR(內核地址空間布局隨機化)——操作系統(tǒng)在虛擬內存的隨機位置部署內核組件的一種防御機制。該機制可挫敗濫用內核中其他漏洞的企圖:通常是漏洞利用代碼,尤其是面向返回編程的漏洞利用代碼——依賴對內存中已知位置的計算機指令的重用。
如果內核代碼在內存中的位置被隨機化了,漏洞利用代碼就找不到所需的內部組件,也就不能完全破壞系統(tǒng)了。該處理器設計缺陷有可能被用來找出內核在內存中存放其數據和代碼的位置,因此,必須趕緊打上軟件補丁。
然而,英特爾芯片中的漏洞有可能造成比上述緩解措施被繞過更糟糕的后果。圣誕節(jié)時,AMD給Linux內核郵件列表發(fā)了封電子郵件,稱AMD處理器不受該漏洞影響。然而,該郵件中的措辭實際上透露了該漏洞利用上的一些細節(jié):
AMD處理器不受內核代碼數據讀取攻擊的影響。AMD微架構不允許內存引用,包括猜測性的引用,也就是可導致頁面出錯的低權限模式下對高權限數據的訪問。
此處的關鍵詞是“猜測性”。英特爾之類現代處理器會進行猜測性代碼執(zhí)行——CPU盡最大努力猜測下一個要執(zhí)行的代碼是哪段并取來執(zhí)行,以使其內部管道布滿一系列應執(zhí)行的指令,提升CPU指令執(zhí)行的效率。
從上面AMD軟件工程師湯姆·蘭達基所述看來,英特爾CPU的猜測性代碼執(zhí)行很可能缺乏必要的安全檢查。似乎可以構造那么一種軟件,讓處理器開始執(zhí)行通常會被阻止的指令(比如以用戶態(tài)讀取內核內存),并在權限檢查發(fā)生前就將該指令執(zhí)行完畢。
這么做就可以使Ring3級用戶代碼能夠讀取Ring0級內核數據了。當然,這不是什么好事。
該漏洞的細節(jié)還有待證實,關于其嚴重性的討論也只是猜測,但考慮到Linux和Windows的大改,以及這些大幅更新推出的快速性,這一漏洞很可能比KASLR繞過更嚴重。
在Linux上隔離內核與用戶地址空間的更新,是在名為KAISER的補丁集上做出的。創(chuàng)建KAISER補丁集的奧地利格拉茨技術大學科學家們,正是發(fā)現可以通過對CPU虛擬內存系統(tǒng)的邊信道攻擊,抽取內核內存布局信息以挫敗KASLR防護的那個團隊。該團隊提出,分隔內核與用戶空間可防止此類信息泄露,而他們的研究正是這一輪KPTI補丁的靈感來源。
7月份的時候,有人寫了篇博客,記敘自己通過濫用猜測性執(zhí)行來從用戶態(tài)讀取內核內存的嘗試。盡管沒給出任何可用的概念驗證代碼,這位仁兄提到:
我的結果表明,即便內核態(tài)和用戶態(tài)之間的隔離被打破,猜測性執(zhí)行確實還在進行。
KAISER補丁集似乎就與這篇博客文章相關,而格拉茨技術大學團隊通過濫用虛擬內存布局突破KASLR防護的方法,也在某種程度上證明了這位博主的正確性——英特爾x86芯片上的猜測性執(zhí)行是可以用來獲取內核內存的。
共享系統(tǒng)
元旦時,一篇流傳甚廣的推特文章稱,該漏洞將影響一系列大品牌云計算環(huán)境,包括亞馬遜EC2、微軟Azure和谷歌Compute Engine:
目前有個暫不公開的安全漏洞,影響當下所有實現了虛擬內存的英特爾CPU架構,需要硬件修改才能完全解決。目前已經開發(fā)出了緊急軟件緩解措施,并已應用到Linux內核上,NT內核中的類似緩解措施似乎在11月份就出現了。最壞情況下,該軟件補丁會導致正常工作負載的執(zhí)行速度大幅變慢。有跡象表明,對這一漏洞的攻擊會影響到常見虛擬化環(huán)境,包括亞馬遜EC2和谷歌 Compute Engine……
微軟的Azure云上運行有大量Linux系統(tǒng)和Windows系統(tǒng),大概就是為了應用上述補丁,將于1月10日停機維護再重啟。
AWS也通過電子郵件提示客戶,將于本周五進行重大安全更新,但沒有對更新內容進行詳細說明。
2017年底的時候就有流言說存在嚴重的虛擬機管理程序漏洞——可能是在Xen開源虛擬機平臺中?;蛟S該流言中的漏洞就是這個硬件漏洞:通過內核內存訪問可對虛擬機管理程序進行攻擊。該漏洞必須得補上,因而也就會造成大量客戶虛擬機的重啟。
英特爾發(fā)言人對評論請求沒有做出任何響應。
最新
英特爾處理器的缺陷已經被確認。一位在阿姆斯特丹自由大學攻讀系統(tǒng)和網絡安全的博士生給出了該 Chipzilla 漏洞的PoC程序,實現了在用戶模式下讀取內核的內存信息。
最終,蘋果的macOS也已經發(fā)布補丁,修補了從10.13.2版本開始的芯片設計錯誤。并且,64位ARM Linux內核似乎也會收到KAISER補丁集,將內核與用戶空間完全隔離開,以阻止任何試圖突破KASLR的嘗試。