级别: 初级 Gary McGraw (gem@cigital.com), 负责企业技术的副总裁, Cigital John Viega (viega@cigital.com), 资深副研究员兼顾问, Cigital
2000 年 11 月 01 日 在本系列文章中,Gary 与 John 给出了设计与构建安全系统时要牢记的最重要的 10 个要点。
第一部分探讨了加固系统最薄弱部分的重要性。这次,他们论述接下来的两个原则:
纵深防御(它提倡使用多重防御策略)以及
保护故障(其观点是系统故障并不一定等同于系统脆弱)。
在本系列中,我们给出了一套可以帮助您克服代码中大多数安全性问题的原则。
上次,我们谈到了如何标识及保护系统中最薄弱的环节。这次,我们研究提供冗余安全性措施是多么重要以及为什么应该当心不要在部分系统出现故障时依赖不安全的行为。
原则 2:纵深防御
纵深防御背后的思想是:使用多重防御策略来管理风险,以便在一层防御不够时,在理想情况下,另一层防御将会阻止完全的破坏。即便是在安全性社区以外,这一原则也是众所周知的;例如,这是编程语言设计的著名原则: 纵深防御:采取一系列防御,以便在一层防御不能抓住错误时,另一层防御将可能抓住它。(摘自 Bruce MacLennan 的
Principles
of Programming Languages。参阅
参考资料。)
让我们回到为银行提供安全性的示例。为什么典型的银行比典型的便利店更安全?因为有许多冗余的安全性措施保护银行 ― 措施越多,它就越安全。单单安全摄像机通常就足以成为一种威慑。但如果攻击者并不在乎这些摄像机,那么安全保卫就将在那儿实际保护银行。两名安全保卫甚至将提供更多的保护。但如果两名保卫都被蒙面匪徒枪杀,那么至少还有一层防弹玻璃以及电子门锁来保护银行出纳员。如果强盗碰巧砸开了这些门或者猜出了 PIN,起码强盗将只能容易抢劫现金出纳机,因为我们有保险库来保护余下部分。理想情况下,保险库由几个锁保护,没有两个很少同时在银行的人在场是不能被打开的。至于现金出纳机,可以为其装备使钞票留下印记的喷色装置。
当然,配备所有这些安全性措施并不能确保银行永远不会遭到成功的抢劫。即便在具备这么多安全性的银行,也确实会发生银行抢劫。然而,很清楚,所有这些防御措施加起来会形成一个比任何单一防御措施有效得多的安全性系统。
这好象同先前的原则有些矛盾,因为我们实质上是在说:多重防御比最坚固的环节还要坚固。然而,这并不矛盾;“保护最薄弱环节”的原则适用于组件具有不重叠的安全性功能的时候。但当涉及到冗余的安全性措施时,所提供的整体保护比任意单个组件提供的保护要强得多,确实是可能的。
一个好的现实示例是保护在企业系统不同服务器组件间传递的数据,其中纵深防御会非常有用,但却很少应用。大部分公司建立企业级的防火墙来阻止入侵者侵入。然后这些公司假定防火墙已经足够,并且让其应用程序服务器不受阻碍地同数据库“交谈”。如果数据非常重要,那么如果攻击者设法穿透了防火墙会发生什么呢?如果对数据也进行了加密,那么攻击者在不破解加密,或者(更可能是)侵入存储未加密形式的数据的服务器之一的情况下,将不能获取数据。如果我们正好在应用程序周围建立另一道防火墙,我们就能够保护我们免遭穿透了企业防火墙的人攻击。那么他们就不得不在应用程序网络显式输出的一些服务中寻找缺陷;我们要紧紧掌握那些信息。
原则 3:保护故障
任何十分复杂的系统都会有故障方式。这是很难避免的。可以避免的是同故障有关的安全性问题。问题是:许多系统以各种形式出现故障时,它们都归结为不安全行为。在这样的系统中,攻击者只需造成恰当类型的故障,或者等待恰当类型的故障发生。
我们听说过的最好的现实示例是将现实世界同电子世界连接起来的示例 ― 信用卡认证。诸如 Visa 和 MasterCard 这样的大型信用卡公司在认证技术上花费巨资以防止信用卡欺诈。最明显地,无论您什么时候去商店购物,供应商都会在连接到信用卡公司的设备上刷您的卡。信用卡公司检查以确定该卡是否属被盗。更令人惊讶的是,信用卡公司在您最近购物的环境下分析您的购物请求,并将该模式同您消费习惯的总体趋势进行比较。如果其引擎察觉到任何十分值得怀疑的情况,它就会拒绝这笔交易。
从安全性观点来看,这一方案给人的印象十分深刻 ― 直到您注意到某些事情出错时所发生的情况。如果信用卡的磁条被去磁会怎样呢?供应商会不得不说:“抱歉,因为磁条破了,您的卡无效。”吗?不。信用卡公司还向供应商提供了创建您卡的标记的手工机器,供应商可以将其送给信用卡公司以便结帐。如果您有一张偷来的卡,那么可能根本不会进行认证。店主甚至可能不会向您要您的 ID。
在手工系统中一直有某些安全性所示,但现在没了。在计算机网络出现以前,可能会要您的 ID 以确保该卡同您的驾驶证相匹配。另外需要注意的是,如果您的号码出现在当地定期更新的坏卡列表之内,那么该卡将被没收。而且供应商还将可能核查您的签名。电子系统一投入使用,这些技术实际上就再也不是必需的了。如果电子系统出现故障,那么在极少见的情况下,会重新使用这些技术。然而,实际不会使用这些技术。信用卡公司觉得:故障是信用卡系统中十分少见的情形,以致于不要求供应商在发生故障时记住复杂的过程。
系统出现故障时,系统的行为没有通常的行为安全。遗憾的是,系统故障很容易引起。例如,很容易通过将偷来的信用卡在一块大的磁铁上扫一下来毁坏其磁条。这么做,只要小偷将卡用于小额购买(大额购买经常要求更好的验证),他们就或多或少地生出了任意数目的金钱。从小偷的角度看,这一方案的优点是:故障很少会导致他们被抓获。有人可以长期用这种方法使用同一张卡,几乎没有什么风险。
为什么信用卡公司使用这种愚蠢落后的方案呢?答案是:这些公司善于风险管理。只要他们能够不停地大把赚钱,他们就可以承受相当大数量的欺诈。他们也知道阻止这种欺诈的成本是不值得的,因为实际发生的欺诈的数目相对较低。(包括成本和公关问题在内的许多因素影响这一决定。)
大量的其它例子出现在数字世界。经常因为需要支持不安全的旧版软件而出现问题。例如,比方说,您软件的原始版本十分“天真”,完全没有使用加密。现在您想修正这一问题,但您已建立了广大的用户基础。此外,您已部署了许多或许在长时间内都不会升级的服务器。更新更聪明的客户机和服务器需要同未使用新协议更新的较旧的客户机进行互操作。您希望强迫老用户升级,但您尚未为此做准备。没有指望老用户会占用户基础中如此大的一部分,以致于无论如何这将真的很麻烦。怎么办呢?让客户机和服务器检查它从对方收到的第一条消息,然后从中确定发生了什么事情。如果我们在同一段旧的软件“交谈”,那么我们就不执行加密。
遗憾的是,老谋深算的黑客可以在数据经过网络时,通过篡改数据来迫使两台新客户机都认为对方是旧客户机。更糟的是,在有了支持完全(双向)向后兼容性的同时仍无法消除该问题。
对这一问题的一种较好解决方案是从开始就采用强制升级方案进行设计;使客户机检测到服务器不再支持它。如果客户机可以安全地检索到补丁,它就升级。否则,它告诉用户他们必须手工获得一个新的副本。很遗憾,重要的是从一开始就应准备使用这一解决方案,除非您不在乎得罪您的早期用户。
远程方法调用(Remote Method invocation (RMI))的大多数实现都有类似的问题。当客户机和服务器想通过 RMI 通信,但服务器想使用 SSL 或一些其它加密协议时,客户机可能不支持服务器想用的协议。若是这样,客户机通常会在运行时从服务器下载适当的套接字实现。这形成了一个大的安全漏洞,因为下载加密接口时,还没有对服务器进行认证。攻击者可以假装成服务器,在每台客户机上安装他自己的套接字实现,即使是在客户机已经安装了正确的 SSL 类的情况下。问题是:如果客户机未能建立与缺省库的安全连接(故障),它将使用一个不可信实体给它的任何协议建立连接,因此也就扩展了信任范围。
下一次
在
下一部分中,我们将讨论十大设计原则中的另外两个。第一个是经典的原则 ―
最小特权原则,将访问权限限于执行任务所需的最小权限,并且该访问只延伸尽可能短的时间。第二个几乎众所周知 ―
分割原则,它指出应该通过在系统的各部分间构筑围墙来试图阻止破坏的扩散。
参考资料
作者简介  | 
|  | Gary
McGraw 是 Cigital(前身为 Reliable Software Technologies)负责企业技术的副总裁,该公司位于美国弗吉尼亚州杜勒斯(Dulles)。他从事咨询服务和研究工作,帮助决定技术研究和开发方向。McGraw 在 Cigital 从一个研究科学家做起,从事软件工程和计算机安全性方面的研究。他拥有印第安那大学认知科学和计算机科学双博士学位,弗吉尼亚大学的哲学学士学位。他为技术刊物撰写了 40 余篇经同行审查的文章,担任过主要的电子贸易供应商(包括 Visa 和 Federal Reserve)的顾问职务,并在空军研究实验室、DARPA、国家科学基金会以及 NIST 的高级技术项目赞助下担任首席调研员。可以通过
gem@cigital.com和他联系。
|
 | 
|  |
John
Viega 是一名高级副研究员,Software Security Group 的共同创始人,并担任 Cigital 的资深顾问。他是 DARPA 赞助的开发标准编程语言安全性扩展的首席调研员。John 已撰写了 30 余篇涉及软件安全性和测试领域的技术性文章。他负责在主要网络和电子贸易产品中查找一些众所周知的安全性弱点,包括最近对 Netscape 安全性的攻破。他还是开放源码软件社区的重要成员,编写过 Mailman、即 GNU Mailing List Manager 以及最近发布的 ITS4(一种在 C 和 C++ 代码中查找安全性弱点的工具)。Viega 拥有弗吉尼亚大学的计算机科学硕士学位。可以通过
viega@cigital.com和他联系。
|
对本文的评价
|