又說騷話,Linus 再次拒絕 Intel CPU 漏洞補丁!

公衆號關注 “GitHubDaily”

設爲 “星標”,每天帶你逛 GitHub

大家好,我是小 G。

近日,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 處理器。

---

由 GitHubDaily 原班人馬打造的公衆號:GitCube,現已正式上線!
接下來我們將會在該公衆號上,爲大家分享優質的計算機學習資源與開發者工具,堅持每天一篇原創文章的輸出,感興趣的小夥伴可以關注一下哈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章