摘要:提出了一種基于系統調用、面向進程的Linux系統入侵檢測方法:利用LKM(Loadable Kernel Modules)技術在Linux內核空間獲取檢測源數據——所考察進程的系統調用,使用基于極大似然系統調用短序列的Markov模型提取進程的正常行為特征,據此識別進程的異常行為。通過實驗表明了此方法的可行性和有效性;并分析了方法在實現中的關鍵問題。
關鍵詞:入侵檢測; 系統調用; 可加載內核模塊技術; 極大似然; 馬爾可夫模型
中圖分類號:TP311.1文獻標志碼:A
文章編號:1001-3695(2007)04-0147-04
0引言
入侵檢測是計算機信息系統安全保障的關鍵技術之一,是防火墻和訪問控制之后主動的安全防護措施。入侵檢測技術根據所監測的對象可分為基于主機和基于網絡兩類。基于主機的入侵檢測技術是入侵檢測技術的重要類型,在計算機系統的安全防護中具有重要作用。目前,基于主機的入侵檢測技術的缺陷主要表現如下:
(1)入侵檢測系統的數據源(包括操作系統和應用程序的審計機制等所提供的審計數據及各類日志信息等)數量較多且格式各異,分析起來相當困難。而且,數據源的獲取機制大都是在應用程序層面上實現的,因此,當用戶獲取一定的權限后,就可以繞過檢測機制,使其形同虛設。例如,UNIX和Linux系統的審計機制是利用獨立于操作系統的審計程序Syslogd記錄用戶登錄和其他相關操作信息的,對用戶正常或異常的操作所產生的警告或提示等信息以統一的格式記錄下來。這樣,取得了一定權限的入侵活動,就可以按照Syslogd工作的方式,竄改,甚至抹掉所有的審計信息和入侵記錄,也可以繞過Syslogd,使得審計記錄根本就不會產生。這使常規的審計技術對這些入侵活動根本不能察覺和記錄,或者記錄的信息不可信。
(2)內核層的入侵和攻擊正逐漸成為黑客(Cracker)入侵的主流技術[1,2]。而現行的入侵檢測系統的基礎數據大都是在應用層得到的。因此,從新的角度,采用新的方法和手段研究入侵檢測技術勢在必行。
鑒于上述問題,在操作系統內核層研究入侵檢測技術,精簡和特征化與系統安全相關的數據源,是入侵檢測技術的重要研究內容。本文提出了一種基于系統調用、面向重要守護進程的Linux系統入侵檢測技術。此技術可以有效對抗當前不斷出現的、對系統威脅最大的內核層入侵手段。
1檢測數據源獲取技術
系統的守護進程(如Sendmail,Httpd和Ftpd等)是用戶空間與內核空間交流的門戶。因此監測這些守護進程的行為過程和特點,可以發現程序的異常行為和入侵活動。這里首要的問題是確定記錄程序行為和活動過程的數據源。筆者注意到,系統調用是進程活動過程的直接反映[3,4]。因此,通過監控所關注的進程的系統調用,可以實現監測程序行為的目的。下面介紹系統調用的獲取技術。
LKM(Loadable Kernel Modules)是動態擴充Linux內核功能的一項技術,它使得人們可以在運行狀態下擴充Linux操作系統內核功能。編寫一個LKM程序,用編譯器將其編譯為目標文件,然后就可以根據需要動態加載,在不需要時卸載。在LKM程序編寫、編譯和加載過程中無須對內核進行重新編譯。LKM程序加載后作為內核的一部分運行在操作系統的內核空間,所以LKM進程能夠訪問操作系統的核心部分。這一特性使得可以方便地修改操作系統原有的行為,從而達到定制操作系統功能的目的。
隨著內核級入侵和攻擊手段的不斷出現,利用LKM技術從內核層加強操作系統安全已經引起人們的關注[1,2]。可以利用LKM程序來加強系統的安全性(如利用LKM檢測用戶和控制原始盤讀寫等);還可以通過LKM程序監視操作系統堆棧的使用狀況。當可能發生堆棧溢出時產生報警信息或者不讓申請堆棧的進程繼續執行,這樣就能有效防止緩沖區溢出攻擊。本文利用LKM技術獲取入侵檢測的數據源,包括系統調用名及相關參數等。
由于LKM技術隨著內核版本的提高,一些技術細節都發生了一定的變化。本文基于最新的Linux 2.6.6內核版本,討論LKM的實現技術。
2.6.6內核版本已經采用了新的系統調用技術,完全利用中斷向量表(sys_call_table)獲取系統調用的方法已經無法沿用。通過分析,在2.6.6版本中,系統調用主要通過Sysenter指令來實現,但并不是所有的系統調用均通過Sysenter實現。通過中斷向量表截獲系統調用的方式應該作為一個組成部分在本文的系統中沿用。除此以外,本文通過改變SYSENTER_EIP_MSR,即Sysenter指令的跳轉目的地址來實現獲取系統調用及其相關參數的目的,大致步驟如下:
(1)利用rdmsr(MSR_IA32_SYSENTER_EIP)讀入系統定義的Sysenter指令的目的地址。(2)構造自己的系統調用處理函數(假定為my_function),并定義unsigned long handler_code=(unsigned long)my_function。
(3)構造自己的Sysenter指令處理函數:void stub_trtr(void){_asm_ (\".globl /*handler_code指向自己的處理函數,old_sysenter是上一步讀入的目的地址*/
(4)將上面構造的Sysenter指令處理函數的地址利用wrmsr寫入MSR_IA32_SYSENTER_EIP,撤銷截獲時只需將預先保存的old_sysenter寫回到MSR_IA32_SYSENTER_EIP的低32位就可以了。
另外需要說明的是,在自己的系統調用處理函數中可以通過讀EAX來獲得具體的系統調用號。通過讀其他寄存器來獲得系統調用的相關參數;通過current_thread_info來獲取thread信息,繼而獲得當前進程的task_struct信息。
2檢測方法分析
如前所述,程序運行過程中產生的系統調用序列能夠反映程序在系統內核中的活動特征,是一種有效的入侵檢測數據源。已有研究[3~5]表明:同一程序在多次正常運行過程中所產生的系統調用序列長度可能不同,但一定長度的系統調用序列片斷(系統調用短序列)表現出相當的穩定性;一定長度系統調用短序列的個數不會隨著系統調用序列長度的增加而無限增加,它收斂于一個常值;不同程序運行產生的系統調用短序列表現出明顯的差異。基于以上特點,Forrest等人[3]據此提出了系統調用短序列匹配入侵檢測模型。這一模型在實際運行中可以達到非常好的檢測效果。但當被檢測進程活動較復雜時,其正常特征庫可能很大,正常特征匹配較為耗時,難以實現實時在線檢測。后來有研究者嘗試利用統計模型分析系統調用短序列,如馬氏鏈模型[6,7]、隱馬氏模型[8]、隱半馬氏模型[9]等。其核心思想是利用統計方法計算某系統調用短序列發生的概率;如果這一概率小于預設的閾值,就認為有異常發生。這種策略的優點在于可以大大降低正常特征庫的規模,在一定程度上優化了檢測模型的性能。在某些情況下,檢測效果比單純的短序列匹配模型有所改善;但在訓練和檢測階段均存在大量的統計計算,同樣難以滿足在線檢測的要求。
本文將統計思想與短序列匹配思想結合起來,提出一種面向極大似然系統調用短序列的入侵檢測馬氏鏈模型。本模型用馬氏轉移矩陣來描述系統調用之間的轉移規律。在訓練階段,用Viterbi算法計算以特定系統調用開頭的極大似然系統調用短序列,作為系統的正常特征庫;在檢測階段,將進程產生的系統調用短序列與正常特征庫中的極大似然系統調用短序列比對。如果兩者的差別超過一定的閾值,就認為有異常發生。
本文用馬氏鏈描述系統調用之間的轉移規律,馬氏鏈由四元組表示:其中:
表示狀態集合,對應經編號后的全體系統調用;
表示系統的初始狀態)表示初始狀態分布向量;
為系統在時刻t的狀態)表示狀態轉移概率矩陣,以下簡稱轉移矩陣;
N=|S|表示狀態個數。
本文模型由五個基本模塊組成,即系統調用序列采集模型、預處理模塊、Markov訓練模塊、Markov測試模塊和檢測結果輸出模塊。各模塊之間的關系如圖1所示。
(1)系統調用序列采集模型。它負責獲取進程的系統調用序列作為入侵檢測數據源。其采集方法詳見本文第1章。
(2)預處理模塊。它負責根據系統調用構造馬氏鏈模型的狀態集合S。Ye Nong等人[6]的研究指出:將每個系統調用作為馬氏鏈的一個狀態能夠取得較好的檢測效果;但這樣構造的馬氏鏈模型狀態數N較多。例如Linux 2.6.2內核共有284個系統調用,需要構造一個有284個狀態的馬氏鏈,計算成本過高。Schonlau等人[10]的研究指出罕用系統調用對提高入侵檢測的效果很有價值。基于這一思想,筆者通過如下步驟來構造馬氏鏈的狀態集合S:①掃描正常系統調用序列,統計每一個系統調用出現的次數,從而計算每一個系統調用s出現的頻率P(s);②將系統調用按頻率從大到小排序并編號;③計算使∑N-1i=1P(i)≥0.99成立的最小正整數N(其中P(i)為編號為i的系統調用出現的頻率),將編號為1~N-1的系統調用分別作為馬氏鏈的一個狀態,將剩余的其他系統調用(即罕用系統調用)合并為馬氏鏈的一個狀態。這樣就構造出一個狀態數為N的馬氏鏈。這種構造方法不區分不同的罕用系統調用,而將它們合并為馬氏鏈的一個狀態來考慮,從而減少了模型的狀態數,降低了計算復雜度,同時又考慮了罕用系統調用在入侵檢測中的作用。
(3)Markov訓練模塊。該模塊的任務是根據目標系統中不同進程的正常狀態序列建立系統的正常特征庫。正常特征庫中存放著以某一特定狀態開頭的極大似然狀態短序列,亦即極大似然系統調用短序列。訓練模塊主要完成以下工作:
①計算轉移矩陣。轉移矩陣的計算方法如下:其中,aij為由狀態i轉移到狀態j的概率;nij為狀態短序列i在整個狀態序列中出現的次數;ni為在存在后繼狀態的條件下,狀態i在整個狀態序列中出現的次數。
②求極大似然系統調用短序列,建立進程正常特征庫。用Viterbi算法求以某一特定狀態s(s∈S)開頭的長度為T的極大似然狀態短序列Os,即給定狀態s和長度T,求極大似然狀態序列Os=s1,s2,…,sT。由馬氏模型的性質,有其中,P(Os|λ)的計算涉及多個概率的乘積。當短序列長度T較大時,此乘積將很小,甚至可能低于計算機數據容許的下限。為了解決這一困難,本文定義經推導,以s開頭的長度為T的極大似然狀態短序列Os=s1,s2,…,sT應滿足的條件為本文定義從狀態i到狀態j的權值ωij為aij的負對數,即ωij=-ln(aij)。這樣,求極大似然狀態短序列的問題就轉換為求權值最小的狀態路徑的問題。而最小權值路徑問題可以用Viterbi算法解決。為此,首先引入符號:
δi(j)表示如果極大似然狀態路徑在時刻t通過狀態j,該路徑在時刻t以前(包括時刻t)的累計權值;
ψt(j)表示如果極大似然狀態路徑在時刻t通過狀態j,在時刻t-1應通過的狀態。
根據Viterbi譯碼的動態規劃思想,筆者提出了一種求以特定狀態s開始的長度為T的極大似然狀態短序列Os的算法。其偽代碼如下:
} //終止遞推得到極大似然狀態短序列的最后狀態sT
for (t=T-1; t>=2; t--) //回溯,標定最優狀態路徑
容易看出,計算極大似然系統調用短序列的Viterbi算法時間復雜度為O(N2T)階。
(4)馬氏鏈測試模塊。用Markov訓練模塊得到的正常特征庫中短序列的長度T為滑動窗口,依次從待測狀態序列中截取長度為T的短序列;然后與正常特征庫中具有相同首狀態的特征短序列相比較。若兩者不相同的狀態數大于一定的閾值V(V是介于1~T的整數,可稱之為短序列匹配閾值),則認為此次截取的短序列不正常;若兩者不相同的狀態數小于等于閾值V,則認為此次截取的短序列正常。本文定義正常短序列在進程運行產生的全體短序列中所占的比例為待測進程的支持概率。若支持概率低于一定的閾值,則認為待測進程不正常。
(5)檢測結果輸出模塊。該模塊用于輸出檢測結果,即當前進程是否正常。
3系統實現的關鍵問題
3.1系統結構
為了提高效率,降低成本,本系統采用C/S模型的體系結構,用一臺檢測服務器集中對幾臺Linux客戶機進行入侵檢測。對每臺Linux客戶機,在其系統內核上獲得進程運行過程中產生的系統調用序列,同時獲得系統調用的相關數據,包括用戶ID、用戶名、命令名、系統調用發生時間等;之后,將這些數據安全及時地傳給檢測服務器,檢測服務器負責分析提取正常進程的行為特征,檢測用戶行為和進程行為,進而識別異常進程或入侵操作。
3.2響應問題
當檢測出異常時,一個好的入侵檢測系統應該有有效的響應機制。本文系統中采用系統調用延遲技術來進行入侵響應。具體的方法是:當檢測服務器檢測到某進程的系統調用序列存在異常,即發生針對該進程的入侵攻擊,則將發生異常的進程號、進程名、發生時間、異常等級等信息傳回Linux系統;Linux系統負責將該進程的優先級降低,減少系統分配的時間片,以緩解入侵對該進程進行的攻擊,降低入侵對系統的影響,確保系統的正常運行,同時也給管理員充足的時間處理異常。
3.3效率問題
為了盡可能減少數據采集活動給系統帶來的開銷,系統調用采集模塊在內核中直接將檢測數據傳給檢測服務器,由檢測服務器負責存儲檢測數據。一臺檢測服務器可以負責局域網內數臺Linux客戶機的安全檢測工作。這樣,被檢測的Linux客戶機只需將采集到的檢測數據寫到網卡,既減輕了受保護的Linux 客戶機的系統負荷,使檢測的實時性得以體現,又利于局域網內部集中管理與監視。為了進一步提高系統性能,并不把進程用到的全部系統調用都記錄下來,而是有選擇地記錄與安全事件相關的系統調用子集。任何沒有出現在該子集中的系統調用都不被記錄,所以當這種調用被觸發時沒有附加的系統開銷。
4檢測效果分析
本系統中被監測的Linux客戶機上運行的FTP服務器為wuftp2.6.1,郵件服務器為Sendmail 2.0,Samba服務器為Samba2.0.7,SSH服務器為Openssh2.5.2。針對以上服務器程序,本文選擇了一些經典的網絡攻擊程序,以檢驗異常識別模塊的反應。測試中用到的攻擊程序簡介如下:
(1)Inetd DoS exploit:拒絕服務攻擊程序。該程序通過向服務器的特定端口反復發送大量的連接請求包,以淹沒該端口的守護進程。
(2)ADMwuftpd:wuftpd v2.6.1 offbyone remote exploit,針對wuftp的緩沖區溢出攻擊。
(3)WUFTPD 2.6.1 Remote Denial Of Service Exploit:針對wuftp2.6.1的拒絕服務攻擊。
(4)Apache openssl exploit、OpenSSL v0.9.6d and below remote exploit:針對Apache Httpd的緩沖區溢出攻擊。
(5)Sendmail DoS exploit:郵件服務器的拒絕服務攻擊程序。該程序通過向郵件服務器以無限循環的模式發送容量極大的垃圾郵件,能夠使郵件服務器癱瘓。
以上攻擊程序曾被麻省理工學院林肯實驗室(Lincoln Laboratory of MIT)用于構建異常識別系統實驗數據DARPA 2000 LLDOS 1.0。聯機實測結果表明,系統在審計過程中能夠對目前常用的攻擊程序產生的異常行為進行識別。Linux客戶機和檢測服務器運行穩定,負荷基本正常。
通過實驗比較了極大似然短序列模型與單純的短序列匹配模型的檢測效果。實驗中采用了筆者收集的40萬條正常系統調用序列和16萬條Linux客戶機受攻擊情況下產生的系統調用序列。以全部正常系統調用序列作為訓練數據來訓練檢測模型,以全部正常系統調用序列和異常系統調用序列作為測試數據,通過調整檢測閾值,得到了一系列檢測率與誤報率的對應關系。實驗結果以ROC圖[6]的形式表示,如圖2所示。其中曲線a表示短序列匹配模型對正常數據集的檢測效果;曲線b表示極大似然模型對正常數據集的檢測效果;曲線c表示短序列匹配模型對異常數據集的檢測效果;曲線d表示極大似然模型對異常數據集的檢測效果。
從圖2中可以看出,極大似然模型對正常數據的檢測效果與短序列匹配模型不相上下,最好的點檢測率可達93.7%,對應的誤報率為10.1%。對于異常數據,極大似然模型的檢測效果稍遜于短序列匹配模型。表1比較了極大似然模型和短序列匹配模型在正常數據集上的訓練時間、正常庫中的記錄條數和對全部56萬條系統調用數據的檢測時間。從表1中可以看出,極大似然模型的檢測速度遠遠高于短序列匹配模型,正常特征庫的規模也遠遠小于短序模型,從而適用于在線檢測。這是極大似然模型的突出優點。
5結束語
Linux系統面向進程的入侵檢測機制通過獲取和分析被檢測主機進程運行過程中的系統調用信息,可及時發現主機中的異常操作,并且作出響應。本文分析了Linux高版本內核系統調用序列的獲取方法,提出了一種刻畫系統調用短序列行為特征的極大似然Markov模型。對系統中一些關鍵守護進程的測試結果表明,極大似然模型可以達到較好的檢測效果,其運行速度和正常庫規模遠遠低于短序列匹配法。如何進一步提高極大似然模型的檢測效果,特別是對異常數據的檢測效果,是筆者以后進一步研究的方向。
本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。