你的防火墙可靠吗
你的防火墙可靠吗
流氓软件和木马在各种防火墙和杀毒软件的“打压”之下已经开始逐步向内核“退缩”,传统的依靠查看本地打开的端口与进程的关系的方法检查非法网络访问已经不再适用,个人防火墙已经成为装机必备的软件。目前主流的个人防火墙软件都是构建在Windows内核之上的,但是Windows的内核驱动是分层的,防火墙工作在哪一层实际上就决定了防火墙的性能,工作在TDI层的防火墙是无论如何也不能知道NDIS层的数据收发情况的,因为TDI驱动层在内核中是高于NDIS驱动层的。过去的木马(上个世纪九十年代以前)都是构建在Windows应用层上的普通程序,工作在TDI层的防火墙可以轻易地觉察并阻断它们非法的网络访问,但是对付缩进内核的木马和流氓软件,单纯的依靠TDI层拦截已经显得力不从心。内核木马的特点是不依赖句柄,不绑定端口(NDIS)
),可以工作在TDI层,甚至在NDIS层,所以,真正可靠的防火墙应该在NDIS层建立防线。
虽然真正可靠的防火墙应该工作在NDIS层,但是,个人防火墙和用于服务器的防火墙毕竟还是有一些不同之处,工作在服务器端的防火墙只需要根据协议、地址和端口判断是转发还是丢弃就行了,高级一点还可以分析包内容,根据预设的专家系统判断是正常的数据包还是非法攻击数据包,这样的防火墙还可以用硬件实现。但是个人防火墙的特别之处就是需要与用户交互,用户数据多是基于IP协议的,并且用户并不关心协议的细节(掌握这些对大多数用户来说有点难度),所以个人防火墙除了通过IP层的协议进行过滤之外,更主要的手段是根据用户的意愿允许还是阻止某个进程(程序)访问网络,在这个粒度上用户比较容易理解和控制。从这一点上讲,工作在TDI层的防火墙的优势就是能够在网络访问发生的时候追踪到发起访问的进程名称,从而给用户一个提示,而工作在NDIS层的防火墙则不容易做到这一点。因为发送数据时上层驱动将数据包提交到NDIS的发送队列中后就返回了,当数据包被真正投递的时候已经无从确定是哪个程序(进程)发送的了,对于收到的数据包需要根据端口号判断是哪个程序的,但是在NDIS层并不知道端口号和进程的对应关系,所以无论数据发送还是接收都无法有效地确定是属于哪个进程的数据。如果不能确定哪个进程访问网络,只是根据地址、端口和协议进行过滤对(大多数)用户来说是很不友好的,所以最好的个人防火墙(不一定是最安全的)应该是TDI+NDIS双保险:TDI层根据进程级访问过滤,NDIS层根据地址、端口和协议过滤。
前几天,一个朋友要我给他推荐一款比较好的防火墙软件,说实话,我也不知道哪个好,因为我没有比较过。没有调查就没有发言权,随便应付也不是本人的风格,加上本人最近正在验证一个在内核构建TCP/IP协议绕过防火墙的概念的可行性,需要对当前主流防火墙的能力有所了解,所以就把当前比较流行的防火墙都弄来研究了一下,没想到真是大开眼界,不看不知道,一看吓一跳。先上网搜了一下个人防火墙,没想到有这么多种,没时间全搞一遍,只能对用的最多的几个下手了,它们是“天网防火墙个人版”,“金山网镖”,“瑞星个人防火墙”,“卡巴斯基”,“冰盾”和“风云防火墙”,有几个防火墙软件不仅提供网络防火墙功能,还提供诸如文件访问控制,进程创建保护等功能,不过本文只是比较它们的网络防范功能。
首先是天网防火墙,这可是本人上学的时候最喜欢的防火墙了,简单好用。这次使用的是天网防火墙个人版(Trial_Release_v3.0_Build1213),结果却令人失望,天网是一个单纯的TDI防火墙。下图天网启动后的设备驱动加载情况:
图 1 天网防火墙设备驱动加载情况
工作在TDI层的防火墙有两种方式,一种是做成过滤驱动挂接到支持TCP/IP协议的设备上,简单地讲,就是发送给TCP/IP协议驱动的请求会先发送给它过滤,另一种是使用Hook的方式直接Hook TCP/IP协议的驱动分派函数,相比较而言,第一种比较容易bypass,驱动层的木马或流氓软件通过设备直接找到TCP/IP的驱动发送请求,就可以避开Attach在其上的过滤驱动,从上图看,天网的驱动是一个Filter驱动,除了直接向TCP/IP的驱动发送请求可以避开天网之外,还有一种方法可以让它完全失效,就是直接摘除挂接的Filter驱动,看看下面的代码:
void ByPassAttachDevice(PDEVICE_OBJECT DeviceObject)
{
PDEVICE_OBJECT CurDevObj = DeviceObject;
while(CurDevObj != NULL )
{
CurDevObj->AttachedDevice = NULL;
CurDevObj = CurDevObj->NextDevice;
}
}
运行在驱动层的木马只要对设备驱动运行一下ByPassAttachDevice()函数就可以让天网和所有使用这种技术的防火墙形同虚设。口说无评,本人专门写了一个驱动来验证,首先在天网的设置中禁止IE访问网络,此时IE的网络访问会被禁止:
图 2 天网防火墙组织IE访问网络
然后用驱动加载测试工具加载本人编写的驱动程序(文后附有加载工具和驱动程序,以及使用说明,可以用来测试一下你用的防火墙是否安全),假设这是一个运行在内核的木马或流氓软件:
图 3 加载Bypass驱动程序
运行后天网就失效了,看看IE可以访问网络了,不仅IE,所有被禁止的程序都可以访问网络了:
图 4 天网防火墙失效了
结论,就不说了,真的很失望。
下面看看金山网镖,这个是我的朋友很喜欢用的,一直说它好用,本次比较用的是金山安全套件2008中附带的金山网镖,先看看它的驱动加载情况:
图 5 金山网镖驱动加载情况
这也是一个TDI Filter,没有在NDIS层做工作,使用前面的工具可以轻松bypass,不说了,下一个。
接下来是瑞星个人防火墙,使用的版本是瑞星个人防火墙2008。瑞星的驱动在TDI层使用了不容易bypass的TDI hook,除此之外,在NDIS层也使用了Hook,先看看TDI层的情况:
图 6 瑞星驱动的TDI Hook情况
再看看在NDIS层的Hook情况:图 7 瑞星驱动的NDIS Hook情况
从驱动上看瑞星防火墙要比前两个强很多,本人曾试着手工恢复被hook的函数,虽然恢复后不再弹出“某某程序要访问网络”的提示,但是实际上还是不能访问网络,不知为何,有兴趣的朋友可以研究一下。
再来看看卡巴斯基,这次使用的是卡巴斯基的互联网安全套装6.0个人版,从驱动上看卡巴斯基采用的是用TDI Filter驱动+NDIS Hook:
图 8 卡达斯基的驱动加载情况
但是可能卡巴斯基的NDIS Hook只是用来分析可以的数据才使用的,也或者是为实现其它功能设置的Hook,总之,使用本文的程序可以bypass卡巴斯基的防火墙功能。
再看看冰盾防火墙,冰盾是一个服务器防火墙,这次使用的是冰盾8.1 Build 60214,从驱动加载情况看,冰盾使用了一个NDIS中间层驱动,没有Hook,也没有处理TDI层的事务,毕竟它不是个人防火墙,没必要处理TDI层的事情(这只是本人的看法的)。工作在NDIS层的好处是可以探测工作在TDI层的rootkit木马,但是对于个人计算机用户来说,冰盾的设计不太好用(或者说比较难理解,相对于其它几种防火墙软件),另外,中间层驱动还容易被Hook,rootkit木马可以Hook它的处理函数,比如指向一个空函数,就可以瘫痪中间层驱动。
最后一个是风云防火墙,这个是从网上搜到的,以前没听说过,使用的版本是V1.26 正式版。这个软件除了防火墙功能之外,还有很多附加功能,比如文件访问监控,注册表访问监控等等,不过其网络防火墙这块使用的策略和卡巴斯基一样,可以被本文的工具bypass
从分析的结果来看,这几款防火墙软件对于应用程序的访问控制都是没有问题的,但是对于同样工作在内核级别上的木马和流氓软件则问题很多,只有瑞星防火墙结果好一点,其它的几款防火墙软件都挺令人失望,特别是天网防火墙。最后需要强调一点的是即使是瑞星这样使用TDI Hook + NDIS Hook的方式也不一定就是安全的,因为在应用程序级别上进行网络访问控制还是粒度太粗,如果使用rootkit工具将木马注入到防火墙允许访问网络的程序的进程中,就可以在防火墙眼皮底下堂而皇之地访问网络了,比如IE的一些BHO插件就是这么干得。
附录: 驱动加载测试工具以及bypass驱动的使用方法
首先将hook_test.sys复制到windows的系统驱动程序目录中(如果是windows xp的系统,这个目录可能是c:\windows\system32\drivers),然后运行drv_test.exe,在驱动文件位置中填入驱动文件hook_test.sys的完整路径名,在驱动名称中填入驱动名称,这个比较重要,因为后面的启动、停止和卸载驱动都需要这个驱动名称,不过不一定是“hook_test”,显示名称随便填写就行了。输入完成后首先点击“安装驱动”按钮安装驱动,如果没有错误再点击“启动驱动”按钮启动这个驱动程序,然后就可以测试你的防火墙软件了。测试的方法很简单,就是运行一个访问网络的程序,如果防火墙有效,会提示是否阻止程序访问网络,如果防火墙失效,则没有任何提示,卸载驱动先点击“停止驱动”按钮,然后点击“卸载驱动”按钮就可以了。