1.1 理解安全

世上所有生命体都会本能地远离风险。在面对攻击行为时,他们也都会采取自卫手段,并且躲进他们能够找到的安全港湾。我们与生俱来的生理安全本能在发挥作用时何其伟大,体会到这一点非常重要。与之形成鲜明对比的是,我们在虚拟世界中应对风险的本能付之阙如,攻击者制造虚假信号则易如反掌。在从技术的角度诠释安全之前,我们思考一下在现实世界中人们会采取什么行为(读者很快就会看到,在数字世界,我们需要一套全新的技能来应对风险)。

下面是一则关于汽车销售员的真实故事。在让一位客户进行试驾之后,这位汽车销售员和客户回到了汽车销售点。当汽车销售员下车后,他还在和客户交流,但是同时他已经绕到了车前。“在我看到他眼睛的时候,”这位汽车销售员回忆道,“我当时就想,我的天哪,这个人想偷我的车。”事情转瞬之间发生了:这位假扮成客户的偷车贼挂上前进挡并踩下了油门,与此同时汽车销售员立刻趴在了汽车的引擎盖上。偷车贼疯狂驾驶也不能把汽车销售员从引擎盖上摔下去(好在这位汽车销售员并无大碍,偷车贼也很快被绳之以法,并且被勒令赔偿损失)。

两个人目光交错之际,汽车销售员脑海中就已经在对风险进行某种微妙的计算。电光石火之间,这位汽车销售员已经处理了复杂的视觉信号,他读取了客户的面部表情和肢体语言,明确得出了这位客户要采取攻击行为的结论。现在我们想象一下,当这位汽车销售员成为鱼叉式网络钓鱼攻击(这是一种向特定目标群体(而不是普罗大众)发送欺诈邮件的攻击方式)的目标时会做出什么反应。在数字世界里,因为他无法和攻击者面对面来获得那些重要的信号,所以让他上当就会容易得多。

说到信息安全、计算机、网络和软件,如果我们想要保护数字系统的安全,就必须进行分析和思考来评估我们所面临的风险。虽然比特和代码既无形,也无声,更无味,但这绝不应该妨碍我们努力评估安全风险。每当在线查看数据的时候,我们都是在使用软件把信息用适合人类阅读的格式显示出来。一般来说,在我们和真实的比特之间有不少代码在对信息进行诠释。其实,这还真如镜花水月一般,所以我们必须信任自己使用的工具,相信它们让自己看到的代码就是真实的信息。

软件安全的核心目标是保护数字资产,让它们不会受到各种威胁的侵害。本章会介绍一系列基本安全原则,这些原则在很大程度上推动了软件安全的实现。如果我们从这些重要的原则入手来分析系统,就可以看到漏洞是如何渗透到软件当中的,同时也可以意识到如何才能积极避免和缓解这些问题。这些基本原则以及本书后续章节要介绍的一些设计方法不仅适用于软件领域,也同样适用于设计和管理自行车锁、银行金库或者监狱等。

“信息安全”这个专有名词专门指代数据的保护和访问权限的授予。软件安全则是一个比较宽泛的概念,软件安全专注于可靠软件系统的设计、实施和操作,包括使其通过可靠的方式来实现信息安全。