刚从图书馆拿到这本书时,觉得有点不可思议,一本才200页的书有20页类似于序的开场,大多都是很高的评价,封面有Oracle公司首席安全官的高见,他说“软件安全测试真的是一门艺术,本书用大量数字形象地描述的、原汁原味的、恰到好处的破坏性安全测试:证明了“一盎司”的创造性破坏活动需要后期付出“一磅”的修补工作来弥补。”因此,带着一份崇敬开始了阅读第一本安全测试的书。

  第一章从1-14页,讨论通过设法攻破软件来促进软件安全的有关话题。其中印象深的是说安全测试人员不仅应该把自己当做一名验证者,还应该把自己当做一名攻击者,也是必须进行一些探测工作,以判定应用程序薄弱的部分,并设计响应的攻击。要坚持编写安全要求和攻击用例,要尝试强制软件执行那些它的设计中没有的动作。安全测试的基本过程可以简单的归纳为以下四个步骤:(1)使用所有你具备的资源,列出应用程序的输入或“攻击面”。(2)建立威胁模型,将程序组件从高风险到低风险排序。(3)通过“故障注入”,使用常见的“攻击模式”去攻击应用程序的“攻击面”。(4)审查系统,查找常见的“安全设计错误”。

  第二章是从15-45页,章节标题是“漏洞是怎样藏到软件中的”,一看到这个题目觉得很想继续读下去,深刻的体会是思维的转变真的很重要。这一章对各种安全漏洞进行讨论,并探讨如何防止这些漏洞偷偷藏到我们的程序中。所有的软件都存在潜伏的漏洞,给足够的时间,没有找不出安全缺陷的超凡程序。然而,大多数开发人员都极其不信自己的软件中存在任何安全问题,同样,这将能把你的思维方式从“假设软件是安全的”转变为“安全比粗经过证明”。软件安全漏洞分为两个部分:设计漏洞和实现漏洞。设计漏洞是一种设计错误,它使得程序不可能安全运转,而无论代码编写人员实现得多么好都无济于事。与之不同,实现漏洞是软件实际编码中存在的安全错误引起的。常见的安全设计问题如:密码技术使用的败笔,对用户及其许可权限进行跟踪,有缺陷的输入验证,薄弱的结构性安全等;编程语言实现问题如:C语言没有安全的本地字符串类型,也没有安全而易用的字符串处理函数,缓冲区超限会覆盖栈中的函数返回地址,整数溢出等。软件安全是复杂而难以捉摸的,需要在多种技术上获得成功,在多数测试用例中,要对数据输入、数据内容和数据长度进行检验,并验证数据转换的有效性。

  第三章从46-60页,描述的是安全的软件开发生命周期,这与我之前在2.3节中提到的内容有相似的地方,这里将软件安全测试周期分为六个部分:阶段一是安全原则、规则及规章,阶段二是安全需求,阶段三是架构和设计评审/威胁建模,阶段四是安全的编码原则,阶段五是白盒/黑盒/灰盒测试,阶段六是判定可利用性。另外,除了这里所提及到的安全的软件开发生命周期以外,还应该有一个的补丁管理过程。

  第四章从61-76页,这一章是在实际工作中,非常有用的一部分。章节前Chris Wysopal的话十分准确地概括了本章的内容“关注那些攻击难度低而影响大的领域”。要进行威胁建模,必须熟悉程序的设计,要知道了程序的每一个访问入口点位置,这样,才能理解并描绘出程序的“攻击面”。在完成了设计数据收集,并观察了应用程序的攻击面之后,可以接着跟踪应用程序组件数据流,从而揭示程序的高风险区域。这些正是我们在测试中重点关注的地方,我们还可以通过审查来发现一些明显的安全弱点,比如管理接口上没有执行身份鉴别或者会话标识符没有进行加密。威胁建模一共有四个主要步骤:(1)识别威胁路径(2)识别威胁(3)识别漏洞(4)将漏洞分级/排定优先级。这一章告诉了我们威胁建模的流程。