第五章 防火墙测评方法
第二节 Windows平台上的网络数据包截获技术
5.2 Windows平台上的网络数据包截获技术
个人防火墙通常作为一个应用程序在一台主机上运行,它通过分析主机操作系统网络协议架构,在适当的位置插入拦截点,使所有的网络数据包都经过这些拦截点,再根据安全策略制定的过滤规则(访问控制规则)对经过拦截点的网络信息流进行监控和审查,过滤掉不符合安全规则的信息,以保护主机不受外界非法访问和攻击。个人防火墙的核心技术是网络数据包截获技术。
由5.1节的分析可知,Windows操作系统下的网络数据包可以在两个层面进行拦截:用户层和内核层。
5.2.1 用户层的网络数据包截获
Winsock是Windows网络编程接口,它工作于Windows用户层,提供与底层传输协议无关的高层数据传输编程接口。在Windows系统中,使用Winsock接口为应用程序提供基于TCP/IP的网络访问服务,这些服务是由wsock32.dll动态链接库提供的函数库来完成的。在用户态下进行数据包拦截有以下几种方法。
(1)基于Winsock SPI
Winsock分层服务提供者(Layered Service Provider,LSP),可以直接获得Winsock进程的详细信息,可以比分析基本协议更方便地得到想要的数据内容,如直接得到浏览器(可以是IE、Opera或是Firefox)当前正在进行传输的地址和内容。但是,如果一些木马和病毒绕过Winsock直接通过TDI(Transport Driver Interface)调用内核层TCP/IP驱动程序,这种方法就会失去作用。
LSP是Winsock 2.0 独有的功能,它需要Winsock服务提供商接口(Service Provider Interface,SPI)才能实现。SPI是一种不能独立工作的技术,它依赖于系统已经存在的基本协议,如TCP/IP,在这些协议的基础上派分出的子协议(即分层协议)必须通过一定的接口调用,LSP就是这些协议的调用接口。本书在第6章讲解了基于Winsock SPI技术实现的数据包截获实例。
(2)基于Windows 2000/XP包过滤接口
Windows 2000 Provides API是一系列用户层程序指定的过滤规则,这些规则可以被底层TCP/IP用来过滤数据包。这种过滤主要是对IP源地址、目标地址和端口号(或者端口号范围)进行通过或停止操作。但这一功能仅限于Windows 2000以上的系统,同时包过滤的规则有很多限制,因此实际应用起来是远远不够的。
(3)替换系统自带的winsock 动态链接库
替换winsock动态链接库的部分导出函数可以实现数据包的监听和拦截。总的来说,这是一种较好的方式。但有一个困难,就是微软的winsock动态链接库中有一些未公开的内部使用函数,替代它需要处理其中的一些未公开函数。此外,对于一些木马和病毒来说很容易避开这个层次的防火墙,从包处理效率考虑也不宜在用户态拦截数据包。
5.2.2 内核层的网络数据包截获
大多数个人防火墙都是利用网络驱动程序在内核态实现的。利用驱动程序截获数据包可以在网络协议栈的不同位置实现,主要有以下几种方法。
(1)编写TDI过滤驱动程序
传输数据接口(Transport Data Interface,TDI)过滤驱动程序,定义了传输协议栈向上层提供的内核层网络接口。应用程序发送或接收网络数据包都是通过协议驱动所提供的接口来进行的,协议驱动提供一套系统预定义的标准接口和应用程序进行交互。因此,开发一个过滤驱动截获这些交互的接口就可以实现对网络数据包的拦截。另外,在这个层次还可以得到操作网络数据包进程的详细信息。
(2)编写NDIS中间层驱动程序
网络驱动接口规范(Network Driver Interface Specification,NDIS)中包含局域网网卡驱动程序标准、广域网网卡驱动程序标准以及协议和网卡之间的中间驱动程序标准。NDIS横跨传输层、网络层和数据链路层,定义了网卡或网卡驱动程序与上层协议驱动程序之间的通信接口规范,屏蔽了底层物理硬件的不同,使上层的协议驱动程序可以和底层任何型号的网卡通信。
当主机用户要发送数据和接收数据时,都要通过NDIS和网卡进行数据的转发,在网卡设备与外界进行通信的过程中,NDIS是唯一的非硬件模块,也就是说任何进出网卡的网络封包,必须首先经过它的处理。
本书选择在NDIS中间驱动程序中拦截和过滤数据包,实现包过滤型防火墙功能。第7章中介绍实现方法。
(3)编写NDIS 钩子驱动程序(NDIS Hook Driver)
这是目前大多数个人防火墙所使用的方法,是一种比较高级但比较危险、非常规的做法。该驱动程序可以截获或者说是Hook指定的NDIS导出的函数。在Windows NT/2000/XP下实现Hook主要有两种方式:修改NDIS.SYS的Export Table和向系统注册假协议(Fake Protocol)。要修改NDIS.SYS 就不得不通过写驱动程序来实现,也就要求开发者对PE 文件格式有比较深入的了解。向系统注册假协议这种方法对平台的依赖性比较大,需要在程序中判断不同的操作系统版本而使用不同的结构定义。有关Windows钩子技术的文档较少,开发有一定难度。
(4)编写Windows 2000过滤钩子驱动(Filter-Hook Driver)程序
这是从Windows 2000开始系统所提供的一种驱动程序,该驱动程序主要是利用ipfiltdrv.sys提供的功能来拦截网络数据包。由于在结构上过于简单,系统中只能有一个活动的Filter-Hook并且依赖于ipfiltdrv.sys,因此微软并不推荐使用该技术。