姬一文,楊 釗,王玉成,楊詔鈞,康 昱
(麒麟軟件有限公司,湖南 長沙410000)
隨著計算機的普及,人們每天都通過計算機和互聯網獲取信息、進行各種活動,信息技術已經成為人們生活中不可分割的一部分。但計算機與網絡空間并不總是安全的,在給人們帶來便利的同時也會帶來巨大的安全威脅。 病毒、木馬等非法或惡意代碼是通過篡改或替換系統應用程序而達到對系統進行攻擊, 進而試圖進入系統以獲取其非法目的。傳統常規的安全防護手段已無法實時保障計算機的安全可靠,需要一種可靠、高效和實時的完整性度量校驗機制來解決存在的問題。
目前程序完整性度量廣泛應用于個人計算機、手機、門禁監控、智能電網、信息系統等多個領域,近年來許多專家學者對完整性度量機制展開了研究,取得了較顯著的成果。 DAVI L[1]提出了一種動態完整性度量與驗證架構,采用加載時度量結合動態跟蹤方式來實現完整性度量驗證。 宋生宇[2]提出了一種基于軟件行為分析的動態完整性度量模型,該模型引入進程監控器,通過監控進程的修改行為來判斷是否對其進行完整性度量。 張帆[3]等提出了可信度量的一種無干擾行為可信性分析方法,利用無干擾等式判定軟件的真實行為與系統調用安全域的預期行為是否存在偏差,實現對軟件的可信實時度量。 黃杜娟[4]等從單個的組件可信度量出發,根據不同組件的權重和不同的組合方式,建立了相應的系統可信度量模型。 于學軍[5]等在軟件開發階段植入可信埋點用于獲取行為動作路徑,并針對這種路徑提出了顯式和隱性判定指標,在度量上提出基于K-means 聚類的隱性指標判定模型。 尹超[6]等基于ARMTrustZone 設計出一種安全世界和非安全世界交互的主動可信度量機制。 周敦凱[7]提出一種基于DRTM 的完整性度量模型,引入了DIMM 架構和FPGA 動態重構技術搭建可信試驗平臺。陳志鋒[8]等提出了基于內存取證的內核完整性度量方法,提取靜態和動態度量對象,提出了一種隨機化算法弱化TOC-TOU 攻擊,通過采用哈希和加密運算相結合提高度量的安全性。 王效武[9]等提出了軟件源的可信管控模型,實現軟件的安全認定、度量基準值統一計算采集以及可信第三方的集中管控。 龍奔[10]等提出了一種基于度量認證的協同集成度量方法,在軟件部署雙方建立安全傳輸通道。 馬納[11]等通過可信密碼模塊檢測RTU 各軟件模塊的完整性,闡述了一種RTU 的可信度量認證技術。 迮愷[12]通過引入可信代理模塊,設計一種多級安全訪問控制策略,分別從實體完整性和機密性兩方面對系統中實體進行動態可信性度量。 張家偉[13]提出一種使用星型-鏈式相結合信任度量模型的主動免疫可信體系結構。 吳濤[14]等提出了一種基于鄰接點的動態完整性度量方法,以鄰接點作為度量模塊的宿主,通過面向內存頁的完整性模型和評估算法,實現動態完整性度量。 彭朝英[15]等提出了一種基于最小熵的完整性度量。
傳統的完整性度量校驗以某一時刻計算程序文件的哈希值作為基準值,另一時刻再對該文件進行度量,根據兩次度量的結果比對來進行程序文件的完整性校驗,若一致則該文件完整性未遭到破壞,否則表明該文件完整性遭到破壞。
度量和驗證是保障系統和應用程序完整性的主要技術。 度量就是采集所需檢測的應用軟件的狀態,驗證是將度量結果和預期度量值比對,如果一致表示驗證通過,否則表示驗證失敗。
目前度量方式存在以下不足:
(1)度量為逐級度量,根據系統引導從一個被信任單個組件度量擴展到整個系統,當某個中間組件完整性遭到破壞,并不能迅速找到存在問題的環節,需要再從頭開始逐級度量,這將導致較多不必要的度量時間浪費;且隨著系統中被度量的組件應用增多,組件新增或更換刪除這種時刻變化的狀態也將影響信任鏈的穩定性。
(2)現有應用程序完整性度量校驗是通過對程序的完整性計算對比校驗的方法。 在操作系統層有海量的應用需要執行和度量,現有的度量校驗算法效率會影響操作系統啟動和運行時間,給用戶帶來不好的使用體驗。
針對目前存在的不足,本文提出一種長短碼聯合度量校驗方法來實現對應用程序實時高效的控制。
常規的度量方式即通過計算系統中可執行文件的哈希值來進行文件的完整性度量,每次對可執行文件進行動態度量時都需要對該文件進行密碼學的哈希計算,需要耗費較大的時間成本。 本文在該基礎上增設了文件標記并與哈希計算結合實現完整性度量,度量之前采集應用程序文件的長短碼基準值;設置了監控模塊,當文件內容被修改時監控模塊能快速識別然后自動更改其短碼標記;在進行實時度量時先檢測短碼標記,短碼標記則為常規的字符串,完整性度量簡潔高效。 若短碼標記被修改,再檢測文件的哈希值與基準值對比來決策是否執行該文件,這種度量方式有效提高了應用程序完整性度量的效率。 以下給出該度量方式關鍵模塊的介紹。
長短碼聯合度量校驗之前首先需要采集度量對象的基準值,以該基準值為之后的校驗提供參照標準。 長短碼聯合度量校驗分為短碼檢測和哈希度量校驗兩個部分,所以在基準采集部分需要采集短碼標記和哈希值兩個基準。 應用程序文件的短碼標記是根據該文件的創建類型來決定其初始的類型,定義n類短碼標記A={A1,A2, …,An}(可信優先級遞增),優先級最低的短碼標記A1為唯一不可執行的標記,如未知文件或遭到破壞的文件;An為可信優先級最高的短碼標記,如始終可信的文件。 并且制定相應規則:
(1)當應用程序pa創建新的應用程序文件pb,pb的短碼標記會被自動設置為比pa短碼標記優先級低的標記;
(2)當應用程序文件pm內容遭到更改破壞,則其可執行操作的短碼標記會更改為優先級最低的不可執行操作的短碼標記。
系統中的應用程序組件處于新增或更換刪除這種時刻變化的狀態,按照以上策略設置應用程序的短碼標記可實現在動態復雜的狀態下自動精細地控制應用程序的權限,保證應用程序執行的安全可靠穩定。
基準的來源存在較多種,這里主要介紹具有代表性的采集方式:系統首次安裝后的程序文件長短碼采集。
在系統安裝后第一次引導時,系統將初始化采集白名單。 通過掃描采集系統中可執行文件的哈希值并設置可執行文件的短碼標記來完成采集,采集對象包含:系統二進制文件、動態鏈接庫、內核模塊和可執行腳本文件。 采集完成后存儲到白名單數據庫中,其中白名單數據庫包含采集對象的文件路徑、文件的哈希值以及短碼標記。 當以上采集對象的采集存儲操作完成后,在系統中設置初始化完成標記來表示初始化白名單采集存儲過程的結束。 系統初始采集流程見圖1。

圖1 系統初始化白名單采集流程
1.2.1 長短碼聯合度量校驗方法
系統啟動后,當應用程序執行時,會觸發長短碼聯合度量校驗模塊,實現對該應用程序實時的度量和校驗,長短碼聯合度量校驗模塊分為短碼標記檢測和哈希度量校驗兩個部分。
短碼標記檢測:請求執行的應用程序文件進行短碼標記的檢測。 短碼標記的檢測主要基于LSM(Linux Security Module)框架實現,LSM 是一個輕量級通用訪問控制框架,它的各種不同的安全訪問控制模型能夠以Linux 加載內核模塊的形式實現出來,用戶可以根據其需求選擇適合的安全模塊加載到Linux 內核中,提高了訪問控制機制的靈活性和易用性。 LSM 通過在內核源碼中放置鉤子函數,在應用程序執行前通過鉤子函數調用設置好的安全模塊函數來獲得訪問控制權,鉤子函數收到安全模塊返回的訪問信號便會決定該應用程序可否執行。
本文的長短碼聯合度量方法的執行控制安全模塊采用:檢查主體的短碼標記是否為可執行標記來進行控制訪問,如果執行控制的主體為非優先級最小的短碼標記A1,則允許執行控制的應用程序執行操作;否則安全模塊拒絕訪問,應用程序不允許執行。
長碼度量校驗:計算該文件的哈希值并與該應用程序文件的哈?;鶞手颠M行校驗,若校驗通過則表明該文件的完整性未遭到破壞,允許該文件執行。長碼度量校驗的前提條件:對應用程序文件進行短碼標記的檢測,若短碼標記為可執行標記則表明該文件的完整性未遭到破壞,則該應用程序可以直接執行操作; 否則表明該應用程序文件的內容被更改,需要再進行長碼度量校驗。
1.2.2 長短碼聯合度量的監控模塊
當文件被訪問,如執行、讀操作、寫操作等事件發生時,將會觸發內核完整性監控模塊。 文件完整性監控模塊對文件的讀操作、寫操作、重命名操作、移動操作等均有監控,當這些事件觸發時,該監控模塊將檢查文件內容的完整性,如果文件內容有變更,即完整性被破壞了,將觸發應用程序短碼標記變更,并同步白名單數據庫的對應項,顯示為已被篡改,可達到通過短碼標記實時顯示標記文件完整性的功能;如果文件內容未變更將返回。
監控模塊也是基于LSM 框架實現的,LSM 會在內核源碼中放置鉤子函數。 當應用程序文件被訪問控制,如寫操作、重命名操作、移動操作等觸發到監控模塊,監控模塊會通過鉤子函數調用相應的安全模塊來對被操作的應用程序文件標記更改。 根據1.1 節的規則(2),當執行控制客體文件被執行寫操作時,會觸發鉤子函數調用相應的安全模塊,來更改該文件的短碼標記為最小優先級A1,表明該文件的內容遭到更改,完整性遭到破壞,并將標記同步到白名單數據庫相應的項。 如果非寫操作則文件內容未遭到破壞,則直接省去了哈希值度量的時間上的浪費,極大提高了度量校驗效率。 監控模塊可以細分為以下幾種監控:
(1)普通文件的監控
普通文件的監控是利用LSM 框架中的鉤子函數file_permission 和inode_permission 實現的,這兩個函數負責訪問權限的過濾和普通文件的執行請求控制。 若應用程序被執行的是寫操作,則修改實時的短碼標記為A1,表明該文件的完整性被破壞,下次該應用請求執行時便不會允許該程序執行。
(2)內核模塊的監控
內核模塊的監控只有擁有系統自帶或第三方應用標記的內核模塊才允許被加載,模塊被修改后標記將丟失。 在LSM 模塊的函數中通過檢查模塊文件的執行控制標記來實現對模塊加載的控制。
(3)共享庫的監控
二進制程序通過mmap 調用來對需要的共享庫進行加載和映射,在LSM 模塊的file_mmap 鉤子函數中,先過濾映射類型和請求權限,然后只對請求執行權限的非匿名非共享映射的文件進行標記檢查即可。
定義1(度量基準):度量基準是在度量校驗前采集的參考標準,如系統初始化中采集的應用程序哈希值和短碼標記構成的集合;度量基準中哈希集合記為TP={t1,t2,…,tn},每個元素ti(1≤i≤n)表示應用程序的基準哈希值;度量基準中短碼標記集合記為LP={l1,l2,…,ln},每個元素li(1≤i≤n)表示應用程序的基準短碼標記。 設定TPS={ts1,ts2,…,tsn}表示應用程序實時的哈希值tsi(1 ≤i≤n)的集合,LPS={ls1,ls2,…,lsn}表示應用程序擴展屬性中的實時短碼標記lsi(1≤i≤n)的集合,初始階段LPS=LP,TPS=TP,即t1=ts1,t2=ts2,…,tn=tsn;l1=ls1,l2=ls2,…,ln=lsn。
定義2(監控操作):監控函數fmonitor用于監控應用程序pi∈P(P為當前運行應用程序的集合)的文件內容是否被更改,若是被執行寫操作則文件內容被更改,將應用程序的實時短碼標記lsi設置為A1;否則不做任何操作。
定義3(檢測函數):檢測函數fdetect用于檢測應用程序pi的文件短碼標記是否為可執行標記。 如果lsi=A1,則fdetect(pi)=false;否則fdetect(pi)=true。
定義4(校驗函數):校驗函數fcheck用于校驗應用程序此時的哈希值是否與度量基準中的哈希值相同,如果t1=ts1,則fcheck(pi)=true,否則fcheck(pi)=false。
定義5(決策函數):決策函數fdecision用于判斷應用程序pi是否允許執行,按照下文2.2 節的決策規則來判斷該文件的完整性和決定fdecision(pi)的取值,fdecision(pi)=true 即運行執行,fdecision(pi)=false 即不允許執行。
定義6(更新函數):更新函數fupdate用于更新應用程序pi的實時短碼標記和哈?;鶞手?,當fdetect(pi)=false 并且fcheck(pi)=true,則會將li賦值給lsi,將tsi賦值給ti。
基于長短碼聯合度量校驗的控制決策規則如下:

首先利用fdetect檢測應用程序pi文件的短碼標記是否為可執行標記;若fdetect返回true,則表明文件內容未被修改, 程序文件的完整性未被破壞,fdecision(pi)返回true,pi允許繼續執行;否則需要再用fcheck來校驗pi的哈希值,若fcheck返回true,則fdecision(pi)返回true,允許pi繼續執行并通過fupdate來執行更新操作;否則fdecision(pi)返回false,pi被拒絕繼續執行。
基于長短碼聯合度量校驗的總體控制流程如圖2 所示。
長短碼聯合度量校驗總體步驟如下:
(1)系統啟動,判斷是否首次啟動,如果不是則直接轉步驟(2);否則按1.1 節的方式進行初始化白名單采集,如果有需要驗簽的軟件包通過驗證也將進行白名單采集, 得到哈?;鶞始蟃P={t1,t2,…,tn}、哈希的實時度量集合TPS={ts1,ts2,…,tsn}、短碼標記基準值集合LP={l1,l2,…,ln}和程序實時的短碼標記集合LPS={ls1,ls2,…,lsn}。
(2)將核外白名單哈希表的數據拷貝至內存。
(3)應用程序pi請求執行,利用fdetect檢測pi的實時短碼標記lsi是否等于不可執行標記A1,如果該函數返回true 則轉步驟(5),否則轉步驟(4)。
(4)計算應用程序pi的實時哈希值lsi,如果此時的哈希值lsi與哈希基準集合TP 中pi的哈?;鶞手迪嗤磍i=lsi,則執行fupdate將短碼標記基準中pi的短碼標記li更新程序實時短碼標記lsi,實時哈希值tsi更新哈?;鶞手祎i,轉步驟(5);否則表明程序不合法或完整性遭破壞,pi不被允許執行,流程結束。
(5)應用程序文件的完整性未破壞,應用程序允許執行,流程結束。

圖2 長短碼聯合度量校驗總體流程圖
將本文提出的長短碼度量和常規Hash 度量、僅標記度量進行對比, 這三類度量方法都運行在FT-1500A(64 位,4 核)CPU、8 GB 內 存 和Linux-4.4.4.131 內核的PC 上。 利用測試工具UnixBench 對這三類度量方法進行系統調用和系統整體性能方面的測試比較,結果對比見表1。 表1 分別列出在4 核CPU 單進程和多進程實驗下的對比結果,其中系統調用為考察每秒鐘可以執行的Execl 系統調用的次數。

表1 常規Hash 值度量和長短碼度量以及原始系統的結果對比
本文提出的基于長短碼聯合度量校驗方法是先度量請求執行程序的短碼標記,即較快速的字符串比較,僅當該應用程序實時短碼標記為A1時才進入耗時的Hash 度量,相比常規的度量(僅Hash 度量)具有較大的性能優勢;與僅標記度量相比能有效避免較多錯誤的決策判斷,如僅改變標記為可執行的應用程序文件的路徑會導致標記變為A1,僅標記度量則判斷該應用程序為不可執行,但是文件的完整性未遭到破壞,而長短碼度量通過再次Hash度量和更新應用程序的實時標記能有效避免類似情況的發生。 實驗結果表明在Execl 系統調用和系統整體性能上本文所提方法明顯優于僅Hash 度量,并與僅標記度量基本持平。 實驗結果驗證了該方法的有效性。
本文綜合分析了Linux 操作系統文件系統的機制特點,設計文件監控模塊,實現對文件完整性實時標記,當文件被改動時,可主動標記區分識別被篡改文件。 結合文件完整性度量校驗方法,優化度量和校驗流程,結合文件完整性監控模塊和文件度量校驗模塊, 聯合實現對文件長短碼聯合度量校驗,大大提高度量校驗的準確性和高效性。