研究人員發現Apple M系列處理器,允許攻擊者執行GoFetch的微架構旁路攻擊,透過資料記憶體依賴預取器(Data Memory-dependent Prefetcher,DMP),從執行常數時間的加密演算法中擷取機密金鑰。

研究人員現在已經實現從OpenSSL的Diffie-Hellman、Go RSA,以及CRYSTALS專案的Kyber與Dilithium加密演算法擷取機密金鑰。目前已知受影響的Apple晶片包括M1、M2和M3型號,研究人員特別強調,雖然Intel的第13代Raptor Lake微架構同樣也有DMP,但是因為其啟動標準更嚴格,因此較具抵禦GoFetch攻擊的能力。

GoFetch攻擊要從常數時間程式開發解釋起,常數時間程式開發是一種範式,可以確保所有操作花費相同的時間,來強化程式碼抵禦旁路攻擊的能力。在非常數時間的演算法中,加密程式可能會因為不同的輸入或是金鑰,導致執行速度更快或更慢,使得攻擊者可以測量這些時間差,獲得加密過程或是金鑰的資訊。

要符合常數時間程式開發範式,程式碼中不能包含依賴機密的分支、迴圈和控制結構,而且因為攻擊者也可以觀察CPU快取不同記憶體位置的延遲,來推斷儲存在記憶體中的資訊,因此常數時間演算法也不能以任何方式混合資料和位置,並禁止使用相依於機密的記憶體存取或是陣列索引。

而GoFetch攻擊成功的關鍵,就是即便加密演算法按照常數時間程式開發原則,將資料與記憶體位址分開,由於DMP的存在,仍然可能產生與機密資料相依的記憶體存取行為,這種機制導致常數時間的演算法實際程式執行時間變得不一致,而這種時間變化就可被攻擊者觀察並利用,進一步擷取金鑰破解加密。

導致常數時間加密失效的DMP是一種CPU功能,在Apple的M系列CPU上都有,研究人員對M系列CPU進行逆向工程,發現DMP會啟動並嘗試解引用(Dereference),從類似記憶體位置載入資料,研究人員提到,這樣的DMP機制明顯違反常數時間程式開發範式中,禁止混合資料和記憶體存取模式的要求。

攻擊者便可以利用這項缺陷,精心設計加密操作來猜出金鑰。研究人員安排加密操作的輸入,只有當猜中金鑰部分位元時才出現類似指標的值,而透過分析快取時序,監控DMP是否執行解引用來驗證猜測,如此研究人員便可以逐批猜測金鑰位元。根據研究人員發表的論文,他們已成功破解了包括OpenSSL Diffie-Hellman金鑰交換、Go RSA解密和後量子加密演算法CRYSTALS-Kyber和CRYSTALS-Dilithium等4種熱門的常數時間加密實作。

不過,其實在GoFetch之前,就有安全研究發展出Augury攻擊方法,發現可濫用Apple M系列晶片DMP混合資料和記憶體位置的問題,只是Augury沒發現M系列晶片DMP啟用的標準,其實不如想像的嚴謹,GoFetch研究人員提到,任何從記憶體載入的值,無論實際內容和預期用途,都被M系列晶片DMP視為一個記憶體位址並嘗試解引用。這個發現讓GoFetch更具危險性,DMP可被用於攻擊現實世界中的常數時間的加密演算法。

研究人員在M1處理器嘗試發動端對端GoFetch攻擊,同時也在M2和M3上發現類似可濫用DMP的行為,雖然研究人員並沒有在M系列其他變體,諸如M2 Pro上測試,但他們猜測這些變體具有相同的微架構,可能也會有相同的問題。

目前M3晶片可以透過設定DIT(Data Independent Timing)位元停用DMP,但M1和M2的無法適用此方法,而Intel的Raptor Lake處理器則可設定DOIT(Data Operand Independent Timing)位元來停用DMP。加密函式庫開發人員,可以透過設定DIT位元和DOIT位元,在特定CPU上停用DMP避免GoFetch攻擊。

採用輸入盲法(Blinding)也可以協助部分加密架構,免遭攻擊者控制中介值,進而避免依賴金鑰的DMP啟動,此外,研究人員還提到,防止攻擊者測量DMP啟動,可以進一步強化加密協定的安全性。Apple目前對此還無回應,而研究人員在2023年12月5日向Apple揭露該漏洞,並於現在負責任的公開攻擊手法,之後還會釋出概念性驗證程式碼。

熱門新聞

Advertisement