2.1 对抗性视角
利用漏洞的行为是我们在现实世界中接触过的、最接近“魔法咒语”的东西。首先我们组织正确的咒语,然后对设备执行远程控制。——霍尔弗·弗莱克
人类肇事者才是万恶之源。安全事件不会自己无缘无故地发生。因此,只要对软件安全性进行协同分析,就一定要考虑可能的对手会进行什么样的尝试,这样才能预测和防御潜在的攻击。攻击者都是杂牌军,从脚本小子(只能使用自动化恶意软件,没有技术能力的攻击者)到掌握高端技术的国际黑客不一而足。能够在某种程度上站在对手的角度进行思考固然是件好事,但是不要自欺欺人地认为自己可以准确地预测对手的一举一动,也不要花费大量时间和精力去猜测他们的具体想法,更不要自以为是永远比对手棋高一着的名侦探。了解攻击者的思考方式的确有其价值,但我们的目标是开发安全软件,所以攻击者具体会通过什么技术手段来探测、渗透和泄露数据无关紧要。
我们有必要思考系统中最核心的目标是什么(在有些情况下,对手认为价值连城的数据对你来说实际上并没有那么高的价值),然后确保高价值资产能够得到妥善的保护,但不要浪费时间去做攻击者肚子里的蛔虫。攻击者可不会白白浪费精力,他们一般都会把注意力放在那些最薄弱的环节上,以便可以顺利完成他们的任务(他们也有可能漫无目的地四处尝试,但这种行为很难防御,因为这些行为目的并不明确、随意性很强)。软件错误绝对是攻击者重点关注的对象,因为它们往往就是软件的弱点所在。攻击者如果偶然发现了某些明显的软件错误,他们就会尝试创建一些变体,看看能不能造成实实在在的破坏。那些可以导致系统内部详情泄露的错误(例如,详细的堆栈转储)对攻击者的吸引力尤大。
一旦攻击者发现了漏洞,他们就很有可能把更多时间和精力放在这个漏洞上,因为很多瑕疵都可以被攻击者借助协同攻击扩展出严重的后果(本书第 8 章还会介绍这方面的详细信息)。一般来说,两项几乎不会引人注意的细微漏洞如果结合在一起,就可以制造出一次重大的攻击,因此我们应该严肃对待一切漏洞。虽然攻击者没有内部信息(至少在执行渗透之前是没有的),但是掌握攻击技术的人绝对了解威胁建模的手段。
尽管我们永远都无法真正预判对手会把时间花在哪个环节上,但是我们仍然应该思考一下攻击者的动机,这是判断软件是否会受到严重攻击的一项标准。这其实和一位著名的抢劫犯在解释其抢劫银行的原因(因为那里有钱)的道理类似。这里的重点在于,攻击一个系统可能获得的收益越高,人们就越有可能应用更多的技术和资源来对这个系统发起攻击。虽然这只能作为一种推断,但这种分析方法可以作为一个相对的指导方针:政府、军方、大型企业和金融机构的系统都是重大的攻击目标,而你保存爱宠照片的那个硬盘分区应该不是。
最后,与一切形式的攻击行为一样,攻击的难度总是小于抵御攻击的难度。攻击者只需要选择好切入点,然后下定决心去利用尽可能多的漏洞就可以了,因为攻击者其实只需要成功一次就够了。这些都表明了优先考虑安全工作的原因,防守方需要善加利用所有可用的优势。