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