文/趙連瑩
非法數據篡改是多年以來困擾用戶的問題,從單純的惡意刪除和破壞到近年引起公眾關注的勒索軟件(Ransomware)。不同于操作系統(tǒng)和應用軟件,用戶數據常常具有非金錢可衡量的價值或不可重現(xiàn)性。現(xiàn)有的相關應對技術(主要針對勒索軟件)大多基于已知惡意程序的特性,如二進制特征或行為規(guī)律,無法第一時間應對非已知惡意程序。更重要的是,這些技術幾乎都需要操作系統(tǒng)是可靠的,而可以破壞操作系統(tǒng)的惡意程序(如Rootkit)沒有被考慮進去。
我們提出將防御重點從檢測或消除此類惡意程序轉移到直接數據保護上,從而做到和惡意程序種類或版本無關。可信計算環(huán)境(TEE)是多數當代處理器都具有的安全特性,我們同時結合某些存儲設備也具有的類似安全特性,設計并實現(xiàn)了一種可編程的數據寫保護工具,Inuksuk。基本原理是:將用戶指定的受保護文件通過存儲設備TEE 置于常態(tài)寫保護模式,而用戶程序日常的寫入操作產生的數據則通過處理器TEE 環(huán)境以新版本的形式寫入存儲設備。
高權限惡意程序的特點是可以侵染計算機上的任何軟件。因此這里需要的寫保護不能依賴包括操作系統(tǒng)在內的軟件來實現(xiàn)。SED(Self-Encrypting Drive)可以看做普通的硬盤(機械或SSD)和一個特殊硬件加解密引擎的整合產品。它可以內部設置一個密鑰,所有進入硬盤的數據都被實時加密,同時離開到主機的數據被解密;此密鑰不會暴露到這個加密引擎之外。它還可以對指定區(qū)域的數據實施密碼保護的訪問控制,比如沒有密碼的情況下只能讀或者無法訪問。Inuksuk 主要依靠這種訪問控制來實現(xiàn)只讀(寫保護)。
那么此密碼的存儲便成為關鍵:如果由軟件保護,高權限惡意程序便可借由篡改軟件獲取密碼來實現(xiàn)訪問被保護的文件(如對他們加密并索要贖金)。TEE 通常可以將指定數據(如此處的密碼)以密碼學的方式“封存”,即:只有預設的程序被加載時才能解密數據,即使預設程序只有一個比特被篡改,密碼也無法被取出。此預設程序即Inuksuk。至此,由SED 實施硬件級別的寫保護,由主機TEE 負責保護SED的密碼。用戶無需記住任何密碼。整個Inuksuk 構架如圖1 所示。

圖1 Inuksuk 架構
由于主機TEE 需要和SED 進行可信的I/O 操作,故我們選用具有系統(tǒng)權限的Intel TXT 或AMD SVM。密碼被封存在TPM 芯片中。
我們的保護目標是從Inuksuk 安裝起已經存在的被保護數據的完整性(由寫保護實現(xiàn))以及對后續(xù)修改以多版本形式保存(由TEE 內預定邏輯實現(xiàn))。這樣,一旦用戶發(fā)現(xiàn)被勒索軟件感染,在SED 上有之前的文件歷史可以直接將SED 盤裝載到其他電腦讀出。如果高權限惡意程序嘗試直接在TEE 外修改被保護文件,操作將被SED 硬件忽略(沒有密碼)。為了保證用戶程序的操作不受影響,Inuksuk 的實現(xiàn)將原始被保護文件留在原處(供讀寫)而在SED 上生成一個備份。Inuksuk 的Updater 按照用戶配置在特定時間比較原始文件相對于SED上文件的修改,在TEE 內將修改以新版本形式寫入SED。
隨著時間的推移SED 的空間會減少,我們利用配置好的自動版本刪除來釋放空間,如只保留一年以內的版本。如果用戶需要刪除文件(而不是版本),我們在TEE 內開發(fā)了一個簡易的Browser,供用戶批量選擇并刪除任意文件,如圖2 所示。

圖2 簡易Browser
值得一提的是,TXT/SVM (TEE)的運行會覆蓋當前操作系統(tǒng)的狀態(tài),我們使用Flicker 在操作系統(tǒng)和TEE 之間切換。Flicker 只支持32-bit 的Windows 7,我們將Flicker 移植到目前常用的Windows 10 64-bit,使得它在其他場景下的應用(多為64-bit 系統(tǒng))成為可能。