王文偉,劉培順
?
Row Hammer漏洞攻擊研究
王文偉,劉培順
(中國海洋大學信息科學與工程學院,山東 青島 266100)
對目前已出現的Row Hammer 漏洞利用的相關技術和防御方法進行詳盡的分析、總結和討論,指出其蘊含的安全問題及可能的防范方法。然后對現有國內外研究工作進行了總結,指出了安全研究未來有價值的2個方向:ARM架構下Row Hammer漏洞利用技術和防范方法,以及Row Hammer漏洞的準確受控制的攻擊方法。
Row Hammer攻擊;提權;動態隨機訪問存儲器;緩存驅逐;頁表噴射;內存伏擊
計算機中所有的程序都是運行在內存上的,所以內存的安全關系著計算機系統能否正常運行。近年來的研究表明,動態隨機訪問存儲器(DRAM, dynamic random access memory)內存存在設計缺陷,將該缺陷所產生的漏洞稱為Row Hammer。Row Hammer漏洞在2014年被首次提出[1],該漏洞的主要表現是:當攻擊者反復敲打內存中特定的行時,會導致其相鄰行的內存單元發生反轉,從而改變內存中的數據。隨后在2015年,谷歌安全研究小組提出了2個可以基于該漏洞進行提權的利用[2,3],一個是在Linux系統上利用該漏洞實現了提升訪問整塊內存區域的權限,另一個是可以越過谷歌的Native Client(NaCI)沙盒,直接使用主機的系統調用。目前,國外一些專家學者對該漏洞進行了深入研究,并提出了獨特的見解與利用,但是國內對該漏洞的研究還比較少[4]。
內存是由動態隨機訪問存儲器和靜態隨機訪問存儲器(SRAM, static random access memory)兩部分組成,其中DRAM是由許多重復的存儲單元組成,每個存儲單元又由一個電容和一個訪問晶體管組成。電容可以存儲1 bit數據,對電容充放電后電容帶電荷的多少分別對應二進制數據0和1。其中訪問晶體管和行地址線路相連,電容和列地址線路相連。圖1為內存單元組合縮略圖和電氣原理圖。
圖1中每個黑點為一個存儲單元,一系列的存儲單元組成一個存儲陣列,同一存儲陣列中除了行組成的存儲單元外,還包括一個行緩沖區。內存讀寫單位為行,每次從指定行讀取數據包括以下3個步驟。
激活:字線被選中,將該行的數據從位線傳入行緩沖區。
訪問:包括讀寫操作,針對行緩沖區進行操作。
關閉:拉低字線,同時行緩沖區中數據從位線寫入到行,并且清空行緩沖區。
DRAM是由通道、顆粒陣列、存儲陣列3個部分組成的層次結構,其架構如圖2所示。其中內存控制器和DRAM之間的物理連接模塊稱為通道。在通道內,連接到主板上的物理內存模塊稱為雙列直插存儲器模塊(dual inline memory module),其通常由一個或兩個顆粒陣列組成。而一個顆粒陣列由多個存儲陣列組成,每一個存儲陣列則是多個單元組成的二維空間集合,通常一個存儲陣列由214~217行和一個行緩沖區組成。

圖2 DRAM架構
在計算機系統中,由于CPU和主存之間逐漸增大的差距,系統設計者被迫在CPU寄存器文件和主存之間插入一個小的SRAM高速緩存存儲器,稱為高速緩存。隨著緩存等級的增大,緩存的大小也隨之增大,同時訪問時間也增加。其中LLC被多個處理器內核共享,所以訪問時間更長,因此將其分為不同的片,這樣就能夠被多個內核同時訪問。
當處理器請求數據時,操作系統首先為當前進程分配一個虛擬地址空間,處理器請求的數據虛擬地址則位于這個虛擬地址空間。虛擬地址分為兩部分,低地址位表示虛擬頁面偏移,剩下的高位則表示虛擬頁號,虛擬頁號作為頁表中的索引。
隨著動態隨機訪問存儲器密度的不斷增大,內存單元越來越小,從而能夠存儲更小的電荷。結果是內存單元之間噪聲容限降低,導致相互獨立的2個內存單元之間的電荷相互影響。Row Hammer攻擊是針對內存硬件芯片設計上的這一缺陷,其原理是反復讀寫DRAM內存單元中同行地址,使相鄰行發生電荷泄露,從而導致相鄰行產生位反轉現象,即0反轉為1,1反轉為0。這種反復高頻率激活關閉Row的操作稱為“捶打”,即Row-Hammer,Row-Hammer分為single-sided和double-sided這2種。Single-sided是反復高頻率激活關閉同一行,從而造成其相鄰兩行發生位反轉。Double-sided則是反復高頻率激活關閉兩行,從而造成其中間行發生位反轉。
由前面部分內容可知,現在計算機體系為了提高性能加入了緩存機制,這導致了內存不能夠快速激活行從而觸發Row Hammer漏洞。同時由于Row Hammer漏洞所產生的比特反轉具有不可控性,所以要想利用漏洞實施端到端的可控攻擊,必須解決以下2個問題。
1) 能夠快速訪問內存,即繞過緩存機制。
2) 物理內存信息,即欺騙受害者把敏感數據存放在攻擊者受控制的物理內存頁上。
緩存刷新(cache flush)技術是由卡內基梅隆大學的Yoongu 等[1]于2014年提出的,主要原理是通過使用clflush指令刷新緩存,從而使訪問內存的操作直接指向DRAM,其形式如下。
Code-Hammer
{
Mov (X), eax //read from address X
Mov (Y), ebx //read from address Y
Clflush (X) //flush cache for address X
Clflush (Y) //flush cache for address Y
Jmp Code-Hammer
}
首先,2個mov指令從位于DRAM上的X和Y地址讀取數據,并將數據放入寄存器和緩存中。然后clflush指令將剛放入緩存中的數據逐出,最后代碼跳回第一個指令并繼續從DRAM上讀取數據。在無序處理器上,上述代碼會產生多個DRAM讀取請求,所有的這些請求再發送給DRAM之前都會在內存控制器中排隊,即(req x, req y, req x, req y,…)。這時如果選取的X和Y位于同一存儲陣列上的不同行,那么內存管理器會重復打開和關閉這兩行,即(act X, read X, pre X, act Y, read Y, pre Y),從而導致比特反轉。具體實驗可以分為2種,即一次測試所有行和每次測試一行。其中一次測試所有行可以在每一行經過多次打開和關閉后,快速確定所有能夠發生比特反轉的內存單元,而一次測試一行則可以確定具體發生比特翻轉的內存單元。而這2種方法都需要3個輸入參數,即激活間隔、刷新間隔及數據格式。首先激活間隔,確定行激活、關閉的頻率,然后刷新間隔確定實驗中刷新頻率,數據格式則是確定了在發生比特翻轉之前的初始數據值。一次測試所有行首先是把數據格式寫到整個內存中,然后在一個刷新間隔時間段內以激活間隔為速率來激活關閉一行,然后重復上面步驟,直到內存中所有行都執行完該步驟。最后讀取整個內存中數據,并且確定所有發生比特翻轉的內存單元。而一次測試一行過程與之類似,兩者實現過程的偽代碼如下。
一次測試所有行:
TestBulk(Al,Rl,DP)
setAl(Al)
setRl(Rl)
N←(2xRl)/Al
writeAll(DP)
forr←0…ROWMAX
for i←0…N
ACT r…row
READ 0thcol
PRE rthrow
readAll()
findErrors()
一次測試一行:
TestBulk(Al,Rl,DP)
setAl(Al)
setRl(Rl)
N←(2xRl)/Al
for r←0…ROWMAX
writeAll(DP)
for i←0…N
ACT rthrow
READ 0thcol
PRE rthrow
readAll()
findErrors()
目前,谷歌安全團隊“Project Zero”的兩位安全研究人員Mark Seaborn和Thomas Dullien已經在X86-64平臺上通過使用Clflush指令,成功地引起Row Hammer漏洞,并結合PTE的某一位的變化直接獲得內核權限[2,3]。
緩存驅逐(cache eviction)技術主要是重復訪問位于同一緩存驅逐集中的內存地址,緩存驅逐集是一組相同地址的集合,其中只有當2個地址映射到同一緩沖行時,這2個地址相同。因此當訪問內存地址屬于同一個緩存驅逐集時,在讀取數據時會自動刷新緩存。緩存驅逐技術主要包括以下3個步驟。
1) 確定驅逐集:一個驅逐集由多個沖突地址和一個侵略者地址構成。
2) 確定Cache替換策略:Pseudo-LRU算法是對LRU算法的改進,通過實驗構造一個高缺失率的序列。
3) 構造訪問序列:對于一個三級緩存,12路組相連映射的系統,可以構造如下訪問序列
A0(Row0,setx) X1(setx) X2(setx)…X9(setx) X10(setx) X11(setx) X1(setx) X2(setx) … X9(setx) X10(setx)A0(Row0,setx) X1(setx) X2(setx)…X9(setx) X10(setx) X11(setx) X1(setx) X2(setx) …X9(setx) X10(setx)
…
其中,A0對應Row0映射到組X中,然后訪問同屬于組X的沖突地址X1,X2,…,X10,根據Cache替換策略,A0由于處于最近最少使用的位置,所以當訪問X11時,A0被驅逐出去,這樣Row0就會被訪問一次。接下來繼續訪問同屬于組X的沖突地址X1,X2,…,X10,這時X11處于最近最少使用的位置,當第二遍訪問A0時,X11被驅逐出去。這樣按上述序列重復進行次,則能夠實現重復次訪問Row0的效果。同理,對其他行進行相同的操作,即可實現對該行的次訪問。這樣快速地對某一行進行重復驅逐與加載,可以觸發Row Hammer漏洞。這種攻擊技術相比clflush指令更具一般性,它適用于任意系統架構、編程語言及運行環境。Gruss等[5]利用在網頁中廣泛使用的JavaScript語言來實現緩存驅逐技術,這種基于JavaScript的Row Hammer能夠遠端觸發該漏洞,而且影響范圍廣。
在計算中,數據引用有不同的模式。一些具有時間特性,即數據在將來很快被再次訪問。一些具有空間特性,即相鄰位置的數據將被訪問。同時也存在一些非時間特性的,這種數據只會被引用一次。由于大多數數據訪問呈現時間和空間局部性,所以引入了高速緩存機制來提高性能,但是非時間特性數據的訪問會污染緩存并降低性能。非緩存指令是為了解決非時間特性數據訪問可能造成污染緩存并降低性能這一問題而引入的,即一旦出現預期的非時間特性數據引用,則程序或編譯器可以使用非緩存指令來最小化緩存污染。其中非緩存指令包括加載、存儲和預取3種指令,這里使用非緩存指令,因為它們把目標內存視為無緩存的“寫入組合”類型,即CPU直接訪問內存而不需要通過緩存,如圖3所示。

圖3 非緩存訪問
由圖3可以看出,使用非緩存指令可以繞過緩存機制,但是由于引入了寫入組合緩沖區,使CPU訪問DRAM速率降低。為此,Rui和Seaborn[6]提出一種刷新寫入組合緩沖區的方法,即通過緩存存儲器訪問非緩存寫入數據地址來實現,從而能夠快速地激活關閉行,繼而觸發Row Hammer漏洞,其實現原理如下。
Code-Hammer
{
Movnti % eax, (X)
Movnti % eax, (Y)
Mov % eax, (X)
Mov % eax, (Y)
Jmp code-Hammer
}
由于非時態存儲存在于重要的軟件C庫中,具體來說,它們會被C庫中的memset和memcpy函數所調用,即當填充/復制的數據預計不會很快被訪問時,它們是不會被存儲到緩存。基于這一發現,Rui 和Seaborn分析了在不同庫中,非緩存指令在memset/memcpy中的使用方法,以及在什么情況下會被執行。他們發現在主流庫中,大多數會使用非緩存指令。為了利用memset/ memcpy函數觸發Row Hammer漏洞,需要大量數據的移動從而執行非緩存指令。但是大量數據移動會導致較低的錘擊速率,因此在實驗中通過直接memset/memcpy的方式對不同的庫進行錘擊,并且成功地引發了比特翻轉。
頁表噴射技術不同于以往的關于Row Hammer漏洞的利用技術,以前的技術都是通過利用隨機的Row Hammer漏洞來反轉頁表條目中的某些位來實現root權限提升。而頁表噴射這種技術則具有概率性,首先通過在內存中部署大量的頁表,以期望至少有一個能夠出現在易受攻擊的物理內存頁上。然后使易受攻擊的物理內存頁發生比特反轉,從而使受害者的頁表指向一個任意物理內存位置。根據物理內存布局可知,這樣的任意物理內存位置包含一個受攻擊者控制的頁表頁,而這個頁表頁允許攻擊者將他們的頁表映射到受控制的地址空間上?;谶@點,攻擊者可以覆蓋頁表條目,并且能夠訪問任意物理內存中的頁從而實現提權。其過程如下:首先在/dev/shm中創建一個文件,并在該文件的每4 kB內存開始處寫入一個標記數,從而方便識別映射的內存頁。同時為了避免內存頁被分配到連續的物理內存地址,需要調用mmap從物理內存申請一塊空間,隨后調用madvise,從該空間中釋放一個內存頁,從而系統重新申請一個4 kB內存頁。之后反復調用mmap來映射前面生成的文件,在此過程中,通過調用munmap來釋放掉可以進行bit翻轉的內存頁,這時系統會有很高的可能性緊接著使用這篇物理內存保存頁表,反復以上過程可以觸發Row Hammer漏洞。Seaborn和 Dullien[2,3]利用該技術實現了Linux內核提權。
內存重復數據刪除技術[7,8]是一種流行的減少運行系統內存的技術,其主要原理是,當多個內存頁具有相同的內容時,系統管理程序會合并這些內存內容,然后將該頁保留一份,其余的刪除。當其中的一個重復數據刪除的頁被修改,則會用寫時復制技術,即先將該頁復制一份,然后在這個復制的頁上進行寫操作。當內存中有許多內容相同的頁時,該技術可以節省大量的內存空間。然而該技術有安全漏洞,即當攻擊者的虛擬機和受害者的虛擬機同時位于同一主機上時,攻擊者可以獲取其相鄰的虛擬機內存信息?;谶@一技術,Razavi等[9]提出一種新的攻擊技術——反轉風水(FFS, flip feny shui),即利用內存重復數據刪除技術來實施受控制的Row Hammer攻擊。首先,攻擊者確定內存中哪些單元存在Row Hammer漏洞,然后選擇一個合適的反轉位,攻擊者偽造一個和他已知的在受害者上易受攻擊的內存位置的內存頁,內存重復數據刪除引擎就會將受害者和攻擊者的頁合并(如圖4所示),從而使受攻擊者控制的虛擬內存頁和受害者自己的內存頁映射到同一個攻擊者選擇的易受攻擊的物理內存頁,進而攻擊者可以通過觸發Row Hammer漏洞來修改受害者的內存地址。

圖4 內存重復數據刪除
內存伏擊技術會用到預取邊道攻擊和頁緩存驅逐技術。其中預取邊道攻擊是用來檢測虛擬內存中的數據是否映射到指定的物理內存中,而頁緩存驅逐技術則是將文件頁從頁緩存中驅逐出去,使后續的文件訪問不能從頁緩存中找到與之匹配的頁,從而使文件被映射到新的物理內存位置。內存伏擊技術則是2種技術的結合,可以實現將目標數據映射到指定的物理內存位置上,其原理如圖5所示。

圖5 內存伏擊
其中空白方格代表空閑頁面,淺色方格代表已分配給頁緩存的頁面,圖5(a)表示剛開始內存的使用情況,內存中還有部分空閑頁面,圖5(b)將所有的空閑頁面分配給頁緩存,同時將目標頁B從內存中驅逐出去,圖5(c)是將目標頁B重新加載到內存中,這時目標頁B會被加載到不同位置的物理內存中,重復圖5(b)和圖5(c),直到目標頁B被加載到能夠發生位反轉的物理內存位置X上。
內存伏擊技術是Gruss和Lipp等[10]在2017年提出的,利用該技術,Daniel等實現了云端的DDoS攻擊和本地的提權攻擊。相比于之前的頁噴射技術[11]而言,內存伏擊技術不需要分配整個內存空間,從而具有一定的隱秘性,其缺點是速度相對較慢。
Row Hammer漏洞是硬件問題所導致的漏洞,所以首先想到的是從硬件方面來解決,現有的防御技術有以下幾點。
1) ECC(error corrected code)技術[1]:ECC,即錯誤更正碼,用來檢驗存儲在DRAM中的整體數據,ECC在設計上比奇偶校驗更精巧,它不僅能夠檢測出多位數據錯誤,并且能夠同時指定出錯位并改正。
2) PARA(probabilistic adjacent row activation)技術[1]:PARA技術的主要原理是每當一個行關閉時,內存控制器都會以一定的概率來刷新該行鄰接行的值。
3) 提高刷新速率[12],到目前為止,通過BIOS更新所提供的刷新速率僅提高了一倍,這不足以防止所有針對DRAM的攻擊。而且很大一部分用戶沒有更新BIOS,同時這種方法會對系統性能造成顯著影響。
4) TRR(target row refresh)技術[2]:TRR是應用在DRR4內存中的一種技術。這種技術采用了一種特殊模塊,從而可以跟蹤記錄內存中哪些行經常被激活,并且刷新這些激活行相鄰行的值。
從軟件方面解決Row Hammer 漏洞可以從以下幾個方面進行。
1)禁止使用cache相關指令,由前面部分可知,當使用Clflush指令時,可以導致直接訪問DRAM,從而觸發Row Hammer漏洞。例如,目前谷歌的沙箱已經禁止使用Clflush指令[13]。
2)禁止一般用戶訪問物理地址接口pagemap,如果一般用戶訪問pagemap時,他能夠獲得所有物理地址和虛擬地址之間的映射關系,有效地重復訪問物理內存中的具體行,從而觸發Row Hammer漏洞。所以禁止一般用戶訪問物理地址接口pagemap也是一種防治措施,目前linux內核已經禁止一般用戶訪問物理內存接口。
3)基于虛擬化內存隔離技術[4](RDXA, RowHammer defense on Xen allocator)系統,該系統主要包括兩部分,第一部分是通過基于訪問時間的旁路分析方法,逆向出不同物理地址和實際內存在芯片上的布局關系,并將其存儲在數據庫中。第二部分是虛擬機監視器的物理內存分配,在該過程中,虛擬機監視器中的內存分配器會根據數據庫中的內存物理布局數據,將物理內存分為DRAM內存上相互不相鄰的若干塊區域,然后通過內存分配算法將這些區域分配給不同的安全實體,其中每個安全實體間都隔離至少一行的距離,這樣保證不同安全實體間所對應的物理內存不會被物理內存放在同一個內存芯片的同一個存儲陣列的相鄰行上面,從而可以有效阻止跨虛擬機的Row Hammer攻擊。
Row Hammer漏洞是由于內存設計缺陷導致的,而內存又是當今計算機設備的基本硬件,所以研究Row Hammer漏洞具有重要的現實意義。
從現有的研究成果來看,未來對于Row Hammer漏洞的研究可分以下2個方向。
1)以往的研究都是針對X86架構,而已知的移動端則采用的是ARM架構,這種架構和應用于PC端的X86架構完全不同,所以針對X86架構的Row Hammer漏洞利用不適用于ARM架構。因此,如何在移動端利用Row Hammer漏洞實施攻擊是下一步研究的一個方向。
2)以往的研究都是利用Row Hammer使頁表條目中某一位發生反轉,而這種位反轉是隨機的、不可預測的,從而使攻擊不可靠、不受控制。因此,如何利用該漏洞實施一個準確的受控制的攻擊是下一步研究的方向。
[1] KIM Y, DALY R, KIM J, FALLIN C. Flipping bits in memory without accessing them: an experimental study of DRAM disturbance errors[C]//The 41st International Symposium on Computer Architecture (ISCA).2014:361-372.
[2] SEABORN M, DULLIEN T. Exploiting the DRAM RowHammer bug to gain kernel privileges[C]// Black Hat USA (BH-US). 2015.
[3] SEABORN M, DULLIEN T. Exploiting the DRAM RowHammer bug to gain kernel privileges[EB/OL]. http://googleprojectzero. blogspot.com/2015/03/exploiting-dram-RowHammer-bug-to-gain. html.
[4] 石培濤,劉宇濤,陳海波. 基于虛擬化內存隔離的RowHammer攻擊防護機制[J]. 信息安全學報,2017,2(10):1-12.
SHI P T, LIU Y T, CHEN H B. Defense against RowHammer attack with memory isolation in virtualized environments[J]. Journal of Cyber Security,2017,2(10):1-12.
[5] GRUSS D, MANGARD S. Rowhammer.js: a remote software-induced fault attack in JavaScript[C]// International Conference on Detection of Intrusions and Malware, and Vulnerability Assessment.2016:300-321.
[6] QIAO R, SEABORN M. A new approach for RowHammer attacks[C]//The 9th IEEE International Symposium on Hardware Oriented Security and Trust (HOST). 2016:161-166.
[7] BOSMAN E, RAZAVI K, BOS H, et al. Dedup est machina: memory deduplication as an advanced exploitation vector[C]//The 37th IEEE Symposium on Security and Privacy(S&P).2016: 987-1004.
[8] XIAO J D, ZHANG X, HUANG H, et al. Security implications of memory deduplication in a virtualized environment[C]// International Conference on Dependable Systems and Networks (DSN). 2013: 1-12.
[9] RAZAVI K, GRAS B, BOSMAN E, et al. Flip feng shui: hammering a needle in the software stack[C]// The 25th USENIX Security Symposium.2016.
[10] GRUSS D, LIPP M, SCHWARZ M, et al..Another flip in the wall of row hammer defenses[EB/OL]. https://www.researchgate.net/ publication/320179942_Another_Flip_in_the_Wall_of_Rowhammer_ Defenses.
[11] YIM K S. The RowHammer attack injection methodology[C]// The 35th Symposium on Reliable Distributed Systems . 2016:1-10.
[12] Row hammer privilege escalation[EB/OL]. https://support.lenovo. com/ us/en/product security/Row Hammer.
[13] AWEKE Z B, YITBAREK S F, QIAO R, et al. ANVIL: software-based protection against next-generation RowHammer attacks[C]//The Twenty-First International Conference on Architectural Support for Programming Languages and Operating Systems.2016:743-755.
Study of Row Hammer attack
WANG Wenwei, LIU Peishun
College of Information Science and Engineering, Ocean University of China, Qingdao 266100, China
The related technologies and defense methods of the current Row Hammer vulnerabilities were analyzed and summarized, and the security problems and possible precautions were pointed out. At the end, the current research work both at home and abroad is summarized. Two valuable directions for security research in the future are pointed out: Row Hammer exploit techniques and precautions in the ARM architecture, and accurate and controlled attacks on Row Hammer vulnerabilities.
Row Hammer, privilege escalation, DRAM, cache eviction, page table spraying, memory waylaying
TP390
A
10.11959/j.issn.2096-109x.2018007
王文偉(1993-),男,陜西咸陽人,中國海洋大學碩士生,主要研究方向為信息安全。

劉培順(1975-),男,山東菏澤人,中國海洋大學講師,主要研究方向為網絡與信息安全。
2017-12-08;
2018-01-03
劉培順,liups@ouc.edu.cn
國家重點研發計劃基金資助項目(No.2017YFC0806200)
The National Key R&D Plan Program of China (No.2017YFC0806200)