肖超恩 黃 松 王建新 張 磊
北京電子科技學院,北京市 100070
隨著信息技術(shù)的快速發(fā)展,信息安全問題愈發(fā)突出,信息安全涉及到防范個人信息、商業(yè)秘密、國家機密泄露等問題。 卡內(nèi)基梅隆大學和英特爾實驗室的合作論文中首次提出一個名為Rowhammer[1]的漏洞,隨后Google Project Zero安全團隊復現(xiàn)了利用比特位翻轉(zhuǎn)攻擊DDR DRAM 內(nèi)存來獲取目標系統(tǒng)內(nèi)核特權(quán)的實驗[2]。
內(nèi)存是計算機系統(tǒng)的關(guān)鍵組成部分,決定著系統(tǒng)的整體性能、能效和可靠性。 由于內(nèi)存中存儲比特位的電容器體積越來越小、排列越來越緊密,每個單元中存儲的電荷量越來越少,從而降低了存儲的可靠性,使得存儲單元更容易受到各種故障影響。 通過快速、重復讀取存儲器上攻擊目標相鄰行上的數(shù)據(jù),觸發(fā)存儲單元電路中的電容不斷充放電,產(chǎn)生一個電場,改變臨近內(nèi)存單元中的數(shù)值,使其發(fā)生由0 到1 或者由1 到0 的位翻轉(zhuǎn),攻擊者可以利用這種硬件漏洞,通過軟件觸發(fā)的方式來提升權(quán)限。 本文就Rowhammer的研究現(xiàn)狀、攻擊方法以及安全防護措施等展開分析研究。
內(nèi)存由SRAM(靜態(tài)隨機訪問內(nèi)存) 和DRAM(動態(tài)隨機訪問內(nèi)存)組成。 其中,DRAM
的組成及內(nèi)部結(jié)構(gòu)如圖1 所示。
該內(nèi)存條是一塊大小為2GB 的雙通道內(nèi)存Dual Inline Memory Module(簡稱DIMM)。 內(nèi)存條分正反兩面rank1 和rank2,rank1 和rank2 各有8 個128MB 內(nèi)存顆粒(Chip)共16 個,即:16×128MB =2GB。 每個顆粒內(nèi)包含8 個bank(獨立內(nèi)存陣列),所有的bank 共享一個輸入輸出存儲控制器(memory I/O controller),在每個bank 讀寫時并行執(zhí)行。 bank 內(nèi)部包含行與列地址解碼器、數(shù)據(jù)緩沖區(qū)、傳感放大器以及DRAM 內(nèi)存陣列。 陣列中每個行與列的交點就是內(nèi)存讀寫的最小單位(Cell),由一個電容和一個晶體管構(gòu)成,電容可存儲1 比特數(shù)據(jù),電容的電勢高低分別對應(yīng)二進制數(shù)據(jù)0 和1。 每次訪問時,行都是通過將其內(nèi)存單元的內(nèi)容復制到行緩沖區(qū),然后將內(nèi)容復制回內(nèi)存單元(從而充電) 來“激活”的。
DRAM 保存數(shù)據(jù)具有時限特性,隨著時間的推移,電容的電荷會流失從而導致數(shù)據(jù)丟失,需要周期性按行刷新。 DDR3 標準[3]指定每一行的電荷必須至少每64 毫秒刷新一次。 這種內(nèi)存刷新間隔是在內(nèi)存完整性、能量消耗和系統(tǒng)性能之間做出的權(quán)衡。 在內(nèi)存刷新期間,特定的區(qū)域不可用,所以更頻繁地刷新不僅會消耗更多的能量,而且可能會與合法的內(nèi)存訪問競爭[4]。
通常,在DRAM 內(nèi)部只要彼此隔離的兩個電路組件(如電容器、晶體管、導線)之間有足夠強的相互作用,就會發(fā)生干擾錯誤。 市場上流行的DDR3 以及部分DDR4[5]內(nèi)存在設(shè)計時都存在這種硬件缺陷,當內(nèi)存中的一行基本存儲單元被快速重復地讀取,電容會不斷充電和放電,在此過程中會有一定的概率泄露部分電子給相鄰的內(nèi)存單元,相鄰行的內(nèi)存單元在短時間內(nèi)積累足夠多的電量則會受到非預期的影響從而使存儲的數(shù)據(jù)發(fā)生0、1 跳變。
2.1.1 基于x86 的攻擊
2014 年,Y. Kim[1]等人首次提出動態(tài)隨機存取存儲器(DRAM)中的Rowhammer 問題。 隨著工藝提升,存儲芯片中的晶體管密度的增加,每次訪問內(nèi)存的過程中,電荷有一定概率泄漏到相鄰存儲單元,容易出現(xiàn)干擾錯誤(Disturbance Error)。 通過反復訪問,即hammer(錘擊)一個給定的物理內(nèi)存行,攻擊者可以在相鄰行中造成足夠大的干擾,導致比特位發(fā)生翻轉(zhuǎn)。
2015 年,GoogleProject Zero 團隊的兩位研究人員M. Seaborn 和T. Dullien[2]提出了Rowhammer 的兩種攻擊方法。 第一種使用雙面錘擊來避開NaCl 沙盒(Native Client Sand box),由于NaCl 在運行代碼之前會先對其進行靜態(tài)驗證,因此攻擊者可以通過修改安全指令來達到攻擊目的。 第二種功能更強大,它可以在Linux 上作為普通的x86-64 進程運行,攻擊者對頁面表條目(PTE)進行錘擊,將PTE 更改為指向攻擊進程的頁表,獲取完全讀寫訪問權(quán)限,從而對所有物理內(nèi)存進行完全讀寫訪問,進而接管整個系統(tǒng)。
2018 年,D. Gruss[6]等人針對當前防御技術(shù),提出了單點錘擊、操作碼翻轉(zhuǎn)和memory waylaying 等新型攻擊方法,并證明了該攻擊可以使系統(tǒng)的防御對策失效。
2019 年,L. Xu[7]等人提出了Memway 算法,該算法在I/O 開銷和速度方面都對memory waylaying 進行了改進。 通過使用Linux tmpfs 和內(nèi)存交換來管理收回文件,運行時間和磁盤I/O 開銷減少了90%。 此外,通過結(jié)合使用Memway 和非特權(quán)posix fadvise API,二進制重定位步驟的速度提高了100 倍,大大縮短了攻擊消耗的時間。
2.1.2 基于ARM 的攻擊
2015 年,D. Gruss[8]等人通過JavaScript 代碼實現(xiàn)了對易受到Rowhammer 攻擊的服務(wù)器的遠程接管。 由于JavaScript 幾乎存在于所有瀏覽器并默認啟用,Rowhammer 攻擊可以由網(wǎng)站發(fā)起,并且能夠在訪問該網(wǎng)站的系統(tǒng)上獲得root權(quán)限。
2016 年,V. van der Veen[9]等人提出了一種使用操作系統(tǒng)提供的功能進行確定性Rowhammer 開發(fā)的通用技術(shù)(稱之為“風水”),使用這種技術(shù)可以可靠地控制物理內(nèi)存,將安全敏感數(shù)據(jù)(例如頁表)放在易受攻擊的物理內(nèi)存位置,并且在移動設(shè)備上實現(xiàn)了一種使用不需要權(quán)限的用戶級應(yīng)用程序進行Rowhammer 攻擊,表明了Rowhammer 攻擊在移動平臺上的有效性。
2018 年,P. Frigo[10]等人通過使用移動GPU上的WebGL 接口觸發(fā)Rowhammer 漏洞來接管移動系統(tǒng)。
2018 年,A.Tatar[11]等人通過Remote Direct Memory Access(RDMA)協(xié)議觸發(fā)Rowhammer 來接管遠程系統(tǒng),這種以網(wǎng)卡發(fā)起的攻擊方法稱作Throwhammer,也是第一個基于網(wǎng)絡(luò)的遠程Rowhammer 攻擊方式。
2018 年,M. Lipp[12]等人提出了一種名為Nethammer 的新的攻擊方法,在處理網(wǎng)絡(luò)請求時通過內(nèi)存或flush 指令來攻擊系統(tǒng)。
2.1.3 基于虛擬機的攻擊
2016 年, Xiao[13]等 人 濫 用 Xen 頁 表Hypercall 界面將頁目錄表(PDT)復制到錯誤頁,然后通過翻轉(zhuǎn)某個頁目錄項,使用偽造的頁表執(zhí)行虛擬機轉(zhuǎn)義并獲得無限的內(nèi)存訪問。 實現(xiàn)了在跨vm 的條件下打破Xen 半虛擬化內(nèi)存隔離。
2016 年,K. Razavid[14]等人利用頁面重復數(shù)據(jù)刪除技術(shù)翻轉(zhuǎn)相鄰VM(虛擬機)中的密鑰。在同一系統(tǒng)上運行的VM 能夠接管被攻擊的VM,攻擊VM 在易受Rowhammer 攻擊的內(nèi)存位置處寫入一個已知存在于被攻擊VM 中的內(nèi)存頁面,內(nèi)存重復數(shù)據(jù)刪除功能會將被攻擊VM 和攻擊VM 的重復頁面合并到攻擊VM 頁面的位置,攻擊者就能觸發(fā)Rowhammer 漏洞實現(xiàn)修改攻擊目標的內(nèi)存地址。 重復數(shù)據(jù)刪除引擎不會檢測到對內(nèi)存的修改,并且被攻擊者VM 會使用錯誤頁面而不是其原始頁面。
2.1.4 基于服務(wù)器的攻擊
2020 年,L. Cojocar[15]等人提出了一種確定云服務(wù)器是否容易受到Rowhammer 攻擊的端到端方法,通過生成最高速率的DRAM 行激活命令和利用逆向工程找到在DRAM 設(shè)備內(nèi)部物理相鄰的行來評估Rowhammer 漏洞對云服務(wù)器的威脅。
2020 年,A. Kwong[16]等人演示了一種基于Rowhammer 的攻擊,該攻擊使用用戶級別權(quán)限從OpenSSH 服務(wù)器恢復RSA 2048 位簽名密鑰。通過讀取自己的私有內(nèi)存,不涉及對目標數(shù)據(jù)、代碼或地址空間的任何訪問或修改就能獲取機密信息,這種方法稱作RAMBleed。
蘋果在針對Rowhammer 漏洞問題時提到,由于“Y. Kim 等人的原始研究”,他們提高了內(nèi)存的刷新率并更新了行業(yè)標準Memtest86 程序,該程序用于測試已部署的內(nèi)存芯片是否存在錯誤,其中包括了對Rowhammer 的檢測。
抵抗Rowhammer 攻擊的一種折中方案是合理分配內(nèi)存單元和物理隔離頁面,使Rowhammer不會影響重要頁面[17,18]。 F. Brasser[17]等人擴展了操作系統(tǒng)的物理內(nèi)存分配器,以隔離不同內(nèi)存頁面。 V. van der Veen[19]等人通過將DMA緩沖區(qū)與其他非存儲數(shù)據(jù)的緩沖區(qū)行(即保護行)隔離,確保任何基于DMA 的攻擊只能在保護行中引起Rowhammer 翻轉(zhuǎn),而不會影響其他包含重要數(shù)據(jù)的行。
抵抗Rowhammer 的另一種方法是靜態(tài)分析,用這種方法來識別可能是Rowhammer 攻擊的代碼段,并在執(zhí)行之前阻止可疑代碼執(zhí)行[20]。ZebRAM[21]將奇數(shù)行作為安全行,偶數(shù)行作為不安全行,不安全行作為交換空間,部分安全行作為不安全行交換空間中數(shù)據(jù)的緩存。 每當不安全行中的數(shù)據(jù)遷移到安全行時,ZebRAM 都會執(zhí)行軟件完整性檢查和錯誤糾正。
2017 年,石培濤等人提出了一套軟件防御機制——RDXA(Rowhammer Defense on Xen Allocator) 系統(tǒng)。 該系統(tǒng)是在虛擬機上進行Rowhammer 感知的內(nèi)存分配機制,保證不同的虛擬機的內(nèi)存相互隔離實現(xiàn)針對虛擬機的Rowhammer 攻擊防護[22]。
2018 年,Gruss[6]等人將現(xiàn)有的防護方法分為五類,分別是:靜態(tài)分析[23]、性能計數(shù)器監(jiān)控[21]、內(nèi)存訪問模式監(jiān)控[24]、內(nèi)存足跡[7]和物理隔離[17]。
2019 年,M.Kim[25]等人提出了一種不同的防護方法來抵抗rowhammer 漏洞,利用Rowhammer 誤差的分布,通過數(shù)學方法得出有效的重新映射矩陣并導出,通過兩個步驟重新映射整個DRAM 地址,可將錯誤有效地分布在不同的行和列上,以使攻擊單元不會集中在特定的行和列上。 這種重新映射方案減少了單個詞中出現(xiàn)多個錯誤的可能性,因而減少了在單個錯誤或單個符號校正ECC 下出現(xiàn)的不可校正錯誤。
2020 年,I. Kang[32]等人提出了CAT-TWO,這是現(xiàn)有的基于計數(shù)器的自適應(yīng)樹(CAT)方案的時間窗口優(yōu)化版本,用于抵抗Rowhammer 攻擊。 該方法在DDR4 DRAM 設(shè)備上產(chǎn)生的能源開銷不到0.7%,并且在最壞的情況下生成不到0.03%的額外激活來刷新目標行,這幾乎不會影響系統(tǒng)性能。
緩存刷新(cache flush)技術(shù)主要是通過x86架構(gòu)中的clflush 指令來刷新緩存,使得訪問內(nèi)存的操作繞開緩存,從而讓內(nèi)存訪問直接指向DRAM。
每個DRAM 中都含有許多行(row),訪問內(nèi)存中數(shù)據(jù)的過程涉及到充放電。 將數(shù)據(jù)從行傳到芯片的行緩沖區(qū)叫作放電;把行緩沖區(qū)中被讀取或者寫入的內(nèi)容重新傳回到原來的行單元叫作充電。 這樣一個充放電操作會對相鄰行產(chǎn)生干擾,在進行多次“激活”的情況下,自動刷新可能會使相鄰行的某一位發(fā)生翻轉(zhuǎn)。 通常bank 都存在著當前已激活的行,當?shù)刂稾 和地址Y 位于不同行時,Code Flush 將不會觸發(fā)激活操作,優(yōu)先從行緩沖區(qū)中讀取數(shù)據(jù)。 如果缺少clflush指令,讀取操作(mov)只會作用于CPU 中的Cache。 只有當?shù)刂稾 和地址Y 指向同一bank上的不同行時,Code Flush 調(diào)用clflush 指令移出緩存數(shù)據(jù)才會重復激活X 和Y。
谷歌安全團隊已經(jīng)在x86 平臺上通過使用clflush 指令,成功地觸發(fā)Rowhammer 漏洞,利用頁表上發(fā)生的變化獲取內(nèi)核權(quán)限。
內(nèi)存重復數(shù)據(jù)刪除技術(shù)[27,28]是一種目前非常流行的通過合并優(yōu)化來減少內(nèi)存使用量的存儲技術(shù)。 為了追求更高的性能,當相同的內(nèi)容存在于多個內(nèi)存頁面時,管理程序會將這些內(nèi)存頁面進行合并,刪除多余的頁面,只保留一份,從而消除冗余數(shù)據(jù),釋放內(nèi)存。 保留的頁面被修改時會觸發(fā)缺頁中斷,計算機此時會將此頁面“寫時復制”,然后在新分配的物理頁上進行寫入。 然而這種熱門技術(shù)并不安全,攻擊者在同一主機中同時運行兩個虛擬機,一個是攻擊者虛擬機一個是目標虛擬機,結(jié)合二者在內(nèi)存中的相同部分,放在物理內(nèi)存中的某個位置上,通過反復“錘擊”,攻擊者可以獲取其相鄰的虛擬機內(nèi)存信息。
隨著DRAM 刷新速率翻倍(從每64ms 到每32ms),攻擊者將有一半的時間來釋放相鄰行的位。 最初的Rowhammer 攻擊只是單面攻擊,重復訪問目標行旁邊的一個相鄰行。 隨后有研究人員發(fā)現(xiàn),通過錘擊與目標行相鄰的兩行,也就是錘擊目標行物理位置上的前一行和后一行可以提高攻擊的效率。 該技術(shù)被稱為雙面錘擊[2]。 與單面攻擊相比,雙面Rowhammmer 攻擊通常只需不到一半的訪問次數(shù)即可翻轉(zhuǎn)。 雙面攻擊已被證明可以克服兩倍和四倍(16ms)刷新率[24]的緩解策略。
英特爾SGX(SoftwareGuard Extensions)是一種x86 指令集擴展,新增了一組指令集和內(nèi)存訪問機制,這些擴展允許創(chuàng)建一個安全環(huán)境enclave,在應(yīng)用程序的地址空間中劃分出一塊被保護的安全區(qū)域,在不受信任的環(huán)境中能保證enclave 內(nèi)運行數(shù)據(jù)的完整性和機密性,以免遭受惡意軟件的攻擊。
研究者在英特爾軟件保護擴展(SGX)受保護區(qū)(enclave)內(nèi)部進行攻擊,enclaves 中的代碼無法讀取或檢查,因為處理器阻止了對enclaves內(nèi)存的所有訪問。 由于代碼加密后只有啟動enclaves 才能對其進行解密,開發(fā)人員可以隱藏enclaves 內(nèi)的任意代碼。 因此,MASCAT 無法檢測到攻擊者在enclaves 內(nèi)進行的任何微架構(gòu)或Rowhammer 攻擊。 處理器在用于特定進程的性能計數(shù)器檢測中不包括SGX 活動,因此性能計數(shù)器也無法檢測到這種攻擊。 此外還可以利用SGX 針對云服務(wù)器進行拒絕服務(wù)型攻擊。
在x86 指令集中,操作碼中的比特位翻轉(zhuǎn)可產(chǎn)生其他有效操作碼。 在指令中只需一個目標比特位翻轉(zhuǎn),就可以改變二進制文件,由此提供具有root 權(quán)限的非特權(quán)進程,例如sudo。 這些操作碼與原始操作碼非常相似,但具有不同的甚至相反的語義。 以x86 操作碼JE =0x74 中的單個位翻轉(zhuǎn)為例,該操作碼中的單個位翻轉(zhuǎn)可以產(chǎn)生操作碼有:JNE =0x75、JBE =0x76、JO =0x70、JL =0x7C、PUSHQ =0x54、XORB =0x34(xor 字節(jié))、HLT=0xF4 等等。 類似地,可以在條件跳轉(zhuǎn)之前的TEST 指令中實現(xiàn)位翻轉(zhuǎn)以達到影響密碼驗證位置的測試或條件跳轉(zhuǎn)的效果[6]。 成功攻擊條件跳轉(zhuǎn)會更改條件,以便將錯誤的密碼視為正確密碼。
以前的Rowhammer 攻擊技術(shù)大都具有隨機性,通過觸發(fā)漏洞來翻轉(zhuǎn)頁表條目中的某些位進而實現(xiàn)權(quán)限提升。 而頁表噴射技術(shù)與此不同,這種技術(shù)則具有一定的概率性,首先通過在內(nèi)存中部署大量的頁表頁,使得至少有一個目標能夠位于脆弱的物理頁上。 然后攻擊該位置產(chǎn)生位翻轉(zhuǎn),從而使被攻擊的目標頁表指向一個任意物理內(nèi)存位置。
通過頁表噴射,攻擊者用生成的頁表副本填充整個內(nèi)存,達到將頁表放置在已知位翻轉(zhuǎn)的物理內(nèi)存位置,這種方法的弊端是會耗盡整個內(nèi)存,通過監(jiān)視內(nèi)存消耗可以輕松檢測到。
內(nèi)存伏擊的優(yōu)點在于不會耗盡內(nèi)存,采用優(yōu)化的觸發(fā)驅(qū)逐的方式,頁面緩存中確定性地逐出文件頁面,再重新映射到新的隨機物理位置。 通過不斷驅(qū)逐,頁面最終被放置在易受攻擊的物理位置上。
圖3(a)表示剛初始的內(nèi)存情況,空白方框為未經(jīng)使用的空閑頁面,藍色方格則表示正被使用的頁面,圖3(b)表示填充所有空閑頁面,同時從內(nèi)存中驅(qū)逐目標頁X,圖3(c)表示將X 重新加載到內(nèi)存中的另外一個位置,經(jīng)過多次訪問和驅(qū)逐操作,最終讓X 被加載到易受攻擊的位置A上。 2017 年, Gruss 和Lipp 等人首次提出了內(nèi)存伏擊技術(shù)[6],該技術(shù)能夠?qū)崿F(xiàn)云端的DDoS 攻擊和本地的提升特權(quán)攻擊。
利用Linux tmpfs 來保存逐出的文件,消除了原始Waylaying 算法的大部分磁盤I / O 開銷,從而更快地執(zhí)行頁面緩存逐出[7]。 通過對Linux 頁面緩存接口進行詳細分析,將Memway與posix fadvise API 結(jié)合在一起,posix fadvise 是linux 上對文件進行預取的系統(tǒng)調(diào)用,使用posix fadvise 快速重新定位目標二進制文件,并重復進行直到多次連續(xù)運行都無法生成新地址為止。然后執(zhí)行Memway 算法,重新排列整個頁面緩存,頁緩存由此被修改,目標被迫移到新地址,隨后的posix fadvise 調(diào)用可以再次生成新地址。 使用這種方法可以進行高效的二進制重定位,從而成倍數(shù)地縮短總運行時間。
宇宙射線和其他外部事件可通過改變電容[29,30]中的電荷水平導致DRAM 單元損壞,為了解決此問題,ECC 內(nèi)存在數(shù)據(jù)位旁增加了了額外的奇偶校驗位(也稱為控制位)來對數(shù)據(jù)進行錯誤檢查和糾正。 這是一種新的Rowhammer攻擊方法[31],Vrije 大學團隊通過故障注入和冷啟動攻擊,對部分內(nèi)存上的ECC 功能進行逆向工程,發(fā)現(xiàn)這部分ECC 內(nèi)存只能在它監(jiān)視的內(nèi)存段中進檢測并糾正一個位的翻轉(zhuǎn)。 當在同一內(nèi)存段中發(fā)生兩個位翻轉(zhuǎn)時,ECC 內(nèi)存底層應(yīng)用程序會崩潰以避免數(shù)據(jù)損壞或安全性受損。而當一次Rowhammer 攻擊導致了三個位同時翻轉(zhuǎn),ECC 則是不會有任何反應(yīng)。 雖然ECC 功能一度被看作對rowhammer 攻擊免疫,但ECC ploit通過在基于ECC 的系統(tǒng)上重現(xiàn)現(xiàn)有漏洞,證實了在ECC 內(nèi)存上也可以進行特權(quán)升級攻擊。
現(xiàn)有的攻擊方法雖然種類繁多,但總的來說都實現(xiàn)了以下幾個方面:第一方面是快速重復訪問內(nèi)存,觸發(fā)Rowhammer 漏洞的先決條件就是要快速多次訪問內(nèi)存單元導致足夠多的電荷泄露,由于緩存的存在,攻擊者采用了不同的手段來繞開緩存或者使其無效,例如使用clflush 指令。 第二方面是獲取物理內(nèi)存相鄰關(guān)系,為了更精準有效地進行攻擊,獲取獲取目標行與其相鄰行的物理地址是十分重要的一環(huán),通常對內(nèi)存做逆向工程來獲取邏輯地址與物理地址之間的映射關(guān)系。 第三方面是將敏感信息放在易受影響的位置上,頁表噴射、內(nèi)存伏擊等方法都是為了實現(xiàn)該目標,從而更加有針對性地進行攻擊。 表1 對幾種攻擊方法做了詳細對比。
表1 Rowhammer 攻擊技術(shù)對比
4.1.1 靜態(tài)分析
基于靜態(tài)分析可以訪問攻擊(二進制)代碼,在將軟件添加到應(yīng)用商店之前,如果檢測有效,則用戶不再受到攻擊。 Irazoqui 等人使用一種自動靜態(tài)代碼分析工具MASCAT 來做靜態(tài)分析,用于大規(guī)模檢測微架構(gòu)攻擊。
4.1.2 性能計數(shù)器監(jiān)控
性能計數(shù)器可用來監(jiān)控包括攻擊者程序的操作,Rowhammer 檢測的典型參數(shù)是緩存命中數(shù)和緩存失效數(shù)。 使用性能計數(shù)器監(jiān)視進程的可疑緩存活動,然后在指令指針附近搜索clflush指令來檢測攻擊。 Rowhammer 的底層Flush +Reload 循環(huán)也被緩存攻擊防御技術(shù)檢測到。
4.2.1 G-CATT
由于Rowhammer 攻擊需要翻轉(zhuǎn)頁表或其他內(nèi)核頁面中的比特位來接管系統(tǒng),內(nèi)存分配器可以防止用戶頁面和內(nèi)核頁面的物理接近。 GCATT 是一種替代內(nèi)存分配器,通過在物理內(nèi)存中留下間隙來隔離物理內(nèi)存中的用戶和內(nèi)核空間。 如果隔離有效,則用戶無法再接管內(nèi)核和系統(tǒng),確保攻擊者無法利用內(nèi)核內(nèi)存中的位翻轉(zhuǎn)來升級特權(quán)。
4.2.2 禁用內(nèi)存重復數(shù)據(jù)刪除技術(shù)
內(nèi)存重復數(shù)據(jù)刪除技術(shù)雖然可以減少磁盤占用,優(yōu)化存儲,但也容易被攻擊者利用,進行Rowhammer 攻擊。 通過禁止使用內(nèi)存重復數(shù)據(jù)刪除,防止Rowhammer 攻擊利用這些功能,有效抵抗Rowhammer 漏洞攻擊。
4.2.4 DRAM 地址重映射
將行錯誤分布在不同的DRAM 行和列中,以使攻擊單元不會集中在特定的行和列上。通過利用Rowhammer 誤差的分布,可以通過數(shù)學方法得出有效的重新映射矩陣。 使用導出的矩陣,通過兩個步驟重新映射整個DRAM 地址。 實驗結(jié)果表明,導出的矩陣可以有效地分配Rowhammer 誤差,大大降低錯誤發(fā)生的概率。
4.2.5 PARA 機制
PARA[32](概率性相鄰行激活)是一種識別Rowhammer 攻擊并刷新其相鄰行的低性能開銷機制,原理是每次訪問內(nèi)存中的一行時,它的相鄰行也會以一個較小概率p 刷新。 如果某一行受到攻擊被反復讀取,那么從統(tǒng)計學上可以確定,該行的相鄰行最終也會被刷新。 該方法省去了計算某行被訪問的次數(shù)或被攻擊者的地址的昂貴開銷,對性能影響微乎其微,能夠有效抵御Rowhammer 攻擊。
4.3.1 提高刷新速率
芯片通過BIOS 更新使得刷新速率提高了一倍,由于Rowhammer 攻擊必須在兩次內(nèi)存刷新的時間間隔內(nèi)發(fā)生,所以可以提高Rowhammer攻擊的門檻,但這不足以防止所有針對DRAM的攻擊。 由于DRAM 刷新已經(jīng)成為能耗、性能和服務(wù)質(zhì)量的重要負擔,如果再次提升內(nèi)存刷新速率,會對系統(tǒng)性能造成顯著的影響。 但是,提高刷新率可能是Rowhammer 漏洞最實用的即時解決方案,它不需要對系統(tǒng)進行任何重大的更改。
4.3.2 禁止使用cache 相關(guān)指令
快速激活DRAM 中每個bank 中的行以觸發(fā)rowhammer 漏洞,需要用到基于x86 的處理器上的clflush 指令來繞過設(shè)備中的高速緩存機制。 谷歌的沙箱等系統(tǒng)已經(jīng)禁止用戶級別訪問x86 clflush 緩存刷新指令,這對抵御許多針對x86 架構(gòu)的攻擊是非常有效的。
4.3.3 ECC(error corrected code)技術(shù)
ECC[1],即錯誤糾正碼,這是一種基于硬件的防御技術(shù),利用差錯檢測和修正算法來檢驗和糾正數(shù)據(jù)翻轉(zhuǎn)錯誤,相比奇偶校驗,ECC 功能更強、設(shè) 計 更 精 巧。 由 于 使 用 ECC 來 糾 正Rowhammer 錯誤的會增加能量、成本和DRAM容量開銷,通常在服務(wù)器上才使用該功能。 而且ECC 能夠快速地糾正1 位的錯誤和檢測2 位錯誤,但無法糾正超過1 位的錯誤也不能檢測高于2 位的錯誤,有一定的局限性。
4.3.4 內(nèi)存訪問模式監(jiān)控
由于Rowhammer 攻擊需要在一個內(nèi)存行上存在大量緩存失效,并且在同一DRAM bank中的其他行上需要大量的訪問。 ANVIL[24]通過使用現(xiàn)有的硬件性能計數(shù)器跟蹤DRAM 訪問的位置來檢測行錘攻擊,檢測分為兩個階段檢: 首先,它監(jiān)視最后一級緩存失效率。 接下來,如果緩存失效率超過閾值,ANVIL 使用Intel PEBS 監(jiān)視緩存失效的地址, 并將Rowhammer 攻擊與正常工作負載區(qū)分開。 對于每個候選行,檢查“來自同一DRAM bank 的其他行訪問樣本”。 只有當對同一個bank 的其他行有足夠多的訪問時,才會檢測到攻擊并刷新被攻擊的行。
基于Rowhammer 漏洞的防御技術(shù)要么不實用,要么需要改變硬件,想要應(yīng)用于實際有極大的限制,防御技術(shù)具體優(yōu)缺點如表2 所示。 相比較而言,基于檢測Rowhammer 漏洞的防御技術(shù)和基于抵抗Rowhammer 漏洞的防御技術(shù)更加的實用,并且兩種類型的防御技術(shù)可以結(jié)合使用來升級防御手段,提高攻擊門檻,獲得更好的防御效果。 有許多防御技術(shù)需要犧牲性能或存在諸多限制,攻擊者在不斷更新攻擊手段,現(xiàn)有的一些防御技術(shù)也在被證實并不安全,例如之前認為ECC 內(nèi)存和手機內(nèi)存都不受此漏洞影響,然而研究證明通過改進的攻擊技術(shù)能夠成功進行攻擊。
表2 Rowhammer 防御技術(shù)對比
隨著工藝提升,內(nèi)存的體積越來越小,由設(shè)計缺陷引起的Rowhammer 漏洞無法通過簡單的方法徹底消除,而內(nèi)存在每一臺計算機中都是重要的組成部分,所以對于Rowhammer 漏洞研究有著十分重要的現(xiàn)實意義。 隨著系統(tǒng)安全研究人員對Rowhammer 的了解更多,并且由于技術(shù)擴展問題而使Rowhammer 繼續(xù)從根本上影響存儲芯片,研究人員和從業(yè)人員將開發(fā)各種類型的攻擊,以在各種情況下以多種創(chuàng)新方式利用Rowhammer。 同時隨著Rowhammer 漏洞的深入挖掘,更多的研究人員也會專注于研發(fā)新的防御手段,以最大程度地減少暴露給軟件(以及公眾)的此類硬件故障。 當前針對Rowhammer 攻擊,研究的主要方向是如何提高攻擊的穩(wěn)定性、成功率和降低時間消耗,使得攻擊者能夠更好的定向地攻擊內(nèi)存中某個特定位置。 而防御技術(shù)的發(fā)展分為兩個方面,第一是短期的緩解措施,能夠應(yīng)對當前的攻擊手段,包括增加限制條件、提高攻擊的不穩(wěn)定性和增加時間消耗等;第二是研究長期的解決方案,旨在消除硬件漏洞,受實際情況和現(xiàn)有技術(shù)限制,該方向的研究還有很長的路要走。 隨著存儲器技術(shù)向更高密度的擴展,密度越高受此漏洞影響越大,其他類型的存儲器(例如NAND 閃存或相變存儲器)中也可能潛藏著類似的漏洞,這些漏洞可能會威脅到安全系統(tǒng)的基礎(chǔ)[32],對于Rowhammer 漏洞的深入研究對防范以后可能出現(xiàn)的此類漏洞有著深遠意義。我國對于Rowhammer 漏洞的研究還處于起步階段,針對如何利用該漏洞和防護以及對于發(fā)現(xiàn)和解決由于技術(shù)擴展和硬件設(shè)計而可能增加的其他潛在漏洞還有很大的研究空間,對可靠和安全的存儲系統(tǒng)進行研究有著光明的前景。