安全研究人員發(fā)現(xiàn)在英特爾PC上的Linux系統(tǒng)中可以利用某些種類的DDR DRAM芯片所存在的物理缺陷來獲取系統(tǒng)最高權(quán)限。
該技術(shù)被稱為“Rowhammer”,其可使最近一代的 DRAM 芯片多次訪問內(nèi)存導(dǎo)致相鄰行發(fā)生“位翻轉(zhuǎn)”,并允許任何人改變計算機內(nèi)存中的存儲內(nèi)容。
什么是Rowhammer?
DDR存儲器對數(shù)據(jù)進行行和列的數(shù)組排列,然后分配給各種服務(wù)器、應(yīng)用程序以及大規(guī)模的操作系統(tǒng)。為了防止應(yīng)用程序之間相互訪問內(nèi)存,通過“沙箱”將他們進行隔離。
但“沙箱”可以通過一些惡意軟件對存儲的第二部分中需要多次進行訪問相鄰行的內(nèi)容使用比特翻轉(zhuǎn)技術(shù)來繞過。因此,攻擊兩個相鄰的內(nèi)存區(qū)域很可能會導(dǎo)致電荷泄露或?qū)ζ渌糠衷斐筛蓴_。
研究人員解釋道:
“有足夠的訪問量就可以進行0到1或者1到0的改變,換句話說選擇的zero區(qū)域很有可能轉(zhuǎn)移給受害者”
位翻轉(zhuǎn)技術(shù)首次出現(xiàn)是在卡內(nèi)基梅隆大學(xué)發(fā)表的一篇學(xué)術(shù)研究報告中,該報告名為
《Flipping Bits in Memory Without Accessing Them: An Experimental Study of DRAM Disturbance Errors》
另外,位翻轉(zhuǎn)技術(shù)不應(yīng)該與緩沖區(qū)溢出以及use-after-free內(nèi)存崩潰技術(shù)混淆。use-after-free內(nèi)存崩潰技術(shù)是一種攻擊者把惡意shellcode植入受害者電腦保護區(qū)域的技術(shù)。
原理解析
正如我們所知,DRAM芯片的生產(chǎn)規(guī)模會隨著物理尺寸的減小而減小,而最新的技術(shù)對于內(nèi)存容量的要求更高,使得芯片單元間的電子干擾很難被阻止。
目前Google Project Zero的研究人員 Mark Seaborn和Thomas Dullien已經(jīng)成功的在x86-64的GNU/Linux平臺上利用這個漏洞通過CLFLUSH指令和PTEs(page table entries)的某一位的變化(比如0到1)直接獲得內(nèi)核權(quán)限,研究人員認為在其他的硬件架構(gòu)和操作系統(tǒng)上也有類似的方法可以達到這一目的,解決這個漏洞的修復(fù)可能需要BIOS更新針對內(nèi)存控制器部分的操作。
在Yoongu Kim et al的論文中談到了關(guān)鍵的原理:
code1a:
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 code1a
兩個因素導(dǎo)致位的變化
1、地址選擇:地址X和地址Y必須印射到內(nèi)存的不同row但是又是在同一bank上。
每個DRAM芯片包含了很多行(row)的單元。訪問一個byte在內(nèi)存中涉及到將數(shù)據(jù)從row傳輸?shù)叫酒?quot;row buffer"中(放電操作),當(dāng)讀取或者寫入row buffer的內(nèi)容后,再把row buffer內(nèi)容傳輸?shù)皆瓉淼膔ow單元里(充電操作)。這種”激活“一個row的操作(放電和充電)可以干擾到臨近的row。如果這樣做足夠多的次數(shù),臨近row的自動刷新操作(一般是每64ms)可能會讓臨近row的位產(chǎn)生變化。row buffer作為緩存,如果地址X和Y指向相同的row,那code1a將會從row buffer中讀取信息而不用任何”激活“操作。
每個DRAM的bank都有自己的"當(dāng)前已激活的row",所以如果地址X和地址Y指向不同的bank,code1a將會從那些bank的row buffer中讀取信息而不用反復(fù)的激活row。所以,如果地址X和地址Y指向同一bank上不同的row,code1a會導(dǎo)致X和Y不斷的被激活,這被稱為ROWHAMMERING。
2、繞過緩存:沒有了code1a中的CLFLUSH指令的話,內(nèi)存讀操作(mov)只會操作CPU的緩存。CLFLUSH刷新緩存的操作強制讓內(nèi)存的訪問直接指向DRAM,而這會導(dǎo)致不斷有row被重復(fù)的激活。