APP下载

基于应用层的Windows个人防火墙的设计与实现

2011-01-23程克勤王继波朱跃农

关键词:字符串驱动程序调用

程克勤, 邓 林, 王继波, 朱跃农

(1.合肥工业大学 信息与网络中心,安徽 合肥 230009;2.合肥工业大学 计算机与信息学院,安徽 合肥 230009)

网络个人防火墙是指隔离在个人计算机和外界网络之间的一道防御系统,是一类防范措施的总称[1]。防火墙可以监控进出个人计算机的通信数据,让安全的、得到许可的信息进入,同时又可以有选择地防止自己的信息危害网络。

当前Windows个人防火墙普遍具有的功能有:对特定的IP地址进行过滤,防止非法用户和网站对本机进行攻击;可对所有的 TCP、UDP、ICMP数据包实施拦截和放行;对网络存取和访问进行监控和审计,并记录这些访问的日志;当发生可疑情况或受到攻击时,进行适当的警报,并给用户提供详细的信息。

当前Window s下个人防火墙的不足之处有:只对数据包中的IP报头、TCP报头、UDP报头、ICMP报头进行匹配和过滤,而忽略数据段部分;存在不能过滤所有数据包和过滤不完全的缺陷,如对ICMP数据包的无条件放行;存在和802.1x[2]身份认证系统冲突的情况;缺乏针对域名的网址过滤功能。

针对上述的不足之处,本文从底层驱动设计和过滤思想等方面提出了新的设计结构和思路。

1 系统设计

Windows个人防火墙软件由用户界面和过滤驱动程序2部分组成;用户界面主要完成2个功能:①和用户交流,包括显示进出本机的数据包详细日志、数据包类型统计、本机IP地址等给用户,同时用户也可以在界面部分设置过滤规则;②和核心过滤驱动部分的链接与数据交换。

Windows防火墙的核心技术是数据包的封包截获(过滤驱动)[3,4],通过对进出本机的数据包截获并分析,以决定放行或者拦截。目前,数据包封包截获主要有4种方法:TDI过滤驱动程序;NDIS过滤驱动程序;Win2k Filter-Hook Driver;NDIS Hook Driver[3]。

TDI过滤驱动程序需要重新改写系统的Tcpip.sys以达到过滤数据包的效果,对系统的效率、稳定性影响较大;Win2k Filter-Hook Driver的结构过于简单,完全依赖于ipfiltdrv.sys;NDIS Hook Driver对操作平台依赖性很高,不适合跨平台移植;NDIS过滤驱动程序的中间层驱动功能强大,平台移植性强,能截获进出本机所有的数据包,并且过滤效率高,故本文选择NDIS过滤驱动程序作为核心过滤驱动。

1.1 NDIS(网络驱动程序接口规范)简介

在OSI标准模型中,最上层是应用层,最底层是物理层。网卡提供网络的硬件接口,网卡驱动程序提供符合NDIS的服务,NDIS是用于实现传输驱动程序和网卡驱动程序之间相互通信的网络驱动规范,同时NDIS又为传输层提供标准的网络接口,所有的传输层驱动程序都需要调用NDIS接口来访问网络[5]。Windows所有的网络通信最终必须通过NDIS完成,NDIS为网络驱动程序创建了一个完整的开发环境。NDIS与OSI7层模型的对应结构,如图1所示。

图1 协议模型和NDIS结构

1.2 NDIS中间层驱动解析

NDIS现在已经发展成为网络标准的一个完整家族,为网络驱动的开发提供了一套标准的接口,使得网络驱动程序的跨平台性更好。NDIS提供3个层次的接口,即微端口驱动程序、中间驱动程序和协议驱动程序[3]。

NDIS微端口驱动程序可以通过NDIS接口来完成对网卡的操作实现网卡驱动,同时开放Miniport接口供上层驱动程序使用。协议驱动程序开放Protocol接口供底层程序调用,实现Protocol接口和Miniport接口的对接。

中间驱动程序处于微端口驱动程序和协议驱动程序之间,中间驱动程序导出协议实体指针(ProtocolXxx函数),让NDIS调用来完成与底层微端口的通信请求。对于微端口驱动程序,中间驱动程序就像协议驱动程序一样,同时中间驱动程序导出微端口实体指针(MiniportXxx函数),让NDIS调用和协议驱动程序进行通信。对于协议驱动程序,中间驱动程序就像微端口驱动程序,中间驱动程序并不能管理物理NIC,只提供1个或多个虚拟适配卡,让上端的协议驱动程序可以绑定。对于一个协议驱动程序,一个通过中间驱动程序提供的虚拟适配卡就像一个物理NIC一样。中间驱动程序和上下层驱动程序以及NDIS的关系,如图2所示。

图2 系统接口层次

2 系统实现

2.1 重新编写NDIS层驱动程序

在最常用的 Windows防火墙驱动编译器Microsoft DDK中,Microsoft提供了一个完整、规范、可行的驱动例程passthru,但安装以passthru驱动程序为框架的防火墙会发生与校园内使用的802.1x身份认证软件的冲突问题。为了彻底解决该认证和防火墙安装的冲突问题,参考passthru例程,重新编写运行于NDIS中间层的驱动程序并命名为TCWall。

重新编写的NDIS中间驱动程序TCWall只是一个空的虚拟框架,它通过入口函数Driver-Entry向NDIS注册一个 Miniport接口和一个Protocol接口[4],这2个接口分别包括一组规定好的标准处理函数。中间驱动程序的入口函数DriverEntry包含以下4个步骤:

(1)调用NdisMInitializeWrapper函数注册Miniport驱动设备,得到设备的句柄NdisWrapper Handle。

(2)利用第(1)步得到的句柄调用NdisIMRegisterLayeredMiniport函 数, 注 册MiniportXxx功能函数以开放出为上层协议驱动提供的接口。

(3)调用NdisRegisterProtocol函数,注册ProtocolXxx功能函数以开放出为底层Miniport驱动提供的接口,并将本身绑定到底层驱动程序上。

(4)如果既注册了MiniportXxx函数又注册了ProtocolXxx函数,则会调用 NdisIMAssociateMiniport函数并通知NDIS库这个中间驱动程序,这样既为底层的MiniportXxx提供ProtocolXxx接口,又为上层的 ProtocolXxx提供MiniportXxx接口。

通过入口函数 DriverEntry的处理后,Miniport和Protocol接口便会直接暴露出来并和上层的Protocol、底层的Miniport进行结合。

2.2 数据包接收流程

通过上面的工作已经完成了防火墙底层驱动框架的搭建,底层驱动的数据包接收流程如图3所示。

图3 驱动流程

图3中各个驱动流程说明如下:

(1)底层调用NdisMIndicateReceive/Ndis-MEthIndicateReceive函数通知上层已接收到数据包。

(3)在 TCWallReceive函数中如果通过NdisGetReceivedPacket不能得到完整的Packet,则调用NdisMEthIndicateReceive函数通知NDIS执行相应操作。

(4)当上层协议驱动得到了一个完整的数据报文并且等待处理完毕以后,通过调用微端口上的NdisReturnPacket函数来调用 TCWallReturnPacket。

(5)在TCWallReturnPacket中,释放分配的Packetlocal,然后继续向下层调用 NdisReturn-Packet来释放分配的Packet。

(6)如果流程(3)发生,当底层Miniport驱动收到一个完整的数据报文,它会调用NdisME-thIndicateReceiveComplete,然后NDIS调用 TCWallReceiveComplete。

(7)TCWallReceiveComplete同样会调用NdisMEthIndicateReceiveComplete来通知NDIS已经收到了完整的报文。

(8)当上层协议驱动得知底层驱动已经接收到了完整的数据报文以后,就会调用NdisTransferData函数来要求下层把剩余的数据传上来。

(9)因流程(8)的调用会导致NDIS来调用TCWallTransferData函数,在 TCWall-T ransfer-Data函数中,执行同样的函数调用。此时,如返回SUCCESS则立即返回,流程(10)、(11)就不会调用;如返回PENDING,则表明底层在此阻塞,底层稍后会调用流程(10)。

(10)当底层Miniport驱动程序已经接收到了一个完整的Packet,它就会调用NdisT ransfer-DataComplete。

(11)TCWallT ransferDataComplete函数会作出同样的调用。

底层驱动的数据包发送与数据包的接收流程类似,不再复述。

2.3 数据包的过滤规则

在上述的介绍中,已经对所有进出本机的数据包进行封包拦截,并且在内存中开辟缓冲区来存放截获的数据包,然后对缓冲区中的数据包进行过滤,过滤规则在函数执行中的具体位置如图4所示。

图4 数据处理流程

2.4 应用数据段中使用L7层过滤思想

深层数据包探测技术DPI(deep packet inspection,简称DPI)识别方法是通过对应用层数据包进行解析[6],并尝试将 TCP/UDP连接中的数据内容和在应用程序中发现的公共特征进行匹配的方式来识别应用,L7层就是应用层。本文采用字符串模式匹配来进行L7层过滤,这种匹配方式具有准确高效的特点。传统的字符串匹配算法有BF算法、KMP算法等,最近提出的有BM算法、SUNDAY算法[7-12]等。

SUNDAY算法在时间复杂度上优于KMP算法,该算法是根据每次最多匹配的字符串的后一位来确定移动位置。如查找到字符串之后,如能完全匹配则退出返回成功信息,否则找到部分匹配字符串之后的字符,若其不在特征字符串中,则从该字符之后位置开始重新匹配,否则按照不同字符移动不同位置。

考虑到对大批量数据进行处理的难以实现和SUNDAY算法的优越性,本文采用SUNDAY算法作为防火墙的字符串匹配算法。

当报文到达后,采用何种方式送入匹配引擎对匹配速度和精确度都有较大的影响,下面对常用的3种匹配方式进行比较。

(1)单报文匹配。一个数据流的每个报文到达时都提取其应用层数据送入匹配,直到匹配成功,则后续报文不再送去匹配。这种匹配方式匹配速度快,而且正确性高,但是匹配速度不快。

(2)多报文叠加匹配。第1个报文到来时,提取其应用层数据进行匹配,如果匹配上,完成匹配,否则当第2个报文到来时,把第1个和第2个报文的数据结合起来一起匹配,依次进行下去,每个报文都和前面所有报文的内容结合起来一起匹配。这种匹配方式正确性高,但匹配速度很慢。

(3)报文一次性匹配。存储一个数据流已到达的报文,直到其报文到达一定数目,再一起送去匹配,如匹配,则后续报文无需继续,否则表示这个数据流无法识别。这种匹配方式有利于跨报文的匹配,而且避免了多报文叠加匹配方式对同一数据流报文的多次匹配,节省了匹配时间,一次性完成匹配,提高了速度。

本文采用报文一次性匹配方式,在每个对话中取前4个的数据包送入匹配算法,如能识别则进行相应的操作,否则作为无法识别的数据丢弃。在检查了数据包的包头之后,从特定文件夹中读入.bat文件,提取正则表达式和特征字符串,然后与报文进行循环匹配,若能匹配,则丢弃对话,反之则通过。

2.5 用户界面部分

用户界面部分是用户和核心过滤驱动程序之间的通信媒介,用户可以通过界面对具体的过滤规则进行设置,并通过DeviceIoControl函数传递到核心驱动部分来实现设置的过滤规则。核心驱动程序把通过其发送和接收数据包的详细日志和数据包协议类型以百分比的形式传递到用户界面,给用户详细直观的信息。当发生可疑情况或遭受到攻击时,系统会给用户发出警报,并给用户提供其详细的数据,图5所示为防火墙的用户界面。

图5 系统功能界面

3 功能验证

3.1 局域网实验

将局域网中另一主机的飞鸽用户名设置为“heike”,应用 L7过滤,当L7过滤规则字符串中无“heike”时,可以在本机的飞鸽(一种常见的校园通讯工具)用户名单中看到名为“heike”的用户。在L7规则字符串中添加规则字符串“heike”之后,名为“heike”的飞鸽用户被拦截,不在用户名单之列,如图6所示。

图6 拦截内容heike前、后飞鸽用户

3.2 互联网验证

开启L7过滤功能,在L7规则字符串中添加google,然后回到百度页面重新搜索google,浏览器进度显示非常慢,搜索失败,如图7所示。

图7 拦截goog le字符串

4 结束语

通过在个人计算机与校园网的接口处设置防火墙测试,证明设计的防火墙系统使用效果良好,能有效地提高个人计算机的安全程度,增加了校园网的可靠性。NDIS中间驱动功能强大,能在网络底层拦截所有以太帧,是Microsoft力荐的防火墙技术,特别是在防火墙的过滤规则中加入L7层过滤功能之后,其安全性和可靠性进一步增强。

本文所设计的防火墙还需进一步地完善,特别是L7过滤算法,现在只是起步阶段,只对字符串过滤有效,以后的研究将致力于更好的匹配算法,提高匹配的效率和性能。

[1]周学广,刘 艺.信息安全学[M].北京:机械工业出版社,2003:111-118.

[2]袁建国,方宁生,姜 浩,等.802.1x:基于端口的访问控制协议[J].微机发展,2005,12(15):160-163.

[3]宋雁辉.Windows防火墙与网络封包截获技术[M].北京:电子工业出版社,2002:66-80.

[4]陈向群,马洪兵,王 雷,等.Windows内核试验教程[M].北京:机械工业出版社,2002:99-110.

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

[6]Sen S,Spatscheck O,Wang D.Accurate,scalable in-network identification of p2p traffic using application signatures[C]//Proceeding s of World Wide Web Conference,NY,USA,2004:512-521.

[7]王 成,刘金刚.一种改进的字符串匹配算法[J].计算机工程,2006,32(2):62-64.

[8]Christian C,Thierry L.Exact string matching algorithms[EB/OL].[2010-04-04].http://igm.univ-mlv.fr/~lecroq/string/.

[9]Sunday D M.A very fast substring search algorithm[J].Communications of ACM,1990,33(8):132-142.

[10]Kumar S,Dharmapurikar S,Yu Fang,et al.Algo rithms to accelerate multiple regular expressions matching for deep packet inspection[C]//SIGCOMM'06,Proceedings of the 2006 Conference on Applications,Technologies,Architectures,and Protocols for Computer Communications,2006:11-15.

[11]Sidhu R,Prasanna V K.Fast regular expression matching using FPGAs[C]//T CCM'01 Proceeding of the 9th Annual IEEE Symposium on Field-prog rammable Custom Computing M achines,2001:227-238.

[12]侯整风,江 鹏.对基于元组向量折叠的包分类算法的改进[J].合肥工业大学学报:自然科学版,2009,32(8):1132-1136.

猜你喜欢

字符串驱动程序调用
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
基于系统调用的恶意软件检测技术研究
一种新的基于对称性的字符串相似性处理算法
利用RFC技术实现SAP系统接口通信
依据字符串匹配的中文分词模型研究
一种针对Java中字符串的内存管理方案
驱动程序更新与推荐
驱动程序更新与推荐
小改字符串让杀毒软件闭嘴