第2章 威胁
威胁常常比事件本身更加可怖。——索尔·阿林斯基
威胁无处不在。不过,如果妥善管理,我们也可以安然与威胁共存。软件安全其实并没有什么不同之处,只不过我们自己没有几百万年进化而来的本能来防御软件方面的威胁。这也就是为什么我们需要树立软件安全的意识,为此我们必须把视角从软件构建者转向攻击者。理解一个系统的潜在风险是一切的起点,我们应该从这一点出发,在软件设计中加入可靠的防御和缓解措施。不过,要想在第一时间意识到这些风险的存在,我们暂且不要思考那些经典的使用案例,也不要按照设计功能来使用软件。我们必须首先看清软件的本质:它是由一堆代码和组件构成的,这些代码和组件承担着数据处理和存储的职责。
我们以曲别针为例,曲别针是一个设计十分巧妙的工具,它可以把一沓纸夹在一起。不过,曲别针本身也可以掰成一根笔直的铁丝。典型的安全意识就是,我们应该意识到犯罪分子可以把曲别针掰成铁丝,再把这根铁丝插进钥匙孔里、拨开锁扣,然后推门而入。
这里需要强调的是,威胁包含各种可以带来伤害的方式。刻意发动的对抗性攻击行为固然是我们探讨的重点,但是我们也绝对不能忽视因软件错误、人为错误、意外事故和硬件故障等问题导致的威胁。
威胁建模可以为我们提供一个视角,让我们可以在整个软件开发过程中做出足以影响全局的安全性决策。后文介绍的处理方法强调的是概念和原则,而不会把重点放在威胁建模的具体方法上。微软公司在21世纪初采用的早期威胁建模行之有效,但是需要对安全人员进行大量的培训,也需要安全人员付出巨大的努力。好在威胁建模的方式本身就很丰富,一旦理解了基本概念,人们很容易就可以对自己的威胁建模流程加以调整,从而利用有限的时间和精力,得到合理的回报。
我们当然很难穷举大型软件系统的所有威胁和漏洞。因此,高明的安全工作是逐步提高标准,而不是追求尽善尽美。我们可以首先找出一些潜在的风险,然后缓解其中的一部分问题。即便如此,那也意味着做出了一定的改进。这样的做法或许就有可能避免出现重大的安全事件,这已经是不容小觑的成就了。不过,我们恐怕从来都对那些遭到挫败的攻击一无所知,而缺乏反馈机制往往会让人倍感失望。可以说,我们展现出来的安全意识越强,我们就可以看到越多的威胁。
最后,理解威胁建模可以让我们把视野从安全性上扩展出去,从而重新审视我们的目标系统。如果我们通过新的方式对软件加以检视,就可以更加深入地发现改进、提升、简化软件的机会,也可以发现那些与安全性无关的新特性。