又說騷話- Linus 再次嚴辭拒絕Intel CPU漏洞補丁
近日,Linux 內核項目負責人Linus Torvalds 拒絕了AWS 工程師提交的一個補丁,該補丁的目的是減輕Intel CPU 遭遇一種新型窺探攻擊而導致數據洩露的風險。這種新型攻擊名為“探聽輔助L1 數據採樣攻擊”,簡稱Snoop (CVE-2020-0550)。
今年3 月,來自AWS 的軟件工程師Pawel Wieczorkiewicz 率先發現了Intel 處理器的這一漏洞,它可能會洩露CPU 內部存儲器或緩存中的數據,涉及CPU 包括Intel 旗下流行的Xeon 和Core 系列處理器。Pawel 迅速向Intel 報告了此問題,隨後該漏洞被Intel 定位為中等嚴重性漏洞。
新的Snoop 攻擊利用了Intel CPU 多級緩存、緩存一致性和總線監聽等特性,通過位於CPU 內核中的一級數據緩存(L1D),通過“總線監聽”(bus snooping)功能—— 在L1D 中修改數據時發生的緩存更新操作,將數據從CPU 中洩漏出來。
以近代CPU 的視角來說,計算機通常會採用三級緩存的設計來提高CPU 的運行效率。三級緩存包括L1 一級緩存、L2 二級緩存、L3 三級緩存,這些緩存都集成在CPU 內,它們的作用是作為CPU 與主內存之間的高速數據緩衝區。其中L1 最靠近CPU 核心;L2其次;L3再次。運行速度方面:L1最快、L2次快、L3最慢;容量大小方面:L1最小、L2較大、L3最大。在執行一項任務時,CPU 會先在最快的L1 中尋找需要的數據,找不到再去找次快的L2,還找不到再去找L3,L3 都沒有才去內存找。
而一級緩存其實還分為一級數據緩存(Data Cache,D-Cache,L1D)和一級指令緩存(Instruction Cache,I-Cache,L1I),分別用於存放數據及執行數據的指令解碼,兩者可同時被CPU 訪問,減少了CPU 多核心、多線程爭用緩存造成的衝突,提高了處理器的性能。一般CPU 的L1I 和L1D 具備相同的容量,例如I7-8700K 的L1 即為32KB+32KB。Snoop 攻擊就是一種竊取L1D 緩存中數據的攻擊手段。
不過Intel 的用戶也不用驚慌,據Intel 官方解釋說,這種新攻擊“很難實施”,並且不會洩露大量數據,畢竟L1D 緩存中的數據非常有限,並且只有在任務運行時調用數據的短暫時間內才會存在。“我們不認為Snoop 攻擊在可信賴的操作系統環境下是一種實用的攻擊方法,因為要利用這一漏洞需要同時滿足很多苛刻的條件,比如攻擊的時間要正好與用戶打開程序的時間吻合,且程序調用的數據正好是攻擊者想要竊取的數據。”
該漏洞披露之後,另一位來自AWS 的軟件工程師Balbir Singh 為Linux 內核提交了一個補丁,該補丁使Linux 的應用程序能夠選擇在任務切換時自動刷新L1D 的緩存,以降低Linux 系統遭遇Snoop 攻擊的風險。
Singh 在4 月份曾解釋說:“這個補丁可以防止他們的數據在任務結束後被監聽或通過旁道洩露。”他原本打算該補丁可以隨Linux 內核的5.8 版一起發布。“如果硬件支持,該特性將允許基於可選加入的應用程序調用prctl() 功能來刷新任務關閉後殘留在CPU 中的L1D 緩存。”
但是,知名技術測試網站Phoronix 指出,在任務結束後刷新L1D 緩存會導致CPU 的性能降低。Linux 內核項目負責人Linus Torvalds 認為,這將導致使用該補丁的所有Linux 用戶(無論是否採用Intel CPU)的CPU 性能降低,嚴正拒絕了該補丁,同時還一如既往地說起了騷話。
Torvalds在回复該提交的郵件列表中寫道:“因為在我看來,這基本上是將緩存刷新指令導出到用戶空間,並為進程提供了一種方式,可以說讓與這事情無關的其他人也慢了下來。”
“換言之,據我所知,這就是瘋狂的Intel 發布了有缺陷的CPU,它給虛擬化代碼帶來了問題(我對此並不太在意),但現在要因為它的問題影響到本來就沒有這些問題的Linux 用戶,這是完全沒有意義的。”
(Linus 在郵件列表中的原文)
“我不想某個應用程序跑起來就像在說 ‘哦,我是一個特別的,漂亮的,如此嬌嫩的花,我想刷新L1D上的每一個任務緩存,無論我在什麼CPU上,無論它是否有漏洞 ‘。因為這個應用程序不僅會降低自身速度,還會降低其他應用程序的速度。”
在一番非常Linus 式的回復下,Linus 對虛擬化的引用其實也是針對AWS 的,AWS 和其他雲服務提供商一樣,銷售的虛擬cpu 通常啟用了同步多線程(simultaneous multithreading,SMT)功能。Linus 接著指出,“在啟用SMT 的情況下,任務調度是分佈式進行的,所以說,在任務結束與新任務開始之間刷新L1D 緩存是非常愚蠢的。”
值得一提的是,AWS的首席工程師Benjamin Herrenschmidt在與Red Hat Linux內核貢獻者Ingo Molnar的討論中也為該補丁的爭論添加了一些背景。Herrenschmidt承認這個補丁對SMT來說毫無意義,但他敦促Linux內核開發人員不要“把嬰兒和洗澡水一起扔掉”,並反駁了這個補丁是因為AWS想把超線程作為虛擬cpu出售的說法。Herrenschmidt說,“這些補丁並不是要解決運行SMT的客戶VM內部出現的問題,也不是要保護VM免受同一系統上其他VM的攻擊。”
事實上,Linus已經不是第一次嚴辭拒絕與Intel CPU有關的補丁。2018年初,為了修補Spectre漏洞,Intel工程師提供了一個間接分支限制推測(indirect branch restricted speculation, IBRS)功能的補丁。Linus當時就在郵件列表中公開指出IBRS會造成系統性能大幅降低,直言該補丁“ 就是徹徹底底的垃圾 ”,“Intel真的要做這個X一樣的東西? ”一頓口吐芬芳。
而就在上個月,Linus對自己的私人電腦進行了升級,同時公開了自己最新的主力機器配置,他把自己的CPU換成了AMD Ryzen Threadripper ,放棄使用了15年的Intel處理器。