簡(jiǎn)介
Rowhammer表明,基于非物理硬件的攻擊可能具有破壞性。在最近的一篇論文中,Cai等人提出,可以在基于MLC NAND閃存的SSD上執(zhí)行類似的攻擊,并且具有潛在的破壞性。在本文中,我們將討論在SSD上成功地進(jìn)行全系統(tǒng)的本地權(quán)限提升的攻擊的要求,并展示基于文件系統(tǒng)的攻擊方法,我們將對(duì)此進(jìn)行演示。 特別地,我們展示了攻擊者可以通過使用單元與單元之間的干擾獲得攻擊原語,因此需要在OS層進(jìn)行精心的設(shè)計(jì)。
前言
在開發(fā)軟件時(shí),通常會(huì)抽象出硬件,并將諸如資源隔離等安全保護(hù)視為理所當(dāng)然。 簡(jiǎn)而言之,現(xiàn)代軟件編程幾乎不需要知道底層硬件的復(fù)雜性。
Rowhammer 把硬件的內(nèi)部運(yùn)作引入到我們的注意力中。 Rowhammer利用內(nèi)存管理更深層次的缺陷來破壞敏感的內(nèi)存區(qū)域。最近的工作表明,這樣一個(gè)非顯而易見的復(fù)雜漏洞可以被利用來通過Javascript注入錯(cuò)誤[8],實(shí)現(xiàn)手機(jī)上的權(quán)限升級(jí)[22]或者破壞共同托管的虛擬機(jī)。
但是,DRAM并不是唯一擁有敏感數(shù)據(jù)的地方,這些敏感數(shù)據(jù)對(duì)在軟件中實(shí)施正確的安全保護(hù)是必不可少的。通過文件系統(tǒng)組織的持久性存儲(chǔ),根據(jù)存儲(chǔ)在磁盤上的元數(shù)據(jù)授予對(duì)數(shù)據(jù)的訪問權(quán)限。在現(xiàn)代計(jì)算機(jī)中,閃存已經(jīng)在很大程度上取代了旋轉(zhuǎn)磁盤作為主要的永久性存儲(chǔ)介質(zhì)。
Cai等人最近發(fā)表的論文中提出在固態(tài)硬盤上可能出現(xiàn)類似rowhammer的攻擊,但不會(huì)出現(xiàn)實(shí)際的攻擊,我們從系統(tǒng)角度研究這類攻擊SSD的可行性。 特別是,我們表明,在對(duì)閃存設(shè)備行為和文件系統(tǒng)使用的真實(shí)假設(shè)下,利用閃存弱點(diǎn)來升級(jí)本地權(quán)限是可能的(雖然很具有挑戰(zhàn)性)。 我們演示的攻擊不是”全系統(tǒng)”,因?yàn)槲覀儍H僅演示了文件系統(tǒng)層的攻擊,并假定底層閃存介質(zhì)的損壞是可能的。 但是,我們還描述了這種攻擊如何擴(kuò)展到全系統(tǒng)攻擊,我們打算在未來的工作中展示這種攻擊。
更準(zhǔn)確地說,我們利用對(duì)SSD(包括ECC)中現(xiàn)有可靠性機(jī)制的了解,證明攻擊者從MLC NAND閃存的缺陷中獲得的attack primitive是粗粒度的損壞:不像在rowhammer中,攻擊者可以翻轉(zhuǎn)單個(gè)bit,在這種攻擊的情況下,攻擊者只能破壞一個(gè)數(shù)據(jù)塊。然后我們證明,這個(gè)較弱的attack primitive(與翻轉(zhuǎn)單個(gè)位相比,這為攻擊者提供了更高級(jí)別的控制)足以導(dǎo)致提升本地權(quán)限的攻擊。
模型:我們假設(shè)被攻擊系統(tǒng)在基于MLC NAND閃存的SSD上運(yùn)行文件系統(tǒng),并假設(shè)攻擊者不具有特權(quán),即被攻擊系統(tǒng)的非root訪問。該訪問使攻擊者可以通過文件系統(tǒng)對(duì)系統(tǒng)存儲(chǔ)器進(jìn)行受控寫入訪問。一個(gè)典型的場(chǎng)景是非特權(quán)用戶的登錄shell。我們不討論對(duì)被攻擊統(tǒng)的物理訪問。
貢獻(xiàn):本文的主要貢獻(xiàn)如下:
(1)我們首次詳細(xì)介紹了如何進(jìn)行完整系統(tǒng)地,基于閃存缺陷的、提升本地特權(quán)的攻擊。
(2)我們將此攻擊在文件系統(tǒng)級(jí)別進(jìn)行了實(shí)施并演示。
(3)我們討論了該攻擊的泛化和限制。
背景介紹
2.1基于硬件的攻擊
表1展示了基于硬件攻擊的分類。首先,我們區(qū)分兩個(gè)主要類別:物理和非物理攻擊。對(duì)于物理攻擊,需要直接訪問系統(tǒng)的硬件。這種攻擊的例子是探測(cè)電壓電平或刮掉硅芯片上的鍍層來對(duì)其邏輯進(jìn)行逆向工程。少數(shù)相關(guān)的例子使用冷卻劑噴霧和冷啟動(dòng)來從系統(tǒng)的記憶庫中泄露敏感信息。另一方面,非物理攻擊仍然利用系統(tǒng)的硬件,但不需要直接訪問,因此可能更強(qiáng)大。例如,定時(shí)旁路攻擊可以針對(duì)云中的服務(wù)器遠(yuǎn)程執(zhí)行。
在正交層面上,我們區(qū)分危害系統(tǒng)機(jī)密性和完整性的攻擊。危害機(jī)密性的攻擊通常需要讀取原語來公開敏感信息,例如高速緩存旁道攻擊中的關(guān)鍵材料。另一方面,對(duì)系統(tǒng)完整性的攻擊需要寫入原語來主動(dòng)修改和破壞系統(tǒng)的各個(gè)方面以改變其行為。一個(gè)非常突出的例子是drammer [22],它使用rowhammer [10,19]內(nèi)存寫入原語在Android上執(zhí)行特權(quán)升級(jí)攻擊 。
本文中顯示的攻擊屬于同一類非物理硬件完整性攻擊。
2.2 閃存的缺陷
MLC NAND閃存表現(xiàn)出與介質(zhì)和器件特性相關(guān)的可靠性問題。首先,MLC NAND Flash上的重復(fù)編程擦除(P / E)周期會(huì)加重器件的負(fù)載并逐漸使其可靠性變差[23]。其次,單元間干擾(CCI)是閃存頁面寫入期間發(fā)生的另一個(gè)不利影響,并影響NAND器件的可靠性。由于存儲(chǔ)器陣列中相鄰單元之間的電容耦合[12],施加于當(dāng)前正在編程的頁面單元的編程電壓對(duì)相鄰頁面單元造成干擾。第三,由于只讀操作的反復(fù)執(zhí)行而導(dǎo)致的閾值電壓不穩(wěn)定,從而造成干擾,導(dǎo)致位錯(cuò)誤數(shù)量的顯著增加[21]。第四,最近的研究已經(jīng)表明,在部分編程的MLC NAND塊中,在頁面編程完成之前,會(huì)進(jìn)行大量的讀取,剩下的頁面的誤碼率會(huì)顯著增加[14]。
攻擊者可以利用CCI來更改被攻擊者閃存頁面中的信息。這可以通過使用對(duì)被攻擊的閃存頁面產(chǎn)生最大干擾的特殊數(shù)據(jù)模式對(duì)相鄰的被攻擊者頁面進(jìn)行編程來實(shí)現(xiàn)。由于CCI的性質(zhì),只有少數(shù)單元可以進(jìn)行狀態(tài)轉(zhuǎn)換。 具體而言,CCI可以導(dǎo)致單元狀態(tài)僅轉(zhuǎn)換到較大的閾值電壓。使用CCI,攻擊者可以寫入具有最大干擾模式的攻擊閃存頁,以概率的方式對(duì)相鄰受害者頁面的所有或不同字段的單元進(jìn)行不受控制的隨機(jī)修改。
2.3 閃存可靠性的方法
在閃存控制器級(jí)別,使用兩種機(jī)制來提高可靠性:擾碼和糾錯(cuò)碼(ECC)。由于某些位模式更可能導(dǎo)致錯(cuò)誤,因此數(shù)據(jù)不會(huì)按原樣寫入,而是由擾碼器編碼以減少錯(cuò)誤的方式寫入[20]。 通常情況下,數(shù)據(jù)可以通過與塊地址相關(guān)的位模式簡(jiǎn)單異或。關(guān)于ECC,寫入閃存頁的數(shù)據(jù)被編碼:將冗余位添加到用戶數(shù)據(jù)中,以確保從閃存讀取的二進(jìn)制序列中存在的錯(cuò)誤可通過解碼進(jìn)行糾正。閃存存儲(chǔ)系統(tǒng)中使用的編碼字長度通常在512B到2KB之間。雖然兩種使用最廣泛的編碼是Bose-Chaudhuri-Hocquenghem(BCH)編碼和低密度奇偶校驗(yàn)(LDPC)編碼,但編碼設(shè)計(jì)的確切細(xì)節(jié)是制造商決定的。
全系統(tǒng)攻擊
利用閃存缺陷的本地權(quán)限提升的全系統(tǒng)攻擊需要解決存儲(chǔ)層次結(jié)構(gòu)上不同層面的多重挑戰(zhàn)。即從最低層到最高層:
(1)閃存芯片:?jiǎn)卧g干擾。
(2)閃存控制器:擾碼器和ECC。
(3)SSD控制器:磨損均衡和塊放置算法。
(4)操作系統(tǒng):文件系統(tǒng)緩存和錯(cuò)誤檢測(cè)。
(5)用戶:權(quán)限提升。
第1層是攻擊的基礎(chǔ)。正如第2節(jié)所述,以前的工作表明可以在具有特定訪問模式的閃存頁中引起位翻轉(zhuǎn),特別是使用單元間干擾。
Flash社區(qū)早已知道并研究了NAND錯(cuò)誤,并且在SSD可靠性問題的背景下,制造商設(shè)計(jì)了閃存和SSD控制器,以降低在實(shí)際使用中發(fā)生此類錯(cuò)誤的概率。 實(shí)質(zhì)上,第2層和第3層旨在向操作系統(tǒng)提供沒有可靠性問題的塊設(shè)備的抽象,并以存儲(chǔ)設(shè)備的尋址粒度完美隔離訪問。通常在系統(tǒng)安全性方面,這種抽象可能顯示出漏洞。接下來我們解釋攻擊者可能從這個(gè)漏洞抽象中得到什么攻擊原語。
剩下的挑戰(zhàn)(第4層到第5層)主要在于找到一個(gè)基于文件系統(tǒng)的攻擊矢量,它利用了這個(gè)弱攻擊原語,這是本文的主要貢獻(xiàn)。 這種攻擊的總體思路是破壞文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),并準(zhǔn)備新的文件系統(tǒng)并選擇結(jié)構(gòu),這可能導(dǎo)致權(quán)限的提升(在這種情況下,創(chuàng)建SUID根目錄的 shell二進(jìn)制文件)。
我們已經(jīng)探索了多種可能性,并在第4節(jié)中介紹了我們發(fā)現(xiàn)的最佳攻擊方案(就成功概率而言)。
3.1 Attack primitives
系統(tǒng)中ECC編碼/解碼的存在決定了攻擊者所期望的最好的情況是對(duì)flash頁面/塊的不受控制的隨機(jī)修改。為了理解這一點(diǎn),讓我們考慮一下不同的解碼方法,即通過將原始位錯(cuò)誤注入閃存頁面可能會(huì)導(dǎo)致攻擊行為。我們將假設(shè)用戶數(shù)據(jù)已經(jīng)使用BCH編碼進(jìn)行保護(hù),BCH編碼能夠利用它的碼字(C1)糾正t bit出錯(cuò)。T的值通常非常高(例如,t = 50)。 在引入錯(cuò)誤時(shí),可能會(huì)引發(fā)三種可能的事件:
(1)解碼成功。如果引入的錯(cuò)誤數(shù)小于或等于t,解碼一定成功。
(2)檢測(cè)到解碼失敗。如果注入錯(cuò)誤的數(shù)量嚴(yán)格大于t并且得到的二進(jìn)制向量不在另一個(gè)碼字的解碼半徑內(nèi),則會(huì)發(fā)生此情況。通常,讀取失敗將由系統(tǒng)報(bào)告,系統(tǒng)將處理該失敗操作。
(3)未檢測(cè)到解碼失敗。 當(dāng)注入錯(cuò)誤的數(shù)量嚴(yán)格大于t并且所得到的矢量落入另一個(gè)碼字(C2)的解碼半徑內(nèi)時(shí),會(huì)發(fā)生此情況。如果發(fā)生此情況,則不會(huì)報(bào)告讀取失敗并將損壞的數(shù)據(jù)返回給用戶,就像讀取成功一樣。
圖1說明了三種不同類型的解碼事件。顯然,成功的攻擊只能利用未檢測(cè)到的解碼失敗的事件。因此,攻擊者必須注入足夠的錯(cuò)誤以將原始回讀模式推入不正確碼字的解碼半徑。 以這種方式,有可能導(dǎo)致真正的數(shù)據(jù)損壞,但是將這種損壞的模式控制到bit級(jí)是不可能的。可以誘發(fā)的損壞模式的集合由可通過經(jīng)由CCI機(jī)制或以其他方式翻轉(zhuǎn)寫入模式中的比特而可達(dá)到的錯(cuò)誤代碼字的數(shù)量來確定。為了描述和總結(jié)這一點(diǎn),從最強(qiáng)到最弱的可能攻擊原語可能是:
(1)P1:在可控de 位置翻轉(zhuǎn)單個(gè)bit
(2)P2:在塊內(nèi)不可控制地翻轉(zhuǎn)單個(gè)bit
(3)P3:對(duì)塊進(jìn)行無控制的隨機(jī)修改(高位翻轉(zhuǎn),導(dǎo)致無法檢測(cè)的解碼失敗)
(4)P4:損壞一個(gè)塊(讀取該塊時(shí)出錯(cuò))
對(duì)于DRAM的rowhammer 是可以實(shí)現(xiàn)P1或P2的,但,由于閃存具備強(qiáng)大的ECC保護(hù), P1和P2在這里不太可能實(shí)現(xiàn)。P4極不可能用于提升權(quán)限的攻擊。 我們將攻擊集中在P3上,這是唯一可能成功實(shí)現(xiàn)的攻擊。
在實(shí)施攻擊時(shí),F(xiàn)TL操作(如磨損均衡和垃圾回收(GC)引起的閃存頁面的寫入)以及塊放置算法必須考慮在內(nèi)。傳統(tǒng)地,F(xiàn)TL執(zhí)行磨損均衡是試圖使所有的塊具有相同的P/E值[5]。由于磨損均衡通常是不經(jīng)常的操作,因此攻擊者可以通過多次重復(fù)攻擊來緩解磨損均衡對(duì)攻擊造成的潛在干擾。另一方面,F(xiàn)TL 的GC寫入操作在穩(wěn)定的寫入工作負(fù)載下可能是用戶寫入數(shù)據(jù)的多倍[1,3],因此占總閃存頁寫入的很大一部分。為了避免GC寫入操作對(duì)攻擊造成干擾,攻擊者可以等待足夠的時(shí)間(通常為幾十秒),以便GC操作在攻擊開始之前以及完成。這是可能成功的,因?yàn)镾SD通常在閑置時(shí)準(zhǔn)備大量空閑以維持用戶寫入的突發(fā)。
為了在閃存芯片級(jí)別最大化并行性,SSD通常使用塊放置算法,其將到來的寫入操作動(dòng)態(tài)地映射到不同的Flash芯片(例如,以循環(huán)方式)。 這些塊放置算法可以阻止攻擊者的攻擊,因?yàn)閷懭氡还繇撁婧罅⒓窗l(fā)生攻擊頁面寫入,可能不會(huì)發(fā)生在與被攻擊頁面相同的閃存塊中。為了緩解這一障礙,攻擊者應(yīng)該重復(fù)寫入攻擊者頁面足夠多的時(shí)間,最終使其寫入到與被攻擊者頁面相同的閃存塊中。
3.2 測(cè)試平臺(tái)
我們的測(cè)試平臺(tái),如圖2所示,包含:帶有FPGA和DRAM的PCIe閃存開發(fā)板,通用CPU和MLC NAND閃存芯片。NAND閃存的編程,數(shù)據(jù)擾碼器和糾錯(cuò)碼(ECC)都在FPGA中完全實(shí)現(xiàn)。FTL運(yùn)行在FPGA和CPU上。開發(fā)板連接到運(yùn)行RHEL 6.7的x86-64服務(wù)器上。我們可以完全控制在開發(fā)板上運(yùn)行的硬件和軟件堆棧,以及與設(shè)備通信的Linux設(shè)備驅(qū)動(dòng)程序。
在我們的測(cè)試平臺(tái)中使用的MLC NAND芯片在可靠性方面的研究已經(jīng)在之前的工作中有介紹到[14,15,16]。在這項(xiàng)工作的背景下,測(cè)試平臺(tái)已被用于驗(yàn)證我們對(duì)MLC NAND閃存行為的理解
文件系統(tǒng)層攻擊
我們現(xiàn)在詳細(xì)描述攻擊中與文件系統(tǒng)相關(guān)的部分(第4層到第5層)。演示本地權(quán)限提升的視頻:https://www.youtube.com/watch?v=Mnzp1p9Nvw0。成功的攻擊需要滿足以下約束條件:
(1)R1:目標(biāo)塊的數(shù)據(jù)損壞應(yīng)該不會(huì)(或以很低的概率)導(dǎo)致致命的文件系統(tǒng)錯(cuò)誤,從而阻止攻擊并需要管理員干預(yù)。
(2)R2:攻擊目標(biāo)應(yīng)該是經(jīng)常寫的塊(為了獲得更大的成功機(jī)會(huì))。理想情況下,寫入應(yīng)該由攻擊者觸發(fā)。這是為了允許對(duì)攻擊的第1層到第3層的文件系統(tǒng)攻擊進(jìn)行計(jì)時(shí)。
(3)R3:目標(biāo)塊的數(shù)據(jù)損壞應(yīng)該具有足夠的可能性來創(chuàng)建可利用的條件。
(4)R4:新緩存應(yīng)該被刷新以強(qiáng)制操作系統(tǒng)訪問閃存盤中的損壞數(shù)據(jù)。
4.1 環(huán)境搭建
我們使用ext3文件系統(tǒng)在Linux上實(shí)施了攻擊,并使用默認(rèn)的安裝選項(xiàng)進(jìn)行安裝。文件系統(tǒng)不需要是根文件系統(tǒng)。我們將在第5節(jié)討論這些假設(shè)在多大程度上可以放寬和推廣。
4.2 攻擊
考慮到攻擊的限制,我們選擇了indirect block作為被攻擊的塊。
ext3 的indirect block是一個(gè)包含數(shù)據(jù)塊指針的文件系統(tǒng)塊大小區(qū)域,每個(gè)大小為4個(gè)字節(jié)。 因此,在4K塊大小的文件系統(tǒng)中,indirect block包含1024個(gè)數(shù)據(jù)塊指針(數(shù)據(jù)塊包含文件內(nèi)容)。 一旦文件大小超過12個(gè)塊,就會(huì)(通過內(nèi)核文件系統(tǒng)驅(qū)動(dòng)程序)寫入一個(gè)indirect block:因此這個(gè)寫入非常容易為攻擊者提供提供觸發(fā)機(jī)會(huì)。
如果攻擊的較低層(第1層到第3層)成功,則indirect block被破壞,對(duì)于indirect block中的1024個(gè)數(shù)據(jù)指針中的每一個(gè),有三種可能的結(jié)果。
(1)32位數(shù)據(jù)指針可指向文件系統(tǒng)內(nèi)部的一個(gè)”interesting block”(例如,inode table,root ssh私鑰文件,root使用的重要二進(jìn)制文件):這是唯一可利用的條件。
(2)32位數(shù)據(jù)指針可指向文件系統(tǒng)內(nèi)的”uninteresting block “,例如已經(jīng)屬于攻擊用戶的文件中的數(shù)據(jù)塊。
(3)32位數(shù)據(jù)指針可指向文件系統(tǒng)外部的塊(即:塊號(hào)≥文件系統(tǒng)上的塊數(shù))。 在這種情況下,攻擊是不可利用的。 但是,幸運(yùn)的是,文件系統(tǒng)內(nèi)核驅(qū)動(dòng)程序只會(huì)為相應(yīng)的數(shù)據(jù)訪問返回一個(gè)錯(cuò)誤:后續(xù)使用相同indirect block的訪問仍然可以成功。 如果1024個(gè)損壞塊中的任何一個(gè)指向一個(gè)interesting block的塊,驅(qū)動(dòng)程序的這種行為對(duì)攻擊是有效的,這大大增加了攻擊的成功概率。
假設(shè)被損壞的指針指向一個(gè)inode表(可利用的條件)。 然后,攻擊者可以通過簡(jiǎn)單地寫入攻擊文件(受攻擊者控制)來創(chuàng)建(或修改)一個(gè) root 用戶所有的inode。 然后,攻擊者將這個(gè)inode的數(shù)據(jù)塊指針指向一個(gè)shell的數(shù)據(jù)塊,最后通過執(zhí)行攻擊文件(現(xiàn)在是一個(gè)SUID-root shell,這需要SUID-root shell對(duì)應(yīng)的inod從緩存中刷新)來提升權(quán)限,如圖3所示。
我們已經(jīng)證明了R1是符合要求的,因?yàn)殡S機(jī)地破壞indirect block不會(huì)導(dǎo)致致命的錯(cuò)誤。 R2也是符合的,因?yàn)楣粽哂|發(fā)indirect block指針的寫入(通過簡(jiǎn)單地向文件中寫入足夠的字節(jié))。我們現(xiàn)在表明,R3約束(創(chuàng)造充分可利用的條件的概率)也得到了滿足。
單個(gè)數(shù)據(jù)指針指向interesting block的概率是p1:
并且任何1/4的塊大小的攻擊指針指向interesting block的概率是p2:
假設(shè)只有inode表對(duì)于攻擊者而言是”有趣的”,并且具有4 KB塊大小的100 GB文件系統(tǒng),每個(gè)inode(缺省值為/etc/mke2fs.conf)16384字節(jié)的inode比率為:
因此,假設(shè)攻擊者在indirect inode成功地使一個(gè)數(shù)據(jù)塊崩潰,權(quán)限提升攻擊將將有9%的概率會(huì)成功。 因此,我們認(rèn)為R3比較符合。
最后,我們展示緩存可以被攻擊者刷新(R4)。攻擊者需要在兩個(gè)不同的時(shí)間刷新緩存:為了覆蓋inode表內(nèi)容,并執(zhí)行新創(chuàng)建的SUID-root shell。在第一種情況下,應(yīng)從緩存中剔除出的緩存數(shù)據(jù)是indirect block,在第二種情況下,是inode。攻擊者自然可以采取兩種策略:被動(dòng)或主動(dòng)攻擊。被動(dòng)地,攻擊者可以等待文件系統(tǒng)被重新安裝(例如,在重新啟動(dòng)時(shí)),或者系統(tǒng)上的并發(fā)活動(dòng)導(dǎo)致足夠的內(nèi)存壓力,以從緩存中驅(qū)逐間接塊以及隨后的inode。主動(dòng)攻擊者觸發(fā)的路由包括創(chuàng)建內(nèi)存壓力:攻擊者只是使用程序分配足夠的內(nèi)存,從而鼓勵(lì)操作系統(tǒng)從緩存中逐出文件系統(tǒng)元數(shù)據(jù)。這是我們?cè)谘菔局胁捎玫姆椒ā?(這種方法的有效性可能會(huì)因VFS和頁面緩存設(shè)置的不同而不同,但在我們的攻擊中,RHEL 6.7的默認(rèn)設(shè)置是驅(qū)逐有效的)。
4.3 細(xì)節(jié)探索
我們現(xiàn)在討論在實(shí)際過程中出現(xiàn)的一些細(xì)節(jié),但不是攻擊的核心。
首先,從上面的描述可以看出,攻擊者需要知道一個(gè)root shell的數(shù)據(jù)塊號(hào)。 盡管可以通過從inode表讀取(通過被攻擊文件)并識(shí)別shell(例如通過時(shí)間戳或文件大小)來查找,但這是不太可能的,因?yàn)閕node表的可讀部分不太可能包含root shell。 一個(gè)更簡(jiǎn)單的替代方案是攻擊者首先通過在目標(biāo)文件中創(chuàng)建一個(gè)shell的副本,從而讓文件系統(tǒng)創(chuàng)建并設(shè)置數(shù)據(jù)塊指針,然后設(shè)置SUID位并通過直接寫入inode table的方式使文件為root所有。
其次,攻擊者需要能夠識(shí)別破壞是否成功,即indirect block指針指向inode table的某處而不是其他地方。 實(shí)際上,由于inode表的結(jié)構(gòu),這很容易實(shí)現(xiàn)(例如,具有默認(rèn)權(quán)限的常規(guī)文件的標(biāo)記每256個(gè)字節(jié)重復(fù)一次)。
第三,攻擊者可以覆蓋現(xiàn)有的inode或?qū)⒁獎(jiǎng)?chuàng)建的文件的inode。 如果攻擊者對(duì)其可以創(chuàng)建的文件數(shù)量沒有限制(這通常是大多數(shù)Linux發(fā)行版的默認(rèn)設(shè)置),我們可以假設(shè)我們始終處于前一種情況。 然后,攻擊者不停創(chuàng)建文件,直到文件系統(tǒng)用完inode(所有inode表已滿),然后在文件系統(tǒng)中搜索(例如,使用find)一個(gè)SUIDroot文件并執(zhí)行它:這是在我們的演示中完成的一個(gè)攻擊方式。 在攻擊者可以創(chuàng)建的文件數(shù)量上有限制的情況下,雖然我們還沒有嘗試過,攻擊仍然是可能的(通過刪除文件,等待inode重新分配給其他用戶并創(chuàng)建新文件,直到目標(biāo)inode被分配給攻擊者)。
最后,攻擊者可能無法通過文件系統(tǒng)訪問現(xiàn)有的inode(例如,它位于攻擊者無法訪問的子目錄中)。在實(shí)踐中,這僅僅意味著interesting block的數(shù)量低于等式3中計(jì)算的塊數(shù)。
4.4 Improved attack using double indirect blocks
針對(duì)double indirect block的破壞而非indirect block的破壞可以執(zhí)行非常類似的攻擊。 盡管這種攻擊稍微難以解釋,但它成功的可能性更高和而且更靈活(對(duì)整個(gè)文件系統(tǒng)具有完全的讀寫能力:請(qǐng)注意,這仍然會(huì)通過創(chuàng)建SUID-root文件來提升權(quán)限)。
double indirect block中的每個(gè)4字節(jié)指針都指向一個(gè)indirect block。 因此,破壞double indirect block可能導(dǎo)致攻擊者完全控制indirect block的內(nèi)容。 通過選擇indirect block中的指針,攻擊者可以讀寫文件系統(tǒng)中的任意位置。
這里的可利用條件是double indirect block中的一個(gè)指針指向攻擊者擁有的塊。 例如,攻擊者可以在文件系統(tǒng)上創(chuàng)建一個(gè)非常大的文件(跨越多個(gè)塊),以增加某個(gè)受損指針受到攻擊的可能性。 一旦發(fā)生破壞,攻擊者可以通過用文件系統(tǒng)超級(jí)塊的地址(固定塊號(hào)和可識(shí)別的格式)填充大文件來驗(yàn)證他們是否擁有indirect block。 然后,攻擊者可以通過讀寫目標(biāo)文件來修改大文件的內(nèi)容以訪問文件系統(tǒng)上的任何塊:通過寫入大文件來控制寫或讀訪問的位置(控制indirect block內(nèi)容),通過訪問目標(biāo)文件來控制訪問內(nèi)容。
假設(shè)攻擊者可以在一個(gè)塊大小為4 KB的ext3文件系統(tǒng)中創(chuàng)建一個(gè)100 GB的文件(這是合理的假設(shè)),這種改進(jìn)使攻擊的成功概率為99.7%(通過使用公式2獲得)。 這是因?yàn)閕nteresting block的數(shù)量大大增加。
討論
5.1 其他文件系統(tǒng)
盡管第4節(jié)中描述的攻擊的很多部分可以被推廣,但仍然依賴于使用indirect block的文件系統(tǒng),如ext3,ext2和某些版本的Unix文件系統(tǒng)(UFS1)。ext4文件系統(tǒng)使用擴(kuò)展(還要NTFS),從本質(zhì)上將數(shù)據(jù)塊描述為一個(gè)元組(起始文件塊,起始磁盤塊,塊數(shù))。 盡管在ext4中可能有一個(gè)”extent block”(超過3個(gè)extents,ext4開始在inode之外的新的塊中存儲(chǔ)extents,從而啟動(dòng)樹結(jié)構(gòu)),但我們相信攻擊的成功的概率會(huì)很低,因?yàn)閑xtents的結(jié)構(gòu)更大(即,ext4解析器不會(huì)捕獲到隨機(jī)破壞的可能性很小):ext4通常使用48位的塊編號(hào)空間,而不是ext3的32位)。 因此,這種攻擊對(duì)其他文件系統(tǒng)是否仍然可行還有待觀察。
5.2 元數(shù)據(jù)checksums
另外,某些文件系統(tǒng)(如ZFS和ext4(但不包括ext3))可以選擇使用元數(shù)據(jù)校驗(yàn)和。 顯然,文件系統(tǒng)元數(shù)據(jù)校驗(yàn)和,無論它們是否使用加密哈希,都可以通過內(nèi)核文件系統(tǒng)驅(qū)動(dòng)程序檢測(cè)到文件系統(tǒng)元數(shù)據(jù)(例如,inode或范圍)已被損壞從而顯著降低攻擊的成功概率。
最后,我們?cè)趇ndirect block損壞后運(yùn)行e2fsck(一種檢查(和更正)ext3文件系統(tǒng)元數(shù)據(jù)的工具)。如預(yù)期的那樣,e2fsck成功檢測(cè)到文件系統(tǒng)元數(shù)據(jù)已損壞,這將使得管理員檢測(cè)到此攻擊。 當(dāng)然,e2fsck很少運(yùn)行,為了阻止攻擊,它需要在攻擊者獲得root權(quán)限并能夠糾正文件系統(tǒng)元數(shù)據(jù)之前運(yùn)行。
5.3 其他攻擊
任何直接或間接訪問SSD的程序(廣義上講)都可能成為在SSD上進(jìn)行的非物理的完整性攻擊的目標(biāo)。 在本文中,我們考慮了文件系統(tǒng),但其他攻擊媒介也可能存在。
不幸的是,由于攻擊者獲得的P3的限制以及攻擊的其他限制(R1至R4),我們無法找到另一個(gè)真實(shí)世界的很可能會(huì)被用于特權(quán)升級(jí)的程序。 然而,我們不能排除這種可能性的存在,需要在這方面進(jìn)行進(jìn)一步的研究。
最后,作為一個(gè)類似于rowhammer 和Gruss [8]等人的工作。值得考慮的是本文中提出的攻擊是否也可以通過瀏覽器和javascript被遠(yuǎn)程利用。 由于瀏覽器確實(shí)允許通過Web內(nèi)容的本地緩存、Cookie或使用HTML5存儲(chǔ)API來對(duì)文件系統(tǒng)(盡管是間接的)進(jìn)行寫入和讀取,因此將此處介紹的攻擊媒介擴(kuò)展到遠(yuǎn)程攻擊可能是可行的。
5.4 加密和完整性
磁盤加密(如dm-crypt)的使用應(yīng)該可以從根本上防止這里提出的攻擊。 更準(zhǔn)確地說,磁盤加密不會(huì)阻止攻擊在第4層到第5層進(jìn)行(因?yàn)楣粽哒诟采w將被操作系統(tǒng)透明加密/解密的元數(shù)據(jù))。但是,這將使得攻擊者不可能從第1層到第3層的缺陷來獲得P3。事實(shí)上,正如第3節(jié)所述,為了繞過ECC,擾碼器的組合和Flash頁面只能在在一個(gè)方向上編程的限制來獲取P3,攻擊者需要控制寫入磁盤的數(shù)據(jù)。 但是,通過使用磁盤加密,攻擊者很難在不知道加密密鑰的情況下這樣做。
如前所述,元數(shù)據(jù)完整性會(huì)阻止我們提供的文件系統(tǒng)攻擊。我們注意到,除ZFS外,目前的文件系統(tǒng)加密解決方案由于性能方面的考慮,通常不會(huì)實(shí)現(xiàn)(加密的)文件內(nèi)容的完整性。
總結(jié)
在本文中,我們提出并解決了需要處理的問題,以便利用現(xiàn)實(shí)世界場(chǎng)景中的閃存缺陷。 最重要的是,我們展示了基于閃存缺陷的利用場(chǎng)景,利用其破壞文件系統(tǒng)元數(shù)據(jù)的能力。結(jié)合這兩個(gè)方面形成了一個(gè)完整系統(tǒng)的攻擊方法,理論的成功率在實(shí)踐中是足夠合理的;
在未來的工作中,我們計(jì)劃解決克服ECC的步驟,以完成我們的全系統(tǒng)攻擊的實(shí)施。
-
閃存
+關(guān)注
關(guān)注
16文章
1782瀏覽量
114895 -
SSD
+關(guān)注
關(guān)注
21文章
2857瀏覽量
117372
原文標(biāo)題:怎樣攻擊固態(tài)硬盤并破壞系統(tǒng)
文章出處:【微信號(hào):SSDFans,微信公眾號(hào):SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論