基于NDIS中间层驱动的DDoS防火墙的设计

2015-05-08 06:48
实验科学与技术 2015年2期
关键词:句柄中间层调用

万 伟

(西南科技大学 理学院,四川 绵阳 621010)

基于NDIS中间层驱动的DDoS防火墙的设计

万 伟

(西南科技大学 理学院,四川 绵阳 621010)

分布式拒绝服务攻击是当前网络上最为严重的攻击手段之一。为了有效防御DDoS攻击,文中讨论一种Windows平台下,基于网络驱动接口规范中间层驱动技术防御DDoS攻击的原理。由于NDIS中间层驱动位于Windows网络组件很低的层次,因此,可以拦截所有的以太网包,具有效率高、拦截准确、系统资源开销小的特点,配合黑白名单、单个IP连接数等策略,几乎让攻击者没有可利用的漏洞。它特别适合用来做大型专业网络的防火墙。

网络驱动接口规范;中间层驱动;分布式拒绝服务; 防火墙

分布式拒绝服务(distributed denial of service,DDoS)是网络上一种成本较低、效果明显、使用范围广泛的攻击手段。以拒绝服务攻击(denial of service,DoS)为基础,攻击者通过自己控制的成千上万的“肉鸡”,在同一时间内各自向服务器发送大量服务请求,导致应用层服务器占用资源或网络流量急速增大,无法及时响应包括正常服务器在内的服务请求,直至系统瘫痪[1-4]。DDoS攻击是目前网络服务器面临的最为严重的攻击手段之一。

1 中间层驱动的概念和数据包拦截原理

1.1 NDIS中间层驱动的概念

网络驱动接口规范(network driver interface specification,NDIS)是微软和一些网络设备生产商共同制定的一种标准。Windows 2000网络组件结构从上到下依次为:用户应用程序、网络API(application program interface)层、网络API的内核实现层、TDI层(transport driver interface,传输层接口)、NDIS协议驱动层、NDIS小端口驱动层、物理设备层[5-6],如图1所示。

NDIS中间层驱动是一种混合型的驱动。它把NDIS协议驱动和NDIS小端口驱动合在一起,对NDIS协议驱动扮演NDIS小端口驱动的角色,对NDIS小端口驱动扮演NDIS协议驱动的角色[7-9],如图2所示。

1.2 NDIS中间层驱动的工作原理

由于NDIS中间层驱动位于NDIS协议驱动和NDIS小端口驱动之间,所有NDIS协议驱动和NDIS小端口驱动之间的交互活动都不得不经过NDIS中间层驱动。经过NDIS中间层驱动的数据包都是比较原始的以太网包,可以分析数据包的协议类型、源地址与端口、目的地址与端口,可以记录数据包的信息,修改数据包的内容,决定是让数据包通过、丢弃或者转发,处理起来非常灵活。

图1 Windows 2000网络组件结构

图2 微软WDK文档中NDIS中间层驱动的结构图

NDIS中间层驱动在加载时需要完成初始化包装句柄、注册小端口特征、注册协议特征、关联NDIS协议驱动和NDIS小端口驱动接口等工作。驱动程序将上述步骤注册的NDIS小端口句柄和NDIS协议句柄关联起来,系统会自动将这两个句柄在内部结构中关联并保存。

新创建的NDIS中间层驱动需要绑定到其他的设备驱动程序上,从本质上讲,就是绑定网络适配器(network interface card,NIC),也就是我们通常说的网卡。

完成设备绑定以后,要让驱动程序的小端口能够工作,真正实现发送数据包的功能,还必须对小端口进行初始化。

由于中间层在创建时就直接绑定到了适配器上,并创建了一个虚拟的适配器,所以,NDIS协议驱动就绑定在了这个虚拟的适配器上。当网络包到达时,NDIS协议驱动收到这个包后先进行处理,再将其发送到绑定的适配器上。这样,数据包就进入了NDIS中间层驱动的处理流程,如图3所示。

图3 NDIS中间层拦截发送数据包

2 NDIS中间层驱动的实现

2.1 NDIS中间层驱动初始化

1)初始化包装句柄

初始化包装句柄只需要调用NdisMInitializeWrapper传入驱动对象指针和注册表路径即可。这两个信息都来至DriverEntry入口点传入的参数。

2)注册小端口特征

使用NdisIMRegisterLayeredMiniport注册小端口特征,特征由NDIS_MINIPORT_CHARACTERISTICS结构描述。

NDIS_MINIPORT_CHARACTERISTICS结构大部分域都是用来指定回调函数,指明小端口希望处理哪些事件。注册完成后,当相应的事件发生时,系统会自动调用用户注册的回调函数,完成用户指定的功能。这些回调函数需要用户实现。

3)注册协议特征

注册协议特征与注册小端口特征类似,通过调用NdisRegisterProtocol实现,协议的特征由NDIS_PROTOCOL_CHARACTERISTICS结构描述。

4)关联NDIS协议驱动和小端口驱动

NdisIMAssociateMiniport函数关联已经注册的协议和小端口,传输的参数分别是上面两步得到的小端口和协议的NDIS句柄。

2.2 绑定适配器(NIC设备)

注册小端口特征时,将NDIS_MINIPORT_CHARACTERISTICS结构的InitializeHandler设置为MPInitialize,这就是小端口初始化例程。在这个例程中,应该完成小端口与NIC设备的绑定。在MPInitialize中,获取系统为NDIS中间层驱动小端口分配的适配器上下文:

pAdapt=NdisIMGetDeviceContext(MiniportAdapterHandle);

检查可选的媒质类型中有没有NdisMedium802_3。若有,则将小端的媒质类型填写为对应的类型;否则,应该直接返回不支持。使用NdisMSetAttributesEx重新设置小端口的适配器的上下文。最后,生成一个设备控制对象,填写好设备分派例程,调用NdisMRegisterDevice生成,完成小端口的初始化工作。

3 中间层驱动拦截数据包的实现

从初始化中间层驱动时注册协议特征的步骤中发现,当小端口中某些事件发生时,NDIS库会自动调用设置的回调函数。与上面的属性域相对应的事件为:异步发送完成时、上层请求传送数据完成时、有数据达到时、异步接收完成时、有数据包达到时。

服务器防火墙的设计主要考虑外部到达的数据,所以,中间层驱动主要关注拦截和过滤接收包,对应上面的例程包括:PtReceive、PtReceiveComplete、PtReceivePacket。

3.1 小端口驱动接收数据包的方式

小端口驱动可以用两种方式指示数据包接收:(1)调用过滤无关的NdisMIndicateRecveivePacket通知上层NDIS驱动;(2)调用过滤相关的NdisMXxxIndicateReceive通知上层NDIS驱动。当小端口驱动以NdisMIndicateRecveivePacket方式操作数据包时,如果中间层驱动指定了ReceivePacketHandler域,则NDIS调用ReceivePacketHandler域的回调函数;否则,NDIS调用ReceiveHandler域指定的回调函数。当小端口驱动以NdisMXxxIndicateReceive方式操作数据包时,NDIS调用ReceiveHandler指定的回调函数。

3.2 接收数据包

本文中ReceiveHandler的具体实现为PtReceive函数。当NDIS调用该函数时,将传入数据包头地址、包头长度、前视缓冲区指针、前视缓冲区长度、数据包长度(不包括包头)。如果前视缓冲区长度大于或等于数据包长度,则说明前视缓冲区中已经包含了数据包的全部内容。

NdisMXxxIndicateReceive根据数据包的不同而不同。对于以太网数据包,对应的函数为NdisMEthIndicateReceive;对于令牌环数据包,对应的函数为NdisMTrIndicateReceive;对于PDDI包,对应的函数为NdisMFddiIndicateReceive。具体的数据包类型在PtReceive中可以由第一个参数协议绑定上下文来获取。

4 中间层驱动过滤数据包的实现

前文讲述接收数据包的方法,无论是NdisGetReceivedPacket获取到的,还是NdisTransferData获取到的,或是在PtTransferDataComplete中获取到的,都仅仅是包描述符。专用服务器防火墙关心的重点是TCP数据包的源地址、目的端口等参数。根据这些参数及防火墙策略丢弃非法数据包。在NDIS中间层驱动中,我们必须从包描述符中获取到数据包内容,并将其格式化为协议数据包,再交由策略分析器进行分析。对包的丢弃非常简单,直接在上面三个接收包描述符的回调函数中返回NDIS_STATUS_FAILURE,系统就会自动将该数据包丢弃。

4.1 包内容的获取

WDK中包描述符号定义为NDIS_PACKET结构,与包内容相关的域为Private,这个域又被定义为NDIS_PACKET_PRIVATE结构。包描述符中所包含的包数据实际是一个链表。NDIS库提供了对该链表的操作函数:NdisQueryPacket获取第一个NDIS_BUFFER,NdisGetNextBuffer获取下一个NDIS_BUFFER,NdisQueryBufferSafe获取数据地址和长度。使用这个函数,可以从头到尾将NDIS_BUFFER遍历,并获取到全部包数据。

4.2 格式化包协议

NDIS中间层收到的数据包是原始的以太网帧数据,如表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字段指定了应用程序网络协议,根据不同的网络协议,将协议首部、数据提交给策略分析模块,通过对源地址、目的端口、策略的分析,确定是否返回NDIS_STATUS_FAILURE丢弃数据。

表4 以太网帧数据结构

5 结束语

本文所述的Windows平台下基于NDIS中间层驱动技术的防火墙,通过在NDIS协议驱动层和NDIS小端口驱动层之间注册中间层驱动的方法拦截以太网包,经用户手动或客户端数字签名认证的方法自动增删黑名单、限制单个IP连接数等策略实现对非认证连接和数据包的屏蔽,达到防御DDoS攻击,保护专用网络的目的。

由于NDIS中间层驱动位于Windows网络组件很低的层次,因此,可以拦截所有的以太网包,具有效率高、拦截准确、系统资源开销小的特点。配合黑白名单、单个IP连接数等策略,几乎让攻击者没有可利用的漏洞。它的这些特点,使其特别适合用来做大型专业网络的防火墙。

[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 攻击的协同模型[J].通信学报,2009,30(3): 13-20.

[5]Greg Hoglund, James Butler. Rootkit—windows 内核的安全防护 [M].北京:清华大学出版社,2007.

[6] 张帆,史彩成. Windows 驱动开发技术详解 [M].北京:电子工业出版社,2008.

[7] 程克勤,邓林,王继波,等.基于应用层的Windows个人防火墙的设计与实现[J].合肥工业大学学报:自然科学版,2010,34(5):695-699.

[8] 易克非,胡庆锋.基于DSP的实时多任务调度内核设计[J].通信技术,2011,44(6):135-137.

[9]文军,王加懂.DSP 程序在线编程的研究与实现[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

猜你喜欢
句柄中间层调用
一种十七股子午胎钢丝帘线
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
高校图书馆持久标识符应用研究
编译程序语法分析句柄问题分析与探讨
基于系统调用的恶意软件检测技术研究
镍基高温合金TLP扩散焊中间层材料研究进展
B含量对IC10合金TLP焊接用中间层材料及接头组织的影响
利用RFC技术实现SAP系统接口通信
栅格中间层数据在数字地形分析中的应用