萬 偉
(西南科技大學 理學院,四川 綿陽 621010)
基于NDIS中間層驅動的DDoS防火墻的設計
萬 偉
(西南科技大學 理學院,四川 綿陽 621010)
分布式拒絕服務攻擊是當前網(wǎng)絡上最為嚴重的攻擊手段之一。為了有效防御DDoS攻擊,文中討論一種Windows平臺下,基于網(wǎng)絡驅動接口規(guī)范中間層驅動技術防御DDoS攻擊的原理。由于NDIS中間層驅動位于Windows網(wǎng)絡組件很低的層次,因此,可以攔截所有的以太網(wǎng)包,具有效率高、攔截準確、系統(tǒng)資源開銷小的特點,配合黑白名單、單個IP連接數(shù)等策略,幾乎讓攻擊者沒有可利用的漏洞。它特別適合用來做大型專業(yè)網(wǎng)絡的防火墻。
網(wǎng)絡驅動接口規(guī)范;中間層驅動;分布式拒絕服務; 防火墻
分布式拒絕服務(distributed denial of service,DDoS)是網(wǎng)絡上一種成本較低、效果明顯、使用范圍廣泛的攻擊手段。以拒絕服務攻擊(denial of service,DoS)為基礎,攻擊者通過自己控制的成千上萬的“肉雞”,在同一時間內(nèi)各自向服務器發(fā)送大量服務請求,導致應用層服務器占用資源或網(wǎng)絡流量急速增大,無法及時響應包括正常服務器在內(nèi)的服務請求,直至系統(tǒng)癱瘓[1-4]。DDoS攻擊是目前網(wǎng)絡服務器面臨的最為嚴重的攻擊手段之一。
1.1 NDIS中間層驅動的概念
網(wǎng)絡驅動接口規(guī)范(network driver interface specification,NDIS)是微軟和一些網(wǎng)絡設備生產(chǎn)商共同制定的一種標準。Windows 2000網(wǎng)絡組件結構從上到下依次為:用戶應用程序、網(wǎng)絡API(application program interface)層、網(wǎng)絡API的內(nèi)核實現(xiàn)層、TDI層(transport driver interface,傳輸層接口)、NDIS協(xié)議驅動層、NDIS小端口驅動層、物理設備層[5-6],如圖1所示。
NDIS中間層驅動是一種混合型的驅動。它把NDIS協(xié)議驅動和NDIS小端口驅動合在一起,對NDIS協(xié)議驅動扮演NDIS小端口驅動的角色,對NDIS小端口驅動扮演NDIS協(xié)議驅動的角色[7-9],如圖2所示。
1.2 NDIS中間層驅動的工作原理
由于NDIS中間層驅動位于NDIS協(xié)議驅動和NDIS小端口驅動之間,所有NDIS協(xié)議驅動和NDIS小端口驅動之間的交互活動都不得不經(jīng)過NDIS中間層驅動。經(jīng)過NDIS中間層驅動的數(shù)據(jù)包都是比較原始的以太網(wǎng)包,可以分析數(shù)據(jù)包的協(xié)議類型、源地址與端口、目的地址與端口,可以記錄數(shù)據(jù)包的信息,修改數(shù)據(jù)包的內(nèi)容,決定是讓數(shù)據(jù)包通過、丟棄或者轉發(fā),處理起來非常靈活。
圖1 Windows 2000網(wǎng)絡組件結構
圖2 微軟WDK文檔中NDIS中間層驅動的結構圖
NDIS中間層驅動在加載時需要完成初始化包裝句柄、注冊小端口特征、注冊協(xié)議特征、關聯(lián)NDIS協(xié)議驅動和NDIS小端口驅動接口等工作。驅動程序將上述步驟注冊的NDIS小端口句柄和NDIS協(xié)議句柄關聯(lián)起來,系統(tǒng)會自動將這兩個句柄在內(nèi)部結構中關聯(lián)并保存。
新創(chuàng)建的NDIS中間層驅動需要綁定到其他的設備驅動程序上,從本質上講,就是綁定網(wǎng)絡適配器(network interface card,NIC),也就是我們通常說的網(wǎng)卡。
完成設備綁定以后,要讓驅動程序的小端口能夠工作,真正實現(xiàn)發(fā)送數(shù)據(jù)包的功能,還必須對小端口進行初始化。
由于中間層在創(chuàng)建時就直接綁定到了適配器上,并創(chuàng)建了一個虛擬的適配器,所以,NDIS協(xié)議驅動就綁定在了這個虛擬的適配器上。當網(wǎng)絡包到達時,NDIS協(xié)議驅動收到這個包后先進行處理,再將其發(fā)送到綁定的適配器上。這樣,數(shù)據(jù)包就進入了NDIS中間層驅動的處理流程,如圖3所示。
圖3 NDIS中間層攔截發(fā)送數(shù)據(jù)包
2.1 NDIS中間層驅動初始化
1)初始化包裝句柄
初始化包裝句柄只需要調(diào)用NdisMInitializeWrapper傳入驅動對象指針和注冊表路徑即可。這兩個信息都來至DriverEntry入口點傳入的參數(shù)。
2)注冊小端口特征
使用NdisIMRegisterLayeredMiniport注冊小端口特征,特征由NDIS_MINIPORT_CHARACTERISTICS結構描述。
NDIS_MINIPORT_CHARACTERISTICS結構大部分域都是用來指定回調(diào)函數(shù),指明小端口希望處理哪些事件。注冊完成后,當相應的事件發(fā)生時,系統(tǒng)會自動調(diào)用用戶注冊的回調(diào)函數(shù),完成用戶指定的功能。這些回調(diào)函數(shù)需要用戶實現(xiàn)。
3)注冊協(xié)議特征
注冊協(xié)議特征與注冊小端口特征類似,通過調(diào)用NdisRegisterProtocol實現(xiàn),協(xié)議的特征由NDIS_PROTOCOL_CHARACTERISTICS結構描述。
4)關聯(lián)NDIS協(xié)議驅動和小端口驅動
NdisIMAssociateMiniport函數(shù)關聯(lián)已經(jīng)注冊的協(xié)議和小端口,傳輸?shù)膮?shù)分別是上面兩步得到的小端口和協(xié)議的NDIS句柄。
2.2 綁定適配器(NIC設備)
注冊小端口特征時,將NDIS_MINIPORT_CHARACTERISTICS結構的InitializeHandler設置為MPInitialize,這就是小端口初始化例程。在這個例程中,應該完成小端口與NIC設備的綁定。在MPInitialize中,獲取系統(tǒng)為NDIS中間層驅動小端口分配的適配器上下文:
pAdapt=NdisIMGetDeviceContext(MiniportAdapterHandle);
檢查可選的媒質類型中有沒有NdisMedium802_3。若有,則將小端的媒質類型填寫為對應的類型;否則,應該直接返回不支持。使用NdisMSetAttributesEx重新設置小端口的適配器的上下文。最后,生成一個設備控制對象,填寫好設備分派例程,調(diào)用NdisMRegisterDevice生成,完成小端口的初始化工作。
從初始化中間層驅動時注冊協(xié)議特征的步驟中發(fā)現(xiàn),當小端口中某些事件發(fā)生時,NDIS庫會自動調(diào)用設置的回調(diào)函數(shù)。與上面的屬性域相對應的事件為:異步發(fā)送完成時、上層請求傳送數(shù)據(jù)完成時、有數(shù)據(jù)達到時、異步接收完成時、有數(shù)據(jù)包達到時。
服務器防火墻的設計主要考慮外部到達的數(shù)據(jù),所以,中間層驅動主要關注攔截和過濾接收包,對應上面的例程包括:PtReceive、PtReceiveComplete、PtReceivePacket。
3.1 小端口驅動接收數(shù)據(jù)包的方式
小端口驅動可以用兩種方式指示數(shù)據(jù)包接收:(1)調(diào)用過濾無關的NdisMIndicateRecveivePacket通知上層NDIS驅動;(2)調(diào)用過濾相關的NdisMXxxIndicateReceive通知上層NDIS驅動。當小端口驅動以NdisMIndicateRecveivePacket方式操作數(shù)據(jù)包時,如果中間層驅動指定了ReceivePacketHandler域,則NDIS調(diào)用ReceivePacketHandler域的回調(diào)函數(shù);否則,NDIS調(diào)用ReceiveHandler域指定的回調(diào)函數(shù)。當小端口驅動以NdisMXxxIndicateReceive方式操作數(shù)據(jù)包時,NDIS調(diào)用ReceiveHandler指定的回調(diào)函數(shù)。
3.2 接收數(shù)據(jù)包
本文中ReceiveHandler的具體實現(xiàn)為PtReceive函數(shù)。當NDIS調(diào)用該函數(shù)時,將傳入數(shù)據(jù)包頭地址、包頭長度、前視緩沖區(qū)指針、前視緩沖區(qū)長度、數(shù)據(jù)包長度(不包括包頭)。如果前視緩沖區(qū)長度大于或等于數(shù)據(jù)包長度,則說明前視緩沖區(qū)中已經(jīng)包含了數(shù)據(jù)包的全部內(nèi)容。
NdisMXxxIndicateReceive根據(jù)數(shù)據(jù)包的不同而不同。對于以太網(wǎng)數(shù)據(jù)包,對應的函數(shù)為NdisMEthIndicateReceive;對于令牌環(huán)數(shù)據(jù)包,對應的函數(shù)為NdisMTrIndicateReceive;對于PDDI包,對應的函數(shù)為NdisMFddiIndicateReceive。具體的數(shù)據(jù)包類型在PtReceive中可以由第一個參數(shù)協(xié)議綁定上下文來獲取。
前文講述接收數(shù)據(jù)包的方法,無論是NdisGetReceivedPacket獲取到的,還是NdisTransferData獲取到的,或是在PtTransferDataComplete中獲取到的,都僅僅是包描述符。專用服務器防火墻關心的重點是TCP數(shù)據(jù)包的源地址、目的端口等參數(shù)。根據(jù)這些參數(shù)及防火墻策略丟棄非法數(shù)據(jù)包。在NDIS中間層驅動中,我們必須從包描述符中獲取到數(shù)據(jù)包內(nèi)容,并將其格式化為協(xié)議數(shù)據(jù)包,再交由策略分析器進行分析。對包的丟棄非常簡單,直接在上面三個接收包描述符的回調(diào)函數(shù)中返回NDIS_STATUS_FAILURE,系統(tǒng)就會自動將該數(shù)據(jù)包丟棄。
4.1 包內(nèi)容的獲取
WDK中包描述符號定義為NDIS_PACKET結構,與包內(nèi)容相關的域為Private,這個域又被定義為NDIS_PACKET_PRIVATE結構。包描述符中所包含的包數(shù)據(jù)實際是一個鏈表。NDIS庫提供了對該鏈表的操作函數(shù):NdisQueryPacket獲取第一個NDIS_BUFFER,NdisGetNextBuffer獲取下一個NDIS_BUFFER,NdisQueryBufferSafe獲取數(shù)據(jù)地址和長度。使用這個函數(shù),可以從頭到尾將NDIS_BUFFER遍歷,并獲取到全部包數(shù)據(jù)。
4.2 格式化包協(xié)議
NDIS中間層收到的數(shù)據(jù)包是原始的以太網(wǎng)幀數(shù)據(jù),如表4所示。
除去前導碼和幀開始符、目的MAC地址、源MAC地址即是IP首部,IP首部在MSDN(microsoft developer network)中定義為IP_HEADER:
typedef struct IP_HEADER
{
unsigned char VIHL; // Version and IHL
unsigned char TOS; // Type Of Service
short TotLen; // Total Length
short ID; // Identification
short FlagOff; // Flags and Fragment Offset
unsigned char TTL; // Time To Live
unsigned char Protocol; // Protocol
unsigned short Checksum; // Checksum
struct in_addr iaSrc; // Internet Address-Source
struct in_addr iaDst; // Internet Address-Destination
}IP_HEADER, *PIP_HEADER;IP_HEADER的Protocol字段指定了應用程序網(wǎng)絡協(xié)議,根據(jù)不同的網(wǎng)絡協(xié)議,將協(xié)議首部、數(shù)據(jù)提交給策略分析模塊,通過對源地址、目的端口、策略的分析,確定是否返回NDIS_STATUS_FAILURE丟棄數(shù)據(jù)。
表4 以太網(wǎng)幀數(shù)據(jù)結構
本文所述的Windows平臺下基于NDIS中間層驅動技術的防火墻,通過在NDIS協(xié)議驅動層和NDIS小端口驅動層之間注冊中間層驅動的方法攔截以太網(wǎng)包,經(jīng)用戶手動或客戶端數(shù)字簽名認證的方法自動增刪黑名單、限制單個IP連接數(shù)等策略實現(xiàn)對非認證連接和數(shù)據(jù)包的屏蔽,達到防御DDoS攻擊,保護專用網(wǎng)絡的目的。
由于NDIS中間層驅動位于Windows網(wǎng)絡組件很低的層次,因此,可以攔截所有的以太網(wǎng)包,具有效率高、攔截準確、系統(tǒng)資源開銷小的特點。配合黑白名單、單個IP連接數(shù)等策略,幾乎讓攻擊者沒有可利用的漏洞。它的這些特點,使其特別適合用來做大型專業(yè)網(wǎng)絡的防火墻。
[1] Ranjan S, Swaminathan R, Uysal M, et al. DDoS shield: DDoS-resilient scheduling to counter application layer attacks[J]. IEEE/ACM Transactions on Networking, 2009, 17(1): 26-39.
[2] Kandula S, Katabi D, Jacob M, et al. Botz-4-scale:surviving organized DDoS attacks that mimic flash crowds[C]Proceedings of the 2nd Conference on Symposium on Networked Systems Design & Implementation. Kyoto, Japan:[s.n.],2005: 287-300.
[3] Yu J, Chen H, Chen X. A detection and offense mechanism to defense against application layer DDoS attacks[C].Proceedings of the 3rd International Conference on Networking and Services. Athens, Greece:[s.n.], 2007: 251-261.
[4] 田俊峰,朱宏濤,孫冬冬,等.基于用戶信譽值防御 DDoS 攻擊的協(xié)同模型[J].通信學報,2009,30(3): 13-20.
[5]Greg Hoglund, James Butler. Rootkit—windows 內(nèi)核的安全防護 [M].北京:清華大學出版社,2007.
[6] 張帆,史彩成. Windows 驅動開發(fā)技術詳解 [M].北京:電子工業(yè)出版社,2008.
[7] 程克勤,鄧林,王繼波,等.基于應用層的Windows個人防火墻的設計與實現(xiàn)[J].合肥工業(yè)大學學報:自然科學版,2010,34(5):695-699.
[8] 易克非,胡慶鋒.基于DSP的實時多任務調(diào)度內(nèi)核設計[J].通信技術,2011,44(6):135-137.
[9]文軍,王加懂.DSP 程序在線編程的研究與實現(xiàn)[J].信息安全與通信保密,2007(8):192-195,198.
Design of Firewall Against DDoS Attacks Based on NDIS Intermediate Drivers
WAN Wei
(Department of Physics, Southwest University of Science and Technology, Mianyang 621010, China)
The attack by Distributed Denial of service is one of the most grievous ploys in internet at the present time. On the platform of Windows, based on NDIS intermediate drivers a principle of defense is proposed to handle DDos attacks in this paper. Because NDIS intermediate drive is located in the rather low level of Windows network components, it can intercept all Ethernet packets, having such features as being efficient, intercepting precisely and having small expenses of systemic resources. Coordinating with such tactics as black-and-white lists and single IP linkage numbers, almost no loopholes can be taken advantage of by attackers. All of these features can be best applied to make large scale and specialized network firewalls.
network driver interface specification; intermediate drivers; distributed denial of service;firewall
2014-05-09;修改日期: 2014-06-04
西南科技大學實驗技術研究基金資助項目(13syjs-32)。
萬 偉(1965-),男,學士,工程師,主要從事實驗教學及實驗技術、實驗方法的研究工作。
TP393.08
A
10.3969/j.issn.1672-4550.2015.02.010