测试方从程序员的角度阐述了理想个人防火墙的设计。首先,理想的个人防火墙必须是安全的。所以这里只谈论安全性,而如易用性等方面则不涉及。
内核驱动
第一部分是内核驱动。它有两个主要功能,所以这也是为何它通常作为两个组件而不是一个组件来实现的原因。第一个功能就是包过滤器。通常在NIDS,TDI或同时在这两个级别,驱动会检查每一个进入或出网的数据包。这也称为入站出站连接保护。有些防火墙并没有实现入站和出站的连接保护功能,但它仍然具有内核驱动,这是因为它们具有第二个功能。第二个功能称为沙箱。实现沙箱的最普通方法就是SSDT钩子和SSDT GDI钩子。防火墙驱动的功能取代了某些系统功能来验证调用应用程序或拒绝某个动作或把执行传给原来代码的权利。这些方法允许防火墙控制所有可能的危险活动,这些活动如尝试打开文件,运行进程,注册键值,修改防火墙设置,自动响应查询等。
系统服务
存在称为系统服务的特别用户模式进程。这些进程在系统中有特别的功能与行为。它们运行在特权系统帐户中,而不是在普通用户帐户。这就允许服务独立于用户运行,甚至在没有用户登录的情况下也能够运行。个人防火墙中服务的角色就是要保证主要组件间通讯的安全。服务从GUI(图形用户接口)和内核驱动中接收信息并互相转发这些信息。例如,如果防火墙实在学习模式中时,在钩子SSDT函数中的驱动代码就可能会不能够判断是否允许还是拒绝某个行为,因为在数据库中没有相应的行为规则。在这种情况下就需要用户的参与了。这就需要向GUI发送一条信息来显示对话框并准备接收从对话框返回的回复。这个通讯通常由服务组件实现。有时这个防火墙服务用于确保GUI可用。
图形用户接口
图形用户接口是防火墙的用户部分。它通常提供了一个用户管理防火墙的系统托盘图标。GUI另外一个重要功能是询问用户针对某个行为的选择情况,这通常都发生在学习模式。
自我保护
不单是对个人防火墙,对所有安全产品来说这个都是首要规则。不管功能如何完美,一旦防火墙不能自我保护,一切都是白搭。如果某个恶意活动能够关闭,禁用或破坏防火墙,那么跟没有防火墙没有任何区别。防火墙的所有部分都应该实现保护,这些方面有防火墙进程,文件,注册表入口,驱动,服务和其它系统资源与对象。
验证自身组件
对自身组件的验证跟上面提到的自我保护很像。防火墙是一个复制的程序,它们通常都由多个模块或组件组成。在这些情况下,有一些主要模块是由操作系统执行的。在启动或这些模块运行过程中,这些模块会加载防火墙的其它模块。这就是通常所说的模块动态加载。对动态加载的模块进行完整性检查显得非常必要。这意味着,完整性检查程序必须要在其中一个主要模块中实现。
入站出站保护
这方面在前面已经提到。
进程保护
每个特权进行都要保护免受若干危险行为的威胁。首先,没有恶意程序能够结束这个进程。第二,必须保证其代码或数据不被修改。第三,它必须不能在任何特权进程上下文中被执行。这方面通常包括DLL注入。
文件与组件保护
文件保护与进程保护非常接近。如果一个恶意代码能够覆盖特权应用程序的文件,那么这就等于在它们运行时修改它们的代码流。有两种方法实现文件保护。第一种方法(主动保护)是要防止对属于特权应用程序的文件进行写或删除的访问。因为这种方法难以实现,所以程序员选择了第二种方法:检查组件的完整性(组件保护)。在这种情况下,防火墙是允许恶意代码破坏或覆盖特权应用程序文件的。一旦这样的应用程序运行,防火墙的组件就会停止它的运行或向用户报告。所有的系统文件也需要提供文件保护。
驱动保护
Windows操作系统信任它的驱动程序。这就意味着,所有由驱动程序运行的代码都是被信任的,因此允许执行那些保护的处理器指令并且能够访问所有的系统资源。这就是为何有必要把部分如个人防火墙这些安全软件作为系统驱动来实行。而且,这也是为何需要控制新驱动的加载和保护存在的驱动程序。恶意软件必须不能安装驱动程序或者修改现有的驱动程序。
服务保护
由于防火墙的一部分通常作为系统服务来运行,因此对系统服务的保护也显得很有必要。但要保护的不单是防火墙组件。对于恶意软件来说,安装一个服务是持久存在系统中的一个简便方法,因为系统服务能够设置为每次启动时运行。此外,一个恶意服务是危险的还因为它甚至还能在没有用户登录的情况下运行。建立,删除和控制系统服务的功能必须得到保护。
注册表保护
Windows的注册表保护了很多重要的系统信息。通过注册表可以改变系统组件的设置。对系统注册表的某个不正确修改可能会导致系统不稳定或者甚至造成系统不能启动。有很多注册表键与值应该保护避免恶意软件的修改。
其它系统资源的保护
Windows操作系统中还存在很多不同的系统资源与对象。如果某些被恶意软件控制了,那将会是一件危险的事。这些对象中比较有名的一个就是在“\Device\PhysicalMemory”部分,如果这些部分没有受到保护,那么就有可能被利用来获得整个系统的控制权。防火墙必须保护这些会被误用的资源。
父进程控制
上面已经提到过保护特权进程的必要性。可能实现进程保护的最简单方法是控制进程与线程的打开。然而,如果进程保护是按这种方式实现的话,那么实现父进程控制也显得非常重要了。系统中的每个进程都由其父进程创建。父进程在创建子进程后都会有两个句柄。这些是进程对象与主线程的句柄。这给定的进程句柄以具有完全的访问能力的被打开,因此父进程能够完全的控制子进程。此外,尽管防火墙的设计并不会保护那些通过打开进程和线程控制的进程,但是父进程的控制还是应该实现。某些特权指令如果在命令行参数模式下运行,那么它们有可能会被误用来执行特权行为。很多防火墙都不会区分特权与非特权进程。它们通常都限制进程的创建,所以只有那些先前选择的进程才能创建子进程。
自动启动程序的控制
防火墙应该对那些当系统重启后仍然能在系统中持久存在的地方提供保护。如果允许运行新的不明应用程序,那么就不可能阻止恶意程序在系统中运行了。防火墙能够限制恶意应用程序的行动,因此它们不能破坏系统。然而,如果恶意程序能够持久的存在于系统中时,那么当有新的安全漏洞出现时它就有可能破坏系统了。这也就是为什么防火墙应该控制那些在每次系统重启或用户登录时自动运行的程序。
嗅听保护
像键盘记录程序和包嗅听程序等间谍软件都是危险的应用程序,因为它们都能用于窃取用户的密码等敏感信息。但是,这些恶意软件的目标不单是密码,个人信息,商业文档等都是应该保护的对象。
系统资源的保护
任何系统的资源都是有限资源。Windows工作站能够处理几千个对象,这个数字对于普通用户来说已经足够了。然而,如果一个恶意软件创建了几千个线程,那么系统就变得没用了,并因此会引起DoS拒绝服务攻击。防火墙应该限制非特权应用程序以免发生DoS。
不要ring3钩子
Ring3(或用户模式)钩子是一个用于实现个人防火墙或其组件的技术。然而,ring3钩子只用于特别的功能并且从来不用于高安全的功能。用ring3钩子实现的保护功能能够被恶意软件轻易的绕开。Ring3钩子千万不要用于限制不明应用程序行为方面。它们可以用在那些非常罕有的修改或控制那些保证不会绕过ring3钩子的特权应用程序。
最后,测试方还进行了防火墙的泄漏测试。泄漏测试是细小的,非破坏性的由安全专家设计的程序,它用于故意绕开防火墙的安全措施。其后的用意却非常的简单:如果这个测试能够绕开电脑的安全防御,那么黑客就更不用说的。这种技术不会对电脑造成损害,它只是模拟间谍软件和木马程序所使用的技术而已。Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1111228