馮愛娟 王蔚然 (電子科技大學電子工程學院, 成都 610054)
摘要:主機防火墻在分布式防火墻體系結(jié)構(gòu)中承擔了重要的角色,其把安全策略延伸到網(wǎng)絡的各個主機。本文介紹了幾種利用驅(qū)動程序來實現(xiàn)基于Windows2000的嵌入式主機防火墻的方法,比較了其中的優(yōu)劣,并對其中的NDIS HOOK實現(xiàn)防火墻技術給出了一個具體例子。
關鍵詞:分布式防火墻; 主機防火墻; NDIS; NDIS HOOK
隨著網(wǎng)絡的廣泛使用 ,網(wǎng)絡安全問題成為人們關注的焦點 。以往采用的安全保護中使用得最多的是傳統(tǒng)的防火墻機制 ,但是由于它對網(wǎng)絡拓撲結(jié)構(gòu)的依賴,隨著不斷擴大的網(wǎng)絡互連,傳統(tǒng)防火墻的缺陷也日益突出,由此分布式防火墻應運而生。分布式防火墻在保留傳統(tǒng)防火墻優(yōu)勢的同時,減小甚至去除了它對網(wǎng)絡拓撲結(jié)構(gòu)的依賴性。分布式防火墻可以認為是由3部分組成的立體防護系統(tǒng):一部分是網(wǎng)絡防火墻,它承擔著傳統(tǒng)邊界防火墻看守大門的職責;一部分是主機防火墻,它解決了邊界防火墻不能解決的問題(例如來自內(nèi)部的攻擊和結(jié)構(gòu)限制等);還有一部分是集中管理,它解決了由分布技術而帶來的管理問題。分布式防火墻最重要的優(yōu)勢在于它能夠保護物理拓撲上不屬于內(nèi)部網(wǎng)絡、但位于邏輯上的"內(nèi)部"網(wǎng)絡的那些主機。
分布式防火墻技術增加了針對主機的入侵檢測和防護功能,加強了對來自內(nèi)部攻擊防范,對用戶網(wǎng)絡環(huán)境可以實施全方位的安全策略,并提供了多層次立體的防范體系。在分布式防火墻的組成里,主機防火墻是最有特色的部分。主機防火墻駐留在被保護的主機上,用戶可以針對該主機上的具體應用和對外提供的服務設定個性化的安全策略。主機防火墻對分布式防火墻體系結(jié)構(gòu)的突出貢獻是,使安全策略不僅僅停留在網(wǎng)絡與網(wǎng)絡之間,還把安全策略推廣延伸到每個網(wǎng)絡的各個主機上。
1 主機防火墻技術
主機防火墻運行于宿主機操作系統(tǒng)內(nèi)核,通過替換或掛接操作系統(tǒng)網(wǎng)絡協(xié)議堆棧完成數(shù)據(jù)包過濾,因此與主機操作系統(tǒng)及網(wǎng)絡協(xié)議有莫大的關系。其主要手段是分析主機操作系統(tǒng)網(wǎng)絡協(xié)議,在適當?shù)奈恢貌迦霐r截點,所有的網(wǎng)絡數(shù)據(jù)包通訊都要經(jīng)過這些攔截點,再根據(jù)安全策略制定的規(guī)則對經(jīng)過攔截點的網(wǎng)絡信息進行監(jiān)控和審查,過濾掉不符合安全規(guī)則的信息,以保護主機不受外界的非法訪問和攻擊。目前在絕大多數(shù)內(nèi)部網(wǎng)的主機運行的是Windows操作系統(tǒng),也是主機防火墻最重要的系統(tǒng)運行平臺。下面主要闡述在Windows2000中主機防火墻的關鍵技術及其實現(xiàn)。
1.1 Windows操作系統(tǒng)的總體構(gòu)架
Windows操作系統(tǒng)的總體構(gòu)架分為兩個層次,上面的為應用層(用戶態(tài)),下面的為核心層(核心態(tài))。其結(jié)構(gòu)如圖1所示。

應用程序位于上層,處于用戶態(tài),工作在Ring-3級,受到Windows保護機制的嚴格限制,例如不能直接操作硬件,不能直接操作其他應用程序的內(nèi)存緩沖區(qū)等。而核心層的驅(qū)動程序則不一樣,它處于核心態(tài),工作在Ring-0級,可以執(zhí)行任何特權指令,幾乎可以對所用資源進行直接讀寫操作,Windows 不為它提供任何保護,它具有與操作系統(tǒng)核心同等級別的權限。由于操作系統(tǒng)自身存在許多安全漏洞,運行在其上的應用軟件無一不受到威脅。主機防火墻運行在該主機上,所以其運行機制是主機防火墻的關鍵技術之一。為了自身的安全和徹底堵住操作系統(tǒng)的漏洞,主機防火墻嵌入操作系統(tǒng)內(nèi)核的形態(tài)運行,直接接管網(wǎng)卡,把所有數(shù)據(jù)包進行檢查后再提交給操作系統(tǒng),從操作系統(tǒng)最底層實現(xiàn)對非法訪問的阻截。本文介紹的基于Windows2000的主機防火墻采用核心層數(shù)據(jù)包過濾技術。
1.2 NDIS的基本概念
Windows的網(wǎng)絡模型最主要的包括一個NDIS(網(wǎng)絡驅(qū)動程序接口規(guī)范)的管理庫,它不僅抽象了底層硬件驅(qū)動程序的接口,也抽象了上層協(xié)議的接口和協(xié)議之上的傳輸設備接口。NDIS為網(wǎng)絡驅(qū)動的開發(fā)提供了一套標準的接口,給數(shù)據(jù)交換提出了一個靈活的環(huán)境,使得網(wǎng)絡驅(qū)動程序的跨平臺性更好,傳輸協(xié)議可用它與網(wǎng)卡驅(qū)動程序進行通信。所有的網(wǎng)絡通信最終必須通過 NDIS 完成,所以這是網(wǎng)絡數(shù)據(jù)攔截的良好位置。其模型如圖2所示。
NDIS支持下列幾種類型的驅(qū)動程序:
1. 小端口驅(qū)動程序(Miniport drivers)。小端口驅(qū)動可以通過NDIS接口來管理網(wǎng)絡接口卡(NIC),并且開放Miniport接口供高級驅(qū)動程序調(diào)用。
2. 中間驅(qū)動程序 (Intermediate drivers,簡稱IM Driver)。中間層驅(qū)動處于驅(qū)動程序?qū)蛹壍闹虚g位置,能夠截獲所有的Protocol 驅(qū)動程序通信。
3. 協(xié)議驅(qū)動程序(Protocol drivers)。協(xié)議驅(qū)動程序,處于驅(qū)動程序?qū)蛹壍淖罡邔樱_放Protocol接口供底層驅(qū)動調(diào)用,實現(xiàn)與Protocol與Miniport接口的對接。
1.3 利用驅(qū)動程序?qū)崿F(xiàn)數(shù)據(jù)包過濾技術
利用驅(qū)動程序來攔截網(wǎng)絡數(shù)據(jù)包一般有以下幾種方法來實現(xiàn):
1、 NDIS中間層驅(qū)動程序 (IM Driver)。由于IM Driver所處的特殊位置,所以它可以攔截所有的數(shù)據(jù)包(如果是以太網(wǎng)就是以太幀)。利用NDIS IM Driver可以在網(wǎng)卡驅(qū)動程序和傳輸驅(qū)動程序之間插入一層自己的處理,從而用來攔截所有的數(shù)據(jù)報并完成重新組包、加密、網(wǎng)絡地址轉(zhuǎn)換以及過濾等操作。這樣速度非?,效率也非常高。但是中間層驅(qū)動過濾技術編程接口復雜,而且與操作系統(tǒng)版本關心密切,與硬件聯(lián)系大,移植性低,而且自動安裝太困難。由于以上原因,市面上還沒有基于IMD的防火墻。
2、 TDI過濾驅(qū)動程序(TDI Filter Driver)。當應用程序要發(fā)送或接收網(wǎng)絡數(shù)據(jù)包的時候,都是通過與協(xié)議驅(qū)動所提供的接口來進行的。協(xié)議驅(qū)動提供了一套系統(tǒng)預定義的標準接口來和應用程序之間進行交互。因此,我們只需要開發(fā)一個過濾驅(qū)動來截獲這些交互的接口,就可以實現(xiàn)網(wǎng)絡數(shù)據(jù)包的攔截。TDI層的網(wǎng)絡數(shù)據(jù)攔截還可以得到操作網(wǎng)絡數(shù)據(jù)包的進程詳細信息,這也是個人防火墻的一個重要功能。但是TDI 過濾驅(qū)動器位于TcpIp.sys之上,那些由TcpIp.sys接收并直接處理的數(shù)據(jù)包(比如ICMP)就不會傳到上面,從而無法過濾這些數(shù)據(jù)包。
3、 NDIS HOOK 解決了IM Driver和TDI Filter Driver具有的問題,是較為常用的數(shù)據(jù)包過濾技術。NDIS HOOK 的工作原理是直接替換NDIS的函數(shù)庫中函數(shù)地址,這樣只要向NDIS發(fā)出的請求,就會先經(jīng)過自己編寫的函數(shù)處理,這些函數(shù)可以過濾掉特定的網(wǎng)絡數(shù)據(jù)包再轉(zhuǎn)發(fā)給系統(tǒng)函數(shù)。NDIS HOOK安裝前后的結(jié)構(gòu)示意圖分別如圖3和圖4所示。NDIS HOOK可以完成NDIS函數(shù)和TDI函數(shù)所能完成的功能,而且攔截的是較為底層的數(shù)據(jù)包,不容易被滲透。
2 使用NDIS HOOK實現(xiàn)主機防火墻
Windows2000的驅(qū)動程序流程,如圖5所示,其主要掛接過程如下:
1、 在操作系統(tǒng)加載了NDIS驅(qū)動程序之后,通過自定義函數(shù)HookFunction替換NdisSend函數(shù)入口為MyNdisSend,并保存原函數(shù)指針為NdisSendAddr。與Windows 9x/Me不同,Windows2000下的協(xié)議驅(qū)動一般不再通過NdisSend發(fā)送數(shù)據(jù),而是通過協(xié)議驅(qū)動與網(wǎng)卡綁定后NDIS為其分配的SendHandler來進行數(shù)據(jù)的發(fā)送,必須HOOK這個SendHandler才能真正截獲發(fā)送的數(shù)據(jù)包。
2、 通過HookFunction函數(shù)替換NdisRegisterProtocol函數(shù)入口為MyNdisRegisterProtocol,并保存函數(shù)指針為NdisRegisterProtocolAddr。
3、 在MyNdisRegisterProtocol函數(shù)替換TCP/IP協(xié)議驅(qū)動的接收函數(shù)ReceiveHandler指針為MyReceriveHandler, 截獲接收到的ICMP、IGMP、TCP、UDP等數(shù)據(jù)包,對它們依據(jù)防火墻過濾規(guī)則進行檢驗,對允許通過的數(shù)據(jù)包,將調(diào)用原來的函數(shù)處理;否則丟棄數(shù)據(jù)包。MyNdisRegisterPro還替換了OpenAdapterCompletehandler函數(shù)指針為MyOpenAdapterComplete。
4、 通過HookFunction函數(shù)替換了完成協(xié)議與網(wǎng)卡的綁定的函數(shù)NdisOpenAdapter為MyNdisOpenAdapter,再利用MyNdisOpenAdapter或者MyOpenAdapterComplete HOOK TCP/IP協(xié)議驅(qū)動數(shù)據(jù)包發(fā)送函數(shù)SendHandler,截獲待發(fā)送的ICMP、IGMP、TCP、UDP等數(shù)據(jù)包,對它們依據(jù)防火墻過濾規(guī)則進行檢驗,對于允許通過的數(shù)據(jù)包,將調(diào)用原來的函數(shù)處理;否則丟棄數(shù)據(jù)包。
5、 驅(qū)動程序卸載時,卸載函數(shù)PacketUnload還原被HookFunction替換的系統(tǒng)函數(shù)。
3 小結(jié)
Windows平臺使用NDIS HOOK 實現(xiàn)主機防火墻是比較合適的技術,這種方法在實驗室中投入運行(運行環(huán)境:Windows 2000)。實踐證明采用這種技術實現(xiàn)的主機防火墻安裝方便,而且能過濾所有的網(wǎng)絡數(shù)據(jù)包,必將在網(wǎng)絡防范中起重要作用。
作者簡介:
馮愛娟,女,1979出生,電子科技大學碩士研究生,主要研究方向網(wǎng)絡安全。王蔚然,電子科技大學教授、博導,電子學會會士,主要研究方向為網(wǎng)絡安全,信息獲取、傳輸、處理等。