RowHammer 攻擊:內存的隱形威脅

今天看了一篇 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 內存。軟件層面的解決方案包括增加內存訪問的隨機性,以減少連續訪問同一行的可能性。

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