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