冯爱娟 王蔚然 (电子科技大学电子工程学院, 成都 610054)
摘要:主机防火墙在分布式防火墙体系结构中承担了重要的角色,其把安全策略延伸到网络的各个主机。本文介绍了几种利用驱动程序来实现基于Windows2000的嵌入式主机防火墙的方法,比较了其中的优劣,并对其中的NDIS HOOK实现防火墙技术给出了一个具体例子。
关键词:分布式防火墙; 主机防火墙; NDIS; NDIS HOOK
随着网络的广泛使用 ,网络安全问题成为人们关注的焦点 。以往采用的安全保护中使用得最多的是传统的防火墙机制 ,但是由于它对网络拓扑结构的依赖,随着不断扩大的网络互连,传统防火墙的缺陷也日益突出,由此分布式防火墙应运而生。分布式防火墙在保留传统防火墙优势的同时,减小甚至去除了它对网络拓扑结构的依赖性。分布式防火墙可以认为是由3部分组成的立体防护系统:一部分是网络防火墙,它承担着传统边界防火墙看守大门的职责;一部分是主机防火墙,它解决了边界防火墙不能解决的问题(例如来自内部的攻击和结构限制等);还有一部分是集中管理,它解决了由分布技术而带来的管理问题。分布式防火墙最重要的优势在于它能够保护物理拓扑上不属于内部网络、但位于逻辑上的"内部"网络的那些主机。
分布式防火墙技术增加了针对主机的入侵检测和防护功能,加强了对来自内部攻击防范,对用户网络环境可以实施全方位的安全策略,并提供了多层次立体的防范体系。在分布式防火墙的组成里,主机防火墙是最有特色的部分。主机防火墙驻留在被保护的主机上,用户可以针对该主机上的具体应用和对外提供的服务设定个性化的安全策略。主机防火墙对分布式防火墙体系结构的突出贡献是,使安全策略不仅仅停留在网络与网络之间,还把安全策略推广延伸到每个网络的各个主机上。
1 主机防火墙技术
主机防火墙运行于宿主机操作系统内核,通过替换或挂接操作系统网络协议堆栈完成数据包过滤,因此与主机操作系统及网络协议有莫大的关系。其主要手段是分析主机操作系统网络协议,在适当的位置插入拦截点,所有的网络数据包通讯都要经过这些拦截点,再根据安全策略制定的规则对经过拦截点的网络信息进行监控和审查,过滤掉不符合安全规则的信息,以保护主机不受外界的非法访问和攻击。目前在绝大多数内部网的主机运行的是Windows操作系统,也是主机防火墙最重要的系统运行平台。下面主要阐述在Windows2000中主机防火墙的关键技术及其实现。
1.1 Windows操作系统的总体构架
Windows操作系统的总体构架分为两个层次,上面的为应用层(用户态),下面的为核心层(核心态)。其结构如图1所示。

应用程序位于上层,处于用户态,工作在Ring-3级,受到Windows保护机制的严格限制,例如不能直接操作硬件,不能直接操作其他应用程序的内存缓冲区等。而核心层的驱动程序则不一样,它处于核心态,工作在Ring-0级,可以执行任何特权指令,几乎可以对所用资源进行直接读写操作,Windows 不为它提供任何保护,它具有与操作系统核心同等级别的权限。由于操作系统自身存在许多安全漏洞,运行在其上的应用软件无一不受到威胁。主机防火墙运行在该主机上,所以其运行机制是主机防火墙的关键技术之一。为了自身的安全和彻底堵住操作系统的漏洞,主机防火墙嵌入操作系统内核的形态运行,直接接管网卡,把所有数据包进行检查后再提交给操作系统,从操作系统最底层实现对非法访问的阻截。本文介绍的基于Windows2000的主机防火墙采用核心层数据包过滤技术。
1.2 NDIS的基本概念
Windows的网络模型最主要的包括一个NDIS(网络驱动程序接口规范)的管理库,它不仅抽象了底层硬件驱动程序的接口,也抽象了上层协议的接口和协议之上的传输设备接口。NDIS为网络驱动的开发提供了一套标准的接口,给数据交换提出了一个灵活的环境,使得网络驱动程序的跨平台性更好,传输协议可用它与网卡驱动程序进行通信。所有的网络通信最终必须通过 NDIS 完成,所以这是网络数据拦截的良好位置。其模型如图2所示。
NDIS支持下列几种类型的驱动程序:
1. 小端口驱动程序(Miniport drivers)。小端口驱动可以通过NDIS接口来管理网络接口卡(NIC),并且开放Miniport接口供高级驱动程序调用。
2. 中间驱动程序 (Intermediate drivers,简称IM Driver)。中间层驱动处于驱动程序层级的中间位置,能够截获所有的Protocol 驱动程序通信。
3. 协议驱动程序(Protocol drivers)。协议驱动程序,处于驱动程序层级的最高层,开放Protocol接口供底层驱动调用,实现与Protocol与Miniport接口的对接。
1.3 利用驱动程序实现数据包过滤技术
利用驱动程序来拦截网络数据包一般有以下几种方法来实现:
1、 NDIS中间层驱动程序 (IM Driver)。由于IM Driver所处的特殊位置,所以它可以拦截所有的数据包(如果是以太网就是以太帧)。利用NDIS IM Driver可以在网卡驱动程序和传输驱动程序之间插入一层自己的处理,从而用来拦截所有的数据报并完成重新组包、加密、网络地址转换以及过滤等操作。这样速度非常快,效率也非常高。但是中间层驱动过滤技术编程接口复杂,而且与操作系统版本关心密切,与硬件联系大,移植性低,而且自动安装太困难。由于以上原因,市面上还没有基于IMD的防火墙。
2、 TDI过滤驱动程序(TDI Filter Driver)。当应用程序要发送或接收网络数据包的时候,都是通过与协议驱动所提供的接口来进行的。协议驱动提供了一套系统预定义的标准接口来和应用程序之间进行交互。因此,我们只需要开发一个过滤驱动来截获这些交互的接口,就可以实现网络数据包的拦截。TDI层的网络数据拦截还可以得到操作网络数据包的进程详细信息,这也是个人防火墙的一个重要功能。但是TDI 过滤驱动器位于TcpIp.sys之上,那些由TcpIp.sys接收并直接处理的数据包(比如ICMP)就不会传到上面,从而无法过滤这些数据包。
3、 NDIS HOOK 解决了IM Driver和TDI Filter Driver具有的问题,是较为常用的数据包过滤技术。NDIS HOOK 的工作原理是直接替换NDIS的函数库中函数地址,这样只要向NDIS发出的请求,就会先经过自己编写的函数处理,这些函数可以过滤掉特定的网络数据包再转发给系统函数。NDIS HOOK安装前后的结构示意图分别如图3和图4所示。NDIS HOOK可以完成NDIS函数和TDI函数所能完成的功能,而且拦截的是较为底层的数据包,不容易被渗透。
2 使用NDIS HOOK实现主机防火墙
Windows2000的驱动程序流程,如图5所示,其主要挂接过程如下:
1、 在操作系统加载了NDIS驱动程序之后,通过自定义函数HookFunction替换NdisSend函数入口为MyNdisSend,并保存原函数指针为NdisSendAddr。与Windows 9x/Me不同,Windows2000下的协议驱动一般不再通过NdisSend发送数据,而是通过协议驱动与网卡绑定后NDIS为其分配的SendHandler来进行数据的发送,必须HOOK这个SendHandler才能真正截获发送的数据包。
2、 通过HookFunction函数替换NdisRegisterProtocol函数入口为MyNdisRegisterProtocol,并保存函数指针为NdisRegisterProtocolAddr。
3、 在MyNdisRegisterProtocol函数替换TCP/IP协议驱动的接收函数ReceiveHandler指针为MyReceriveHandler, 截获接收到的ICMP、IGMP、TCP、UDP等数据包,对它们依据防火墙过滤规则进行检验,对允许通过的数据包,将调用原来的函数处理;否则丢弃数据包。MyNdisRegisterPro还替换了OpenAdapterCompletehandler函数指针为MyOpenAdapterComplete。
4、 通过HookFunction函数替换了完成协议与网卡的绑定的函数NdisOpenAdapter为MyNdisOpenAdapter,再利用MyNdisOpenAdapter或者MyOpenAdapterComplete HOOK TCP/IP协议驱动数据包发送函数SendHandler,截获待发送的ICMP、IGMP、TCP、UDP等数据包,对它们依据防火墙过滤规则进行检验,对于允许通过的数据包,将调用原来的函数处理;否则丢弃数据包。
5、 驱动程序卸载时,卸载函数PacketUnload还原被HookFunction替换的系统函数。
3 小结
Windows平台使用NDIS HOOK 实现主机防火墙是比较合适的技术,这种方法在实验室中投入运行(运行环境:Windows 2000)。实践证明采用这种技术实现的主机防火墙安装方便,而且能过滤所有的网络数据包,必将在网络防范中起重要作用。
作者简介:
冯爱娟,女,1979出生,电子科技大学硕士研究生,主要研究方向网络安全。王蔚然,电子科技大学教授、博导,电子学会会士,主要研究方向为网络安全,信息获取、传输、处理等。