今天看了一篇 IT 之家關於 AMD 處理器受 RowHammer 記憶體攻擊影響的報導,心血來潮瞭解了一下 RowHammer 攻擊的原理,把了解到的知識記錄下來。
RowHammer 攻擊是一種相對較新的攻擊方式,它利用了現代動態隨機存取儲存器(DRAM)的物理缺陷,這種攻擊方式不同於傳統的軟體漏洞利用,它直接針對硬體的弱點。這種攻擊利用了 DRAM 在執行過程中產生的意外電荷洩漏效應,可能導致儲存器單元洩露電荷並造成位元翻轉。這個問題主要是由於現在 DRAM 儲存單元高密度排列造成的。透過在一定模式下的高頻率反覆記憶體訪問,攻擊者可以在其原本無權訪問的記憶體區域引發儲存值的變化。這種攻擊可以導致許可權提升、資料洩漏和拒絕服務等安全問題。
要理解 RowHammer 攻擊,首先需要了解 DRAM 的工作原理。DRAM 透過儲存電荷在電容中來儲存資訊,每個電容與一個訪問電晶體相連,共同構成一個儲存單元(Cell,如下圖所示)。電容充滿電,儲存單元就是 1,電容放完電,儲存單元就是 0,電晶體用來控制電容充放電。
這些儲存單元被組織成多行多列,形成一個二維陣列(Bank,如下圖所示)。當讀取或寫入記憶體資料時,一個儲存單元行會被啟用,整行的資料會被載入到行緩衝器(row-buffer)中,同時儲存單元中的電容放電,在行緩衝器內完成資料的讀寫操作。在操作完成後,行緩衝器內的資料會寫入原來的儲存單元行之中,同時儲存單元中的電容充電。所以,不論是讀還是寫資料,儲存單元都會充放電。
在記憶體如“白菜”價的今天,不改變記憶體電路板面積大小的前提下,為了能儲存更多的資料,只能將儲存單元排列的越來越近,密度大幅度增加。雖然晶片的製程有所提升,但每個電容之間的隔離不是完全的。當一個行被頻繁啟用時,相鄰行的電容可能會受到電磁干擾,導致儲存的位元從 1 翻轉為 0,或者相反。這種位元翻轉可以被惡意利用,攻擊者可以透過精心設計的記憶體訪問模式來控制位元翻轉的位置和結果。透過高頻率地讀取 DRAM 中的某一行,可以影響到相鄰行中的資料,這種現象被稱為 RowHammer,因為它就像用錘子反覆敲擊記憶體行一樣。如下圖所示,第 1、3 行是攻擊行,這兩行中間是被攻擊行,攻擊行不停地充放電,中間行大機率會出現位元翻轉。
即使理解了 RowHammer 攻擊的原理,如果不知道哪些儲存單元裡隱藏著關鍵資料,毫無目的的去攻擊也沒有意義。更何況程式在訪問記憶體資料時,並不會直接使用記憶體中的真實地址,而是使用虛擬地址對映的方式進行訪問。這使得找到資料的真實地址變得更加困難,所以很長時間以來,對於 RowHammer 攻擊的研究只停留在理論階段,解決這個問題的關鍵在於如何實現逆向 DRAM 地址對映。由百度安全所研究設計的逆向工具 DRAMDig 能夠在平均 7 ~ 8 分鐘時間,快速、可靠地逆向出 DRAM 地址對映,解決了這一複雜的問題。感興趣的朋友可以閱讀這篇論文《DRAMDig: A Knowledge-assisted Tool to Uncover DRAM Address Mapping》(DOI: 10.1109/DAC18072.2020.9218599)。
儘管 RowHammer 攻擊非常強大,但也不是無法防禦的。從硬體層面,新的 DRAM 晶片中實現了各種緩解措施,如目標行重新整理(Target Row Refresh, TRR),或者使用支援 ECC 的 DRAM 記憶體。軟體層面的解決方案包括增加記憶體訪問的隨機性,以減少連續訪問同一行的可能性。