当你听到“”这个词的时间想到了什么?对于强密码、缓冲溢出和加密之类的措施,你是怎么认为的?当然,对于安全来说,它们都是重要的组成部分。但是,这些因素仅仅是整体中的一部分。
安全并没有表面看上去那么简单。安全不是一种你可以购买的现成产品,或者仅仅靠检查清单中的所有设备就可以完成的任务。安全需要持续不断的努力才能防止来自恶意的攻击,保护自身和设备的安全防范黑客带来的问题并不是有规律的,很可能纯属偶然。
在安全问题上,也不要使用那些愚蠢的技巧,它们可能会导致隐私的意外泄露。以政府机构为例,它们经常意外地在上公布秘密政策或在和大家共享文件前利用一个单独的文档层来“隐藏”信息。千万不要忘记安全的第一禁止项目:将密码写在便条上,并贴在显示器的表面(甚至在键盘的下面)。当然,它是不会给利用网络进行破解的人带来帮助,但却会给来自下一个房间的人提供入口。
所有这一切加在一起让人们拥有了一条重要的认识:如果要从全方位的角度了解可以对安全造成威胁的潜在因素的话,你需要打破常规,进行“创造性思考”。技术熟练的安全黑客,可以发现漏洞并针对这些漏洞开发出新的应用,通过外部处理的方法进行攻击。正如亚历山大大帝解决戈尔迪乌姆结时所做的,安全黑客可以通过拒绝遵循和其它人一样规则的方式来进行攻击。为了维护安全,我们制定了规则,但由于在无意中造成了一个常见的漏洞,这样做的结果却往往会导致失败;由于我们拒绝从外部的角度来进行处理,结果就是边界和广大的外部世界都被忽视了。
这么说并不意味着在内部进行处理就一定是错的。它的意思是如果我们不承认在系统外部还有可以造成影响的环境的话,就不能消除恶意安全黑客带来的影响,系统外部的问题也需要进行处理。
一个简单的例子就是人们往往过于关注内部处理,而无视对于安全问题来说是需要分门别类解决的情况。你认为什么样的漏洞是安全漏洞?什么样的漏洞不是安全漏洞?显然,缓冲区溢出导致出现允许任意数据写入可执行内存的问题是一个安全漏洞——但对于稳定问题来说呢,它是不是?
你认为在Windows系统中一次又一次的运行应用程序时,内存泄漏导致所有内存都被消耗完的情况,是否属于安全问题?它只是在程序运行中留下自己的痕迹,可以一直持续到系统运行速度进一步下降,最终不得不重新启动为止。但从另一方面来看,一旦内存耗尽,数据将开始写入页面文件。如果应用程序正在处理一些敏感的私人数据的话,它可以会被写入到硬盘上的页面文件并且被遗忘在那里。在计算机重新启动多次后,它也有可能还在硬盘驱动器上的某处。
什么样的严重漏洞会导致应用无法运行?当然,这可能仅仅会让人感到懊恼,真是这样么?由于在应用崩溃前没有机会保存数据,你损失了半个小时的工作成果。另一方面,有些时间恶意安全黑客想做的并不是其它事情,仅仅就是破坏你的软件,让其崩溃。所谓的拒绝服务(DoS)攻击就是这种类型的安全问题。
但是,事情也有可能变得更坏。在这里再次提到,当应用程序处理敏感数据时,存在的漏洞可能比你想到的更多。如果应用程序将一个核心转储文件保存在本地硬盘驱动器上导致恶意安全黑客更容易访问,或者数据仅仅保存在易失性器中时,应该怎么办?现在你要担心的不仅仅是丧失工作成果了,因为有人已经决定利用应用程序中存在的漏洞进行攻击了,在攻击之后甚至可能还会有人访问你的工作成果。
当你在使用应用程序处理敏感数据时,整个却崩溃了,这时间应该怎么处理?人们认为在计算机关闭的时间随机存取存储器(RAM)会清除所有的数据,但实际情况是,RAM对数据进行清理需要一些时间,只有这样才能实现完全清除。如果应用程序在操作系统崩溃的时间没有机会要求内存清理数据的话,在事后的几分钟里内存中还可能保存有正在进行处理的敏感数据。这时间,如果你上洗手间的话,其它人就可能利用工具来读取RAM中的内容。应用程序本身可能没有可利用的漏洞,但这肯定是一个可以利用的本地漏洞。
现实世界中,在通常情况下系统漏洞看起来和安全没有什么联系,但却往往可以在安全方面造成令人震惊的后果。关于此类事件就有两个典型的例子,一个就是空中交通管制系统的崩溃,另一个是餐馆被烧毁:
Ø 在2004年,位于加利福尼亚州的一台微软Windows新出现错误,导致整个空中交通管制系统崩溃,近800架飞机延误航班。实际上,这仅仅是一个稳定的问题,因为该系统设定为没有在“安全”时间之前正常重新启动的话,50天后系统将关闭。如果不是运气好的话,这很有可能造成有史以来最严重的商业航空灾害。
Ø 2009年10月,加利福尼亚州圣罗莎一家咖啡馆发生的火灾看起来就象是微软的Windows更新导致的。事故中没有出现人员伤亡,但整座建筑被彻底烧毁了。同样,从传统角度来看,它不是安全方面的问题,缓冲区溢出或不必要网络端口的开放才是一个安全问题,但生命确实因为意外行为受到了威胁。
当人们注意到这两个例子中存在的各种问题时,故意引起火灾或危害满载乘客的客机是否应该被当作安全问题呢?在这种情况下,它从开始就应该是一个安全问题,因为从防范攻击保证安全的角度来看,最好的处理办法就是避免它。等到有人发现没有立即与安全产生关联的安全事件已经成为威胁生命的问题后才进行处理,对于系统保护来说,是一种非常短视的方式。
我们建立边界以便进行内部处理,因为这样才能从总体的角度讨论问题。但这并不意味着我们应该假装这些边界是不可逾越的。仅仅按照预定方式使用现有的工具,是非常简单的事情,但这也有可能让我们对来自外部的威胁视而不见。当我们努力保护自己的努力成果不被其它人破坏时,千万不要忽视这种危险的可能性。
你不必一定要从外部处理问题,但至少应该承认它们的存在;那些愿意打破规则的人,在摧毁我们所有努力的时间,是不会被这些边界所牵制的。