既然对功能锁定已经有了一个基本的理解,现在读者可能会疑惑它是如何与计算机和网络产生关联的。 许多人把诸如漏洞扫描器和反病毒软件这样的安全产品看成是能够增加系统或组织安全性的工具。但是,如果这只是你的唯一观点,就有可能遇到功能锁定问题。这类技术的每一个都可能非常复杂,由数千行代码组成。在一个环境中引进它们同时也引进了很大的出现新的漏洞和攻击表面的可能性。 以早年的漏洞扫描器为例,我在自己所在公司的内部网络上设置了一些特殊的系统。这些系统是恶意服务器,目的是攻击当前大多数流行的漏洞扫描器中的客户端漏洞。当时我并没有意识到客户端的漏洞攻击在几年后的恶意软件感染中将会非常频繁地出现。 例如,ISS扫描器将连接到一个远程系统上的指名服务(finger service),以收集远程系统信息。但是,这个扫描软件在它的其中一个安全测试中出现了一个典型问题:这个程序没有检查返回信息的长度,而是盲目地把它复制到一个固定长度的缓冲区。这就在程序堆栈上产生了一种很普通的缓冲区溢出。知道了这个扫描器的这个弱点,并且知道了这个扫描器所运行的系统架构之后,我对恶意服务器进行了设置,以攻击这个漏洞。 当我所在的公司将要接受年度审核时,作为审核者的评估工作的一部分,将从审核者所带入并连接到公司内部网络的笔记本电脑上运行网络漏洞扫描。当这个扫描器最终遇到我的其中一个恶意服务器时,扫描系统本身由于扫描软件的这个漏洞而遭到攻击。 这常常导致很幽默的场景,它为公司的领导层提供了一些借口回应审核人员。由于被攻击的审核系统通常要对多个客户进行审核,因此我们可以用这个审核系统所暴露的其他公司的审核信息来忽悠他们。公司的领导层可以理直气壮地声称,在我们的内部系统中所找到的漏洞(隐藏在防火墙和其他防御技术的后面)相比审核人员向竞争对手泄露敏感信息而言实在算不上什么风险,而且它本身很可能是审核人员所使用的“安全软件”所造成的。功能锁定可能导致人们忘了安全检查软件本身的安全。 遗憾的是,现代的反病毒软件已经被发现包含了各种类型的常见编程漏洞,例如局部缓冲区溢出、未检查的执行功能以及在自动更新活动中缺乏认证等。因此,安全软件也可能为攻击者开启大门,而不是起到防御作用。 前面的例子是功能锁定的简单例子,可以归结于我在习得性无助这一节中所讨论的无从选择。但是,还存在更为微妙的例子。