鮑 娟,劉 娜,魏 剛
(1.湖北醫(yī)藥學(xué)院計算機教研室,十堰 442000;2.湖北醫(yī)藥學(xué)院附屬人民醫(yī)院,十堰 442000)
隨著互聯(lián)網(wǎng)應(yīng)用的普及和深入,計算機病毒、木馬程序、網(wǎng)絡(luò)蠕蟲等惡意程序,對計算機系統(tǒng)和網(wǎng)絡(luò)的安全威脅日益增加。與傳統(tǒng)病毒不同,蠕蟲病毒以計算機為載體,以網(wǎng)絡(luò)為攻擊對象。在掃描漏洞主機的過程中,蠕蟲病毒會產(chǎn)生巨大的網(wǎng)絡(luò)流量,導(dǎo)致整個網(wǎng)絡(luò)癱瘓,造成經(jīng)濟損失。
Linux 操作系統(tǒng)作為目前流行的開源操作系統(tǒng),為許多硬軟件產(chǎn)品的開發(fā)提供了良好的平臺。開發(fā)者可對內(nèi)核進行裁減和修改,定制最適合的操作系統(tǒng)平臺。文中結(jié)合嵌入式設(shè)備成本低、體積小的特點,提出了一種適合移植到嵌入式系統(tǒng)上的蠕蟲病毒檢測方法。
蠕蟲檢測可以分為誤用檢測和異常檢測[1]。目前較常用的蠕蟲檢測方法是誤用檢測,通過蠕蟲代碼特征來檢測蠕蟲的存在。該方法只能在蠕蟲爆發(fā)后,通過對相應(yīng)蠕蟲進行分析得到檢測特征,但是無法檢測未知蠕蟲,無法實現(xiàn)對蠕蟲的有效防范。
另一蠕蟲檢測方法是異常檢測,通過檢測主機的異常行為或者流量的異常模式來確定蠕蟲的存在。
文獻[2]提出通過判斷失敗連接數(shù)是否達到閾值來檢測遠程蠕蟲。通常該閾值的選擇是比較困難的:過低則提高誤報率,過高則提高漏報率。
目前,主流的開源檢測系統(tǒng)包括Snort 和Bro[3]。
Snort是輕量級的入侵檢測系統(tǒng),通過用戶態(tài)的Libpcap,從內(nèi)核中獲取數(shù)據(jù)包。但數(shù)據(jù)包流量較大時,大量的數(shù)據(jù)包就會被丟棄,從而導(dǎo)致Snort 系統(tǒng)的效率大大降低。
Bro 也是通過Libpcap 庫來獲取網(wǎng)絡(luò)數(shù)據(jù)包,Libpcap 包捕獲機制的原理是在數(shù)據(jù)鏈路層增加一個旁路處理,通過系統(tǒng)調(diào)用把數(shù)據(jù)包從內(nèi)核空間傳入到用戶空間再進行分析處理[4],這增加了內(nèi)存拷貝次數(shù),影響系統(tǒng)捕包的性能。因此如何減少內(nèi)存拷貝次數(shù)及系統(tǒng)調(diào)用、能快速的檢測是關(guān)鍵所在。
為了減少內(nèi)存拷貝及系統(tǒng)調(diào)用時間,降低用戶態(tài)存儲空間的需求。文中設(shè)計實現(xiàn)了一個基于Linux 內(nèi)核、Netfilter 框架的內(nèi)核流量采集和分析模塊,并且同時能夠進行內(nèi)網(wǎng)的蠕蟲檢測,通過動態(tài)加載功能模塊的方式,運行在Linux 內(nèi)核空間,所有的包截獲分析、蠕蟲檢測等任務(wù)都是在內(nèi)核空間完成,因此比起其他的運行在用戶空間的網(wǎng)絡(luò)監(jiān)控應(yīng)用程序,該模塊大大降低了從內(nèi)核空間到用戶空間的內(nèi)存拷貝操作,因此極大地提高了位于內(nèi)網(wǎng)的檢測系統(tǒng)的整體性能。
在混雜模式下,利用Netfilter 框架,當(dāng)數(shù)據(jù)包被傳遞到Hook 中時便開始進行采集。Hook 函數(shù)接收到的數(shù)據(jù)有:skbuff 結(jié)構(gòu)、網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)結(jié)構(gòu)指針。skbuff 中包括了鏈路層、網(wǎng)絡(luò)層及傳輸層包頭,通過分析這些包頭信息可以得到該數(shù)據(jù)包的源地址、目的地址和協(xié)議類型,Netfilter 通過Hook 函數(shù)的返回值決定該包的去向。文中選擇PRE_ROUTING和POST_ROUTING參考點注冊回調(diào)函數(shù),并設(shè)置其優(yōu)先級最高,并以NF_ACCEPT為返回值告訴Netfilter,即到目前為止該數(shù)據(jù)包一直被接收。
蠕蟲主機流量主要由FCC(第一次連接)流量組成。而這些連接請求大多數(shù)是不能成功的,或者沒有應(yīng)答,或者被拒絕(RST 包)。根據(jù)實驗分析,網(wǎng)絡(luò)蠕蟲連接請求失敗的概率在80%左右。根據(jù)蠕蟲檢測算法,設(shè)計了蠕蟲檢測模塊。該模塊的基本流程圖如圖1 所示。
當(dāng)某臺主機判斷為失敗連接時,先計算該主機發(fā)起的FCC 數(shù)是否到達給定閾值NCE,若達到了閾值,再判斷這臺主機的FCC 失敗連接比率是否達到給定閾值。若真,則該主機被判斷為蠕蟲;否則,考察該主機的FCC是否具有正常主機的重尾分布特性。若真,則該主機被認為是正常主機,反之,該主機被認為是蠕蟲。
圖1 蠕蟲檢測流程圖
將設(shè)計和實現(xiàn)的蠕蟲檢測系統(tǒng)移植到ARM 開發(fā)板上,在搭建的內(nèi)網(wǎng)環(huán)境中運行,用來進行本地局域網(wǎng)的蠕蟲檢測。嵌入式實現(xiàn)的原因如下:
(1)前面提到的系統(tǒng)是在PC 機上SUSE 10.3(Linux2.6 內(nèi)核)運行實現(xiàn)的,內(nèi)核比較龐大,但是通過內(nèi)核的裁剪和重編譯,可以在ARM 開發(fā)板上運行,以解決資源問題。
(2)移植到開發(fā)板上以后,開發(fā)板的網(wǎng)口可以直接連到交換機上,監(jiān)測局域網(wǎng)的流量異常情況,攜帶方便,占用空間更小。
本系統(tǒng)的開發(fā)板是EP9315(Cirrus Logic 公司出品)處理器,基于ARM920T 內(nèi)核,內(nèi)帶MMU,16KB的指令 cache,16KB的數(shù)據(jù) cache 和 Maverick Crunch。主頻200MHz,系統(tǒng)總線100MHz,可提供工業(yè)級;兩片F(xiàn)lash 共32MBNorFlash,64MB SDRAM。
嵌入式Linux 系統(tǒng)的構(gòu)建主要分為五個步驟[5]:①交叉編譯環(huán)境的建立;②引導(dǎo)程序Bootloader的開發(fā);③Linux 內(nèi)核的開發(fā);④根文件系統(tǒng)的定制;⑤文件燒寫。
下面主要介紹Linux 內(nèi)核編譯、制作根文件系統(tǒng)和文件燒寫。
4.2.1 嵌入式Linux 內(nèi)核編譯
內(nèi)核配置完后進行Linux 內(nèi)核編譯。
(1)執(zhí)行如下指令,刪除過時的文件#make clean
(2)執(zhí)行如下指令,生成可執(zhí)行內(nèi)核映像文件#make zImage
執(zhí)行完后,會在arch/arm/boot/下生成一個內(nèi)核映像文件vmlinux。
嵌入式內(nèi)核編譯的不同之處在于之后還要將vmlinux 轉(zhuǎn)換成可以下載到嵌入式系統(tǒng)板上運行的內(nèi)核映像vmlinux.gz.img。
4.2.2 根文件系統(tǒng)
對于一個實際的嵌入式應(yīng)用系統(tǒng)來說,僅包含Linux 內(nèi)核是不夠的,還必須有文件系統(tǒng)的支持。在嵌入式Linux 內(nèi)核啟動后,需要加載根文件系統(tǒng),以支持系統(tǒng)與用戶交互。下面描述如何制作根文件系統(tǒng)[6]。
對于嵌入式Linux 來說,最簡單最常用的根文件系統(tǒng)是RAMDISK。RAMDISK是指使用系統(tǒng)的一部分內(nèi)存空間來模擬一個用戶熟悉的磁盤分區(qū)。
(1)從開發(fā)系統(tǒng)提供商獲得一個RAMDISK,復(fù)制壓縮文件ramdisk.gz 到工作目錄/home/work。
解壓該文件,#gzip-d ramdisk.gz
(2)將文件RAMDIAK 掛載到一個臨時目錄,如ram_disk,執(zhí)行如下命令:
之后用戶可以查看文件ramdisk 包含的所有子文件系統(tǒng)內(nèi)容。
(3)根據(jù)需求對文件進行增減,操作完畢后卸載目錄ram_disk 與文件RAMDISK的連接。并對新的RAMDISK 文件進行壓縮。執(zhí)行如下命令:
此時,有了嵌入式Linux 內(nèi)核和根文件系統(tǒng),一個完整的嵌入式Linux 系統(tǒng)就編譯完成了。下面將生成的內(nèi)核映像文件vmlinux.gz.img 和ramdisk.gz.img 下載到系統(tǒng)的FLASH 中,就形成了一個完整的嵌入式系統(tǒng)。
4.2.3 文件燒寫
一般情況,目標(biāo)機上的Bootloader 通過串口與主機之間進行文件傳輸,但是,串口傳輸?shù)乃俣仁怯邢薜模虼送ㄟ^以太網(wǎng)連接并借助TFTP 協(xié)議來下載文件是個更好的選擇。
通過以下命令將u-boot.bin,vmlinux.gz.img,ramdisk.gz.img 燒寫到開發(fā)板上。
三個文件燒寫到目標(biāo)板上后,就可以運行用戶自己的程序(交叉編譯環(huán)境編譯),例如在嵌入式Linux 內(nèi)核態(tài),動態(tài)加載檢測局域網(wǎng)內(nèi)的蠕蟲主機模塊。
內(nèi)核模塊的動態(tài)裝載性使得內(nèi)核映像的尺寸保持在最小,并且具有最大的靈活性,而且不需重新編譯內(nèi)核及重新引導(dǎo)。
在Linux 2.4 版以后的內(nèi)核中,幾乎全部的中斷過程與用戶態(tài)進程的通信都是使用Netlink 套接字實現(xiàn)的。Netlink 套接字的最大特點是對中斷過程的支持,它在內(nèi)核空間接收用戶空間數(shù)據(jù)時,不再需要用戶啟動一個內(nèi)核線程,而是通過另一個軟中斷調(diào)用用戶事先指定的接收函數(shù)。使用軟中斷而不是內(nèi)核線程來接收數(shù)據(jù),這樣就可以保證數(shù)據(jù)接收的實時性。
下面將闡述Linux 內(nèi)核中Netlink 消息機制的實現(xiàn),并且通過Netlink 消息通信機制,實現(xiàn)用戶態(tài)與動態(tài)加載的內(nèi)核模塊之間的消息交互。
4.3.1 Netlink 通信機制
Netlink 用于在內(nèi)核空間和用戶空間之間傳遞信息,它提供了一種內(nèi)核與用戶的雙向異步通信機制。它包括為用戶進程設(shè)計的標(biāo)準(zhǔn)套接口和基于內(nèi)核模塊設(shè)計的內(nèi)核API。內(nèi)核與用戶空間之間傳遞的消息保存在Socket 緩存隊列中,發(fā)送消息只是把消息保存在接收者的Socket 接收隊列,而不需要等待接收者收到消息,是一種全雙工無阻塞通信方式。具體方法是在用戶態(tài)下使用標(biāo)準(zhǔn)的Socket API,在內(nèi)核空間使用特殊API 來實現(xiàn)。
那么內(nèi)核是如何識別用戶進程的呢?
以內(nèi)核模塊和用戶進程之間單播通信為例。
內(nèi)核模塊向用戶進程單播時,對目的用戶進程的識別是以進程pid 作為依據(jù)的。因此在各自創(chuàng)建了套接字后,用戶進程需要首先將自身的pid 發(fā)送給內(nèi)核模塊,內(nèi)核模塊(回調(diào)函數(shù))保存此pid,供以后向用戶進程發(fā)送數(shù)據(jù)時使用。
下面將從內(nèi)核態(tài)和用戶態(tài)兩方面具體描述如何相互實現(xiàn)消息傳遞。
4.3.2 內(nèi)核態(tài)工作
如圖2 所示,運行在內(nèi)核態(tài)的蠕蟲檢測模塊實時監(jiān)測內(nèi)網(wǎng)的流量情況,若發(fā)現(xiàn)蠕蟲病毒,將檢測到的蠕蟲機信息,傳遞到用戶態(tài),進行結(jié)果顯示。
圖2 內(nèi)核與用戶態(tài)的Netlink 通信
4.3.3 用戶態(tài)工作
用戶態(tài)使用標(biāo)準(zhǔn)的socket API:socket(),bind(),sendmsg(),recvmsg()和close()就能很容易地使用Netlink socket,與內(nèi)核進行通信。
用戶態(tài)主要實現(xiàn)兩方面的功能:①發(fā)送數(shù)據(jù)到內(nèi)核,即自身的進程pid 傳給內(nèi)核;②接收內(nèi)核發(fā)送的數(shù)據(jù)并在用戶態(tài)顯示接收結(jié)果。
(1)路由器上配置兩個網(wǎng)段,分別是192.168.1.0 內(nèi)網(wǎng)段和192.168.2.0 外網(wǎng),測試網(wǎng)段192.168.1.0 到192.168.2.0 網(wǎng)段進行Web 頁的訪問(見圖3)。
(2)內(nèi)網(wǎng)段(192.168.1.0)分布:查看測試結(jié)果的PC 機(IP:192.168.1.101)、ARM 開發(fā)板、蠕蟲主機(IP:192.168.1.102)和其它主機(IP:192.168.1.103)分別連接內(nèi)網(wǎng)的交換機。
位于內(nèi)網(wǎng)段的ARM 板,在192.168.1.0 網(wǎng)段內(nèi)的交換機上端口進行了端口鏡像。
(3)蠕蟲主機上運行avserve2.exe,使得該主機感染振蕩波蠕蟲。
(4)外網(wǎng)段(192.168.2.1)分布:兩臺Web 服務(wù)器連接交換機,IP是:192.168.2.102、192.168.2.103。
圖3 測試連接圖
利用tftp,下載*.ko 文件和與之對應(yīng)的用戶態(tài)程序到ARM 板上。
在開發(fā)板的shell 下,先執(zhí)行insmod *.ko 文件,啟動該檢測系統(tǒng);再運行用戶態(tài)程序,例如./user,創(chuàng)建Netlink 套接字與內(nèi)核模塊交互信息。加載模塊、運行用戶態(tài)程序如圖4 所示。
內(nèi)核態(tài)模塊檢測到內(nèi)網(wǎng)的蠕蟲機后,內(nèi)核態(tài)傳遞蠕蟲主機的源IP 地址到用戶態(tài),并使用打印函數(shù)輸出信息到控制臺,進行終端顯示。內(nèi)核檢測結(jié)果和用戶態(tài)接收到的結(jié)果如圖5 所示。
圖4 加載檢測模塊和用戶態(tài)程序
圖5 內(nèi)核和用戶態(tài)顯示結(jié)果
創(chuàng)新點:蠕蟲檢測系統(tǒng)移植到ARM 開發(fā)板上,在搭建的內(nèi)網(wǎng)環(huán)境中運行,進行蠕蟲檢測,并顯示了測試結(jié)果。實驗證明,系統(tǒng)進行相關(guān)的裁減和編譯后,燒寫到開發(fā)板上,捕捉內(nèi)網(wǎng)的數(shù)據(jù)包,實現(xiàn)蠕蟲流量檢測。最后在嵌入式開發(fā)板上實現(xiàn)了內(nèi)核態(tài)的蠕蟲檢測系統(tǒng)與用戶態(tài)的消息交互。
[1]蔣建春,馬恒太,任黨恩,等.網(wǎng)絡(luò)安全入侵檢測:研究綜述[J].軟件學(xué)報,2000,11(11):1460-1466.
[2]Seth Robertson,Eric V.Siegel,Matt Miller,Salvatore J.Stolfo.Surveillance detection in high bandwidth environments[C].Proc.of DARPA DISCEX III Conference,2003:130-139.
[3]Bro intrusion detection system[EB/OL].http://bro-ids.org/.
[4]楊建華,謝高崗,李忠誠.基于Linux 內(nèi)核的流量分析方法[J].計算機工程,2006,32(8):67-69.
[5]王亞軍,劉金剛.Linux 運用于嵌入式系統(tǒng)的技術(shù)分析[J].計算機應(yīng)用研究,2005,20(5):102-104.
[6]李駒光,鄭耿,江澤明.嵌入式Linux 系統(tǒng)開發(fā)詳解—基于EP93XX 系列ARM(第一版)[M].北京:清華大學(xué)出版社,2006.