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