張國超 周 暢
(上海船舶電子設備研究所 上海 201108)
VxWorks 操作系統是美國風河(WindRiver)公司于1983年設計開發的一種嵌入式實時操作系統。它以其良好的可靠性和卓越的實時性被廣泛地應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中[1~2]。
隨著計算機技術的飛速發展和互聯網時代的到來,很多不法分子利用操作系統安全漏洞編寫計算機病毒、木馬等植入程序竊取、篡改設備中重要信息[3],對用戶造成不可估量的損失。近年來針對VxWorks 操作系統的漏洞展開的網絡攻擊頻現,VxWorks 操作系統是目前全球成熟度最高和應用最為廣泛的嵌入式實時操作系統之一,并且很多諸如醫療基礎設施、航空航天、船舶等關鍵基礎設施及軍事相關行業都對VxWorks 操作系統有著廣泛的應用,因此針對VxWorks操作系統的網絡安全研究迫在眉睫,而網絡攻擊的識別是網絡安全中重要的一個環節,數據包監聽技術是網絡攻擊檢測的較為有效手段之一。數據包監聽技術通過捕獲特定過濾條件的網絡數據包進行綜合分析實現對數據來源、流量、數據內容、時戳等重要信息全面監控的功能,是系統級網絡調試的重要技術手段之一,也是識別惡意網絡攻擊等網絡安全威脅的關鍵技術方法[4]。在Unix/Linux 類操作系統中,數據包監聽技術主要是基于開源軟件libpcap[5~6],在Windows類操作系統中,常用的網絡數據包監聽技術是基于WinPcap函數庫進行二次開發的,著名的Wireshark軟件就是基于該技術的具體實現[7],但目前libpcap和WinPcap 函數庫并不支持VxWorks 操作系統,為解決這一緊迫需求,本文提出了幾種基于MUX 接口、伯克利封包過濾器(BPF)和原始套接字三種技術方式實現VxWorks 操作系統網絡數據監聽和捕獲技術,并在本文最后給出了三種方式的實驗結果及結果分析情況。
VxWorks 中的網絡協議棧叫作SENS(Scalable Enhanced Network Stack),即可裁減增強網絡協議棧。SENS 是基于4.4 BSD TCP/IP 協議棧發展而來的,包含了許多4.4 BSD TCP/IP 協議棧沒的協議;而且SENS在實現一些協議功能時增加了許多新特性,如在IP 協議實現時增加了多播功能。SENS 的基本特征和傳統的TCP/IP 網絡協議棧相似,但SENS最大的特點是在數據鏈路層和網絡協議層之間多了MUX層。在SENS中,網絡接口的驅動程序是叫作END(Enhanced NetworkDriver),即增強型網絡驅動程序,它處于數據鏈路層。IP層和TCP/UDP層合稱為網絡協議層。在數據鏈路層和網絡協議層之間有應用程序接口(API),這個接口在SENS中叫作MUX(Multiplexer)接口[8]。MUX 接口的作用是分解協議和網絡驅動程序,從而增強獨立性,這種獨立性使得增加新的驅動程序和協議變得很簡單,可以利用這一機制,創建用戶自主協議棧,通過修改stackRcvRtn 函數,將網絡數據直接返回給用戶,實現數據包偵聽的功能[9]。
可以利用mux 層進行網絡數據的監聽和嗅探。首先可以利用VxWorks特有的mux 層,注冊一個自定義網絡驅動,直接截獲網絡數據,并根據過濾條件返回給用戶進程,達到報文捕獲的目的。其次,VxWorks 的TCP/IP 協議棧支持BPF 過濾器,可以利用BPF 技術進行報文捕獲。最后,VxWorks 的協議棧與BSD協議棧兼容,可以利用原始套接字進行報文捕獲。
Mux 層允許用戶自主開發協議棧,一個mux 網絡協議至少包括以下四個接口:協議棧卸載回調函數接口stackShutDownRtn,數據接收錯誤處理函數接口stackErrorRtn,數據接收回調函數接口stack-RcvRtn,重啟被協議棧函數接口stackTxRestartRtn。以上四個接口函數中,對于數據監聽最重要的函數是stackRcvRtn,網卡接收到的以太網數據時自動調用該函數,返回到系統內核,當該函數的返回值設置為FALSE 時,網絡協議棧接收到的數據直接返回給用戶,實現數據包的捕獲和偵聽的功能,用戶可以根據接收的數據頭部進行定制的數據報文的過濾和抓取。在設計好stackRcvRtn 等用戶自定義四個函數后,通過muxBind 系統接口進行協議的注冊,即可完成。可以利用這一機制,修改stackRcvRtn 函數,將網絡數據直接返回給用戶。具體流程如圖1所示。

圖1 Mux層數據包截取流程圖
muxBind 的第一個和第二個參數分別傳遞網卡的名稱和序號,例如pci0,接下來的四個函數指針分別指向回調函數,默認處理可傳遞NULL 指針。在捕獲數據幀應用時,只需要定義接收回調函數stackRcvRtn,該函數將從內存池中返回M_BLK結構體指針,通過解析MBLK 的mBlkHdr 數據段mData,完成數據包的過濾和捕獲。以太網數據類型報文是我們最為關心的報文類型,IP數據包報文頭部的組織格式如圖2所示。

圖2 數據鏈路層和IP層數據報頭部示意圖
伯克利封包過濾器(Berkeley Packet Filter,BPF)是類Unix 系統上數據鏈路層的一種原始接口,提供原始鏈路層數據包的收發,可以用于監聽鏈路層數據[10],如tcpdump 程序就是基于該技術進行開發的。應用進程通過系統調用open 創建并打開一個BPF設備,并利用若干ioctl命令配置BPF設備,把它關聯到某個網絡接口,并安裝過濾程序從而能夠選擇性地接收輸入的分組。BPF 設備經過適當配置,能夠根據過濾程序的定義丟棄或接收輸入的分組,過濾程序的定義類似于偽計算機指令。可以將網卡設置為混雜模式,這一可以收到網絡上所有經過交換機的數據包,不管它們的目的地址是不是所在主機,從而實現數據包偵聽的功能。除此之外,BPF 支持“包過濾”功能,可以將滿足過濾條件的數據包拷貝到應用層,避免從操作系統內核向用戶態復制不需要的數據包,降低抓包過程中CPU的負擔及所需的緩沖區空間,從而降低丟包率。
BPF 的過濾功能是以BPF 虛擬機機器語言的解釋器的形式實現的,這種語言的程序可以抓取封包數據,對封包中的數據采取算數操作,并將結果與常量或封包中的數據或結果中的測試位比較,根據比較結果決定是否拒絕封包。
BPF 實現數據包截取的流程如圖3所示。BPF過濾器寫法類似于匯編代碼,BPF 常用指令對照表如表1所示。BPF 過濾器的可能寫法是:使用BPF_LD 將k 值存入寄存器A 中,使用BPF_JMP 將A中的值與k進行比較,實現指令的跳轉,可以跳轉到下一步的過濾指令,或者跳轉到BPF_RET 進行截取包長度的限制,如果,截取包的長度為0,則代表未匹配。

表1 BPF過濾器指令對照表

圖3 數據鏈路層和IP層數據報頭部示意圖
vxWorks 網絡編程支持BSD4.4 TCP/IP 兼容的編程接口,在TCP/IP 網絡應用中,同通信的兩個任務間主要模式是客戶端/服務器模式(C/S),即客戶首先向服務器提出服務請求,服務器收到請求后,提供相應的服務。原始套接字(Raw socket),工作在數據鏈路層,而其他類型的套接字工作在傳輸層,只能進行傳輸層的數據收發,只接收目標地址是本機的數據包,而原始套接字可以通過設置網卡混雜模式,接收所有經過網卡的數據包,我們可以使用原始套接字這一特點進行數據監聽[11~12]。當網卡除以混雜模式下能夠接收包括廣播在內的所有經過網卡的數據包。使用原始套接字進行數據監聽的流程如下:
1)通過設置套接字類型為SOCK_RAW 創建原始套接字
2)通過ioctl指定網卡為混雜模式
3)通過recv()函數進行數據包的接收
4)針對接收到的數據包進行包頭判斷,拷貝滿足條件的報文到緩沖區。
為了對比本文提出的三種報文捕獲方法,首先需要搭建軟件運行的目標環境,利用Vmware 虛擬機軟件創建VxWorks 操作系統虛擬機作為目標環境,然后分別設計良好網絡環境、中等網絡環境和擁堵網絡環境三種試驗條件下,測試本文提出方法的報文捕獲功能及性能。試驗環境搭建步驟如下:
1)利用Workbench3.2 創建并生成VxWorks6.8的引導文件和鏡像文件(需要配置網卡為lnPci);
2)在VMware虛擬機安裝dos6.22引導系統;
3)利用dos 引導并啟動步驟1)中編譯好的Vx-Works 鏡像,使用上述方法創建vxWorks6.8 虛擬機環境,并利用文中的三種方法進行IP 層數據包捕獲。為驗證三種方法的網絡數據抓包性能,使用VC6.0 編寫UDP 發送客戶端軟件,并分為以下三種網絡環境下進行試驗,幾組試驗場景:
(1)良好網絡環境:利用UDP 發送客戶端軟件以每包間隔1ms 的頻率發送10000 包長度為1400字節的測試數據,并利用共享內存方式統計接收到的數據包量;
(2)中等網絡環境:利用UDP 發送客戶端軟件不間斷的連續發送10000 包長度為1400 字節的測試數據,并利用共享內存方式統計接收到的數據包量;
(3)擁堵網絡環境:同時運行5 個UDP 發送客戶端軟件,分別不間斷的連續發送10000 包長度為1400 字節的測試數據,并利用共享內存方式統計接收到的數據包量。
利用蒙特卡洛算法針對上述三種網絡環境下分別對文中的三種方法進行50 次試驗統計,統計三種方法的實際報文接受速率的均值,統計結果如表2所示。

表2 BPF過濾器指令對照表
實驗結果表明三種方法在網絡流量不大的情況下都有較低的丟包率,當網絡出現擁塞時,MUX方法的丟包率最低,原始套接字方法丟包率最高;三種方法在網絡數據較多情況下,針對特定報文的抓包速率bpf 速度最快,原始套接字方法最慢。由于NET_ETH_P_ALL 選項目前只有在VxWorks6.x及以上版本才支持,目前不支持VxWorks5.x 版本,因此原始套接字方法只有在VxWorks6.x 及以上版本才有效,低版本的無法適配。
數據包監聽技術是網絡數據監控、網絡功能調試以及網絡數據記錄等應用的重要基礎,一個重要的應用場景是報文的網絡數據記錄及回放功能,在一個復雜的網絡通信系統中,經常需要將經過網卡的數據包進行記錄存儲,便于后續的數據回放及復盤分析。可利用本文提出的方法進行基于Vx-Works 操作系統的IP 層數據記錄及過濾工作。本文提出的三種方法能夠實現VxWorks 操作系統下的IP 層數據包偵聽的基本功能,可以捕獲經過網卡的全部數據包,同時支持捕獲特定條件的數據包,例如指定源IP 地址、端口號、報文長度或者某些特定字段數值滿足要求的數據報文,具有較好的實用性。本文提出了基于VxWorks 操作系統的IP層數據包的三種方法的原理及關鍵技術細節,并在文中給出了試驗環境搭建的詳細步驟,提出了在不同網絡情況下測試報文捕獲功能性能的試驗方法,并給出了文中三種數據包捕獲的性能對比結果及結果分析,在工程應用中可以根據需要靈活選擇適合的方法進行報文捕獲。