本书深入讲解软件安全方面最新的实用技术,用于在破坏之前预防并识别软件的安全问题。
本书作者具有近十年应用和渗透测试方面的经验,从简单的“验证”性测试方法讲起,进而介绍先发制人的“攻击”性测试方法。作者首先系统地回顾了软件中出现的设计和编码方面的安全漏洞,并提供了避免出现这些安全漏洞的实用指导。然后,向读者展示了定制用户化软件调试工具的方法,用以对任何程序的各个方面独立地进行测试,之后对结果进行分析,从而识别可被利用的安全漏洞。
主要内容
●如何从软件攻击者的角度来思考从而增强防御策略。
●兼顾成本效益,将安全测试整合到软件开发的生命周期。
●基于最高风险领域,使用威胁模型来排定测试的优先顺序。
●构建用于进行白盒测试、灰盒测试和黑盒测试的软件测试实验。
●针对每个测试工程,选用恰当的工具。
●执行当前主要的软件攻击,从故障注入到缓冲区溢出。
●哪些缺陷在现实世界中最可能被攻击者利用。
本书是每一个负责软件安全的技术人员必备的读物:无论是测试人员、QA专家、安全从业者、开发人员,还是其他相关的人员。对于IT管理人员,本书提供了经实践检验的行动计划,用于实现有效安全测试或加强现有测试流程。
无
随着针对计算机系统的威胁的逐步增长,许多组织和机构都在寻求一些解决方案,用以保护品牌资产价值和消费者的信心,并将维护费用减少到最低限度。
由于威胁来源的范围不断扩大,这种挑战也在不断增长。攻击者的目标始于基于UNIX系统的Internet服务,而后转向了基于Windows系统的PC。现在,他们开始瞄准了Apple公司的MacOS X系统、网络视频游戏控制台、无线手持设备甚至手机。只要一有软件漏洞曝光,通常用不了一个星期,黑客很快就会利用这个漏洞。而即使是脆弱期得以缩短(“window of vulnerability”这里译作“脆弱期”。这是来自军事领域的一个术语,是指一个期限,在这段时间内,防御措施或者缺失,或者被削弱或损坏。——译者注)从漏洞被曝光到软件供应商发布相应的安全补丁之前,这段时间仍然需要大约6个星期的时间\[1\]。
来自Symantec公司的报告显示,针对诸如防火墙和路由器这类传统安全设施展开的大型、多目标攻击正逐步淡出攻击者的关注重点。根据Symantec公司统计,2005年下半年报告的漏洞中有69%出自Web应用程序。
不同于以往,目前,攻击者的注意力集中于区域性目标、个人桌面计算机以及Web应用程序,这些目标都潜在存在着被攻击者窃取公司信息、个人信息、财务信息或机密信息的可能性。Symantec公司一份新的Internet安全威胁报告中列举了几种增长中的攻击者行为趋势,即:使用bot\[2\]网络;针对Web应用程序和Web浏览器的攻击,以及模块化恶意代码。
安全问题往往被转换为一个组织的收益或名誉损失。这些问题也会带来市场份额的丢失,对于具体组织的远景而言,这或许是至关重要的。据安全公司Counterpane Internet Security和MessageLabs估算,一段中度感染率的恶意软件会给一个小公司一年带来83 000美元的损失,而对于一个大公司来说,这笔损失可能达到100万美元或更多。他们补充说,这还只是直接损失,尚未包含诸如名誉损失之类的间接损失。\[3\]
Dave Cullinane是位于西雅图的财务公司Washington Mutual公司的首席信息安全官,他说:“如果你向Internet开放一个应用程序,供人们来理财,这个应用程序就将被探测(probe)”。Cullinane认为,这样的应用程序被攻破的后果不仅仅是财务损失,还将损坏公司的声誉。“声誉危机完全会导致破产。如果你报告出一起安全失效事件,就会有20%~45%的客户从你这里离开。”\[4\]处理信用卡交易的CardSystems系统,最近由于该软件让罪犯进入偷走了数百万客户的个人财务数据而停止了使用。那些购买了CardSystems系统的公司已被FTC(联邦贸易委员会)指令在未来20年中接受独立审计。
本书将探讨如何预防这种对敏感数据的不安全处理。具体而言,针对这种想定情况的测试将在第6章和第7章中讨论。
此外,如果这个公司把安全测试作为其软件研发过程的一部分,并学会如何检测这种情况的话,或许可以防止这场CardSystems灾难的发生。那时,检测出问题之后,该公司就可以采取本书所述的隐患消除步骤。切记,存储太多秘密完全是违反VISA信用卡的PCI(支付卡行业)规则的行为。这是应该贯彻的信用卡安全标准和信用卡安全策略要求,详细内容将在第3章中讨论。
据Gartner公司的研究表明,这种威胁是巨大的,70%的业务安全漏洞存在于应用层。而据Microsoft公司所做的研究,其中64%的自用商务软件开发人员承认他们对于编写安全的应用程序缺乏信心,这使得问题更加复杂。
及早开展安全测试,将有助于在很大范围内阻止来自现在和未来的威胁。保护客户数据(举例来说,包括在线交易中包含的个人信息)的安全性和完整性,对于保持客户的信赖是至关重要的。
本书致力于解决当前软件安全工程师、软件项目经理以及其他负责应用程序安全的软件从业人员所面临的这种亟待解决的问题。
这些专业人员从事系统的开发和部署工作。他们顶着完成安全的开发工作和升级合并工作的压力,以及在敌人破坏之前维护系统安全的压力。
本书的目标是指导从事软件构建和测试的工程师来为他们的客户提供保护,他们必须将安全测试贯穿整个开发过程。如果安全不能贯彻到整个开发的生命周期中的话,软件将不可避免地出现安全问题,这些问题将可能导致财务信息被窃、数据丢失、性能下降,并危及私人数据的安全。过去,软件供应商可能没有在安全测试上花太多精力而侥幸成功。他们只是简单地等待外部的研究人员或客户发现安全问题,而后报告给他们,然后他们修复这个问题并发布一个补丁程序。面对数百个不时要在数千台机器上测试和安装的补丁,企业客户都快被压垮了。
通过将安全测试环节补充到他们的开发过程中,软件开发人员能够将不良公众信息和非信任用户阻止在外。每家软件发行商都有一个质量保障过程,在这个过程中,他们的QA(质量保障)从业人员创建并执行测试,以验证软件的功能性。安全测试可以扩展这个过程,进而验证软件是否存在常见的各类安全漏洞。过去,一些较差的软件提供商因为总把他们的客户当作测试人员来用而受到责难。现在,那些没有开展安全测试的公司将他们的客户置于危险的境地,他们总在等外人自愿告诉他们其软件的安全问题。遗憾的是,不是每个人都是正直的人。有些人发现了软件中的安全问题却不会告诉该软件的供应商,反而可能会利用这些漏洞来窃取信息。
2005年12月,罪犯在俄罗斯利用IE浏览器中存在的一个叫做WMF的漏洞来攻破那些毫无戒心的Web冲浪者的计算机,并在其中安装bot软件。这影响到数千台计算机的攻击,其发生的主要原因之一就是这个漏洞发现后,在Microsoft公司制作出修补程序之前,漏洞就被大肆利用了。对于使用一份具有漏洞的软件的客户来说,脆弱期(漏洞从被发现到厂商提供出修补程序之前的这段时间)是最危险的时间。安全测试旨在消除这些软件安全漏洞。通过负责任的漏洞公布,脆弱期能够缩短。由于漏洞是被“坏蛋们”发现的,我们不能阻止脆弱期的存在,但我们可以预防漏洞本身的出现。
Internet上的攻击活动在近几年发生了变化,变得在本质上更加罪恶、更加阴险。三四年以前,利用软件漏洞的人大多热衷于借助攻击别人来为自己扬名,其手段通常是编写并发布病毒和蠕虫,而不是图财。当前的发展趋势是利用漏洞来为罪犯们收集银行、公司和政府的认证信息,然后用于犯罪。现在,当家庭计算机被攻破,它们往往被用于“钓鱼(phishing)”攻击或者传递垃圾信息。我们使用的软件并没有在安全质量相关方面得到极大的改进,而当前攻击者的动机却比以往更加明确,那就是谋财。
作为一名消费者,你应该要求你的软件供应商将安全性集成到他们的开发过程中,要求了解他们的过程和工具。如果这个软件是用于保护财务数据或其他敏感信息的,要求出示第三方对该供应商的软件安全质量评测结果。如果业界不能主动接受安全质量标准,或者不能通过政府强制执行安全质量标准的话,消费者就要考虑要求出示特定安全质量等级的证明。直到建筑检测人员确认该建筑物符合规范,人们才会住进这栋楼。汽车以及其他具有潜在危险性的产品同样也要求必须进行独立的安全测试。现在轮到软件消费者来进行这种测试了,更有可能是请可信的第三方来进行测试。然而,大多数公司只进行了非常有限的第三方应用程序安全测试。从前,这种测试是由联邦组织来完成的,但现在已经扩展到一些较大的金融机构或企业。但即便是这样,在这些机构或企业中,也缺少受过充分的黑盒安全测试训练的人员,从而并不能完全实施安全测试。由于软件厂商自身工作做得不够,就需要消费者来进行他们自己的安全测试(或雇佣第三方来测试)。
计算机用户习惯于把广告软件和间谍软件仅仅当作低级的、用来提供近期大减价信息的令人讨厌的东西。据Reuters所说\[5\],一个加利福尼亚人被联邦法院指控创建了一个由被劫持计算机组成的类机器人网络(亦即bot网络——译者注),通过这个网络强制安装讨厌的广告软件从而帮助他和两个同伙从中获利10万美元。
广告软件的背后操纵者总是从低级的令人讨厌的东西那里赚钱。然而,键盘记录间谍软件却有更加险恶的威胁。如果说广告软件只是些讨厌的东西,而键盘记录间谍软件却被黑客用来得到你的金融站点登录名称和密码,并在线转走你的钱,这可就是个比较大的问题了。
Symantec公司每6个月发布一次的Internet安全威胁报告对Internet安全活动进行分析和讨论。其范围包括Internet攻击、漏洞、恶意代码以及未来的安全趋势等内容。编写本书的时候最新一期的安全威胁报告中涵盖了2005年前6个月的情况,其中标识出了Internet安全威胁领域内的发展变化轨迹\[6\]。攻击者已经从对网络周边的大型的多目标攻击转移到针对客户端目标展开的较小的更集中的攻击,这些客户端目标如Web浏览器、媒体播放程序以及即时通信程序等。新的威胁领域很可能被那些新出现的威胁所占领,如bot网络、可定制的模块化恶意代码以及针对Web站点的锁定目标攻击等。和传统的攻击活动不同的是,当前的许多威胁动机非常明确,就是为了获利。攻击者通常企图进行犯罪活动,比如窃取身份资料、敲诈或欺骗等等。
众多安全分析员正努力工作,以便能把所有可能被利用的安全漏洞及时地告知公众。例如,Symantec公司的Deepsight威胁管理系统\[7\](Deepsight Threat Management System)提供了这种情报,其中涵盖了完整的安全威胁生命周期,即从最初发现威胁到公开漏洞,再到攻击活跃起来的整个过程。
BugTraq\[8\]是一个大型、完全公开的邮件列表,用来详尽讨论并公布计算机安全漏洞。BugTraq是整个Internet上安全团体的基石。
SecurityFocus安全漏洞数据库为安全从业人员提供了各种平台和服务方面安全漏洞的最新信息。
这还仅仅是专门跟踪匿名流量的众多资源中的一少部分。对海量信息(恶意代码、安全风险、域名失效警报等)进行监控,在某种程度上是势在必行的。
在理想的情况下,各Web站点都应该能够抵御来自Internet使用者的恶意攻击,保护站点和其用户机密数据的安全。Web应用程序的最终用户都应该对该程序的安全性有信心,即他们可以放心使用这个系统,而不用担心非授权用户能够访问到存储在这个Web站点上的交易信息或个人信息。
素材的覆盖范围和本书的组织结构
本书囊括了应用程序和网络安全分析与测试方面的内容,提供了读者急需的技术深度。
许多其他图书所述内容依赖于专利权软件的使用,这些软件的价格高达上千美元,而本书中所讲的工具都是可以免费得到的。本书为QA从业人员提供了相关工具的综述,向进行大量烦琐工作的测试人员介绍了一些很有价值的策略。
本书将展示如何针对那些最有意义、最重要和/或最具风险的方面进行测试,从而避免将耗费不菲的测试资源用于那些较小可能的攻击想定。
通常,大多数人的意见似乎仍然认为需要有专家来指导安全测试。“安全测试任务只能由经过专门培训的人员来完成,因为一般的质量保障测试人员没有得到完成这项工作所需的训练”,在2006年2月召开的RSA会议上,参加座谈的一组公司安全主管、学术界人士和专业的软件开发人员得出了这样的结论\[9\]。
关于安全测试是谁的职责的问题,存在很多混乱的认识,但是,很多人都负有这种责任。
本书概括了安全的软件开发生命周期(Secure Software Development Lifecycle,SSDL)的概念。与软件开发生命周期相对应,SSDL由6个阶段构成。本书的每章将详细讲述SSDL的各个阶段(第3章将概述SSDL),并将讨论在此生命周期中,及早归并和提出安全问题的重要性。本书将谈到每个阶段的安全任务、角色以及每个团队成员的职责,从而有助于澄清任务到底是什么,究竟谁真正对安全测试负责。
必须尽早定义并/或理解有关的安全原则(guideline)、安全规则(rule)和安全规章(regulation)。人们认为需要遵循的安全原则包罗众多。无论你的软件开发安全标准是遵循某种标准(如VISA标准、HIPPA标准或SOX标准等),还是自己内部制定的标准,都应该有一个安全策略,作为SSDL的基准来使用。
在业务分析和需求整理阶段,安全需求往往被忽略,然而,应该在这个阶段对其进行定义。在原型/设计/架构阶段,安全小组通过对系统架构复审和威胁模型构建(将在第4章进行讨论)进行指导,从而对安全提供支持。通过完成这些工作,指出所有潜在的安全漏洞,并确定出这个应用程序风险最高的部分。
安全的编码原则有助于防止代码中出现纰漏(将在第2章进行讨论),这些原则需要在软件开发阶段坚持遵守。白盒/黑盒/灰盒测试技术(将在第5章进行讨论)用于集成和测试阶段。
本书第二部分的重点放在在网络上发现应用程序并对其进行攻击。然后,将讨论各种攻击方法,包括针对Web站点授权功能模块的攻击。首先我们将学习如何执行SQL注入攻击,然后将看到针对Web服务器的其他常见攻击(第6章、第7章、第8章),最后我们将学习如何使用各种代理来测试应用程序的各种安全漏洞(第9章和第10章)。第二部分的每一章都会对相应的测试攻击模式进行总结,QA人员或测试工程师可以以此为起点制定其测试大纲或测试清单。
判定可利用性(在第三部分中讨论)是在整个生命周期中都需要做的事情,而结果要在系统成品开发和维护阶段才会定案。这时,应做好补丁管理计划。在整个测试的生命周期中,应对安全计划复审和评估活动提供指导,以便进行持续的改进活动。随着安全测试的开展,使用整个过程中收集的度量标准进行的最终复审和评估需要得到指导,以便得出满意的、明智的决策。
本书分为三个主要部分。
第一部分
第一部分讨论了一些现实情况,即安全测试需要一种范式来替换传统的测试方法,并需要指导安全测试人员学会像攻击者那样思考。本部分将讨论安全漏洞是怎样藏到软件中来的,还将讨论威胁建模及白盒、黑盒和灰盒测试是怎样用于找出这些安全漏洞的。
第一部分的第3章展示了构成安全的软件开发生命周期(SSDL)的各部分是怎样贯穿全书来描述的。
第1章,设身处地:从传统软件测试转变的一个范式。本章讨论通过设法攻破软件来促进软件安全的有关话题。这要求测试人员像侦探那样工作,并迫使测试的范式从传统测试中转变。本章提供了一些高级安全测试策略。安全测试需要一种独特的测试思想。安全测试人员不仅应该把自己当作一名验证者,还应该把自己当作一名攻击者,也就是必须进行一些探测工作,以判定应用程序最为薄弱的部分,并设计相应的攻击。因为并不是所有的攻击都是破坏性的,所以测试人员必须进行评价并排定安全测试想定执行的优先顺序,并纠正所有未公开的潜在安全漏洞。
第2章,漏洞是怎样藏到软件中的。本章将对各种安全漏洞进行讨论,并探讨如何防止这些漏洞偷偷藏到你的程序中(如同设计漏洞与实现漏洞那样)。设计漏洞是一种设计错误,它使得程序不可能安全运转,而无论代码编写人员实现得多么好都无济于事。与之不同,实现漏洞是由软件实际编码中存在的安全错误(bug)引起的。本章将讨论如何能够避免各类安全错误在不知不觉之中“溜进”你的项目。
第3章,安全的软件开发生命周期。本章将讨论在安全的软件开发生命周期中,及早介入安全测试和提出安全问题的重要性。在传统的软件开发生命周期中,安全测试往往只是一种事后反应。然而,将安全测试工作延迟到软件开发完成之后才进行,这是一种坏习惯。本章内容将涉及及早开展软件安全测试工作,并将讨论如何将安全性需要引入到软件开发生命周期中,且从最早的阶段就开始引入这种要求。
第4章,基于风险的安全测试:通过威胁建模排定安全测试的优先顺序。本章将讨论服务于软件安全测试的威胁模型的使用。将讨论威胁模型建立的各个步骤,如信息采集(包括与架构师会谈或指导运行时审查)、贯彻建模过程、排定优先级以及使用缓解策略。
第5章,白盒、黑盒和灰盒测试。本章将讨论各种安全测试方法及各自的优缺点。其中包括关于如何搭建一个安全测试实验环境的内容,以及所需的软件安全测试工具软件的信息。
第二部分
本部分开始讲述能使测试人员像攻击者一样思考的一些技术,详细讨论如何进行攻击。诸如常见的网络故障注入、应用程序攻击、代理服务器以及本地错误注入等攻击都将论及。
第6章,常见的网络故障注入。本章重点内容是在网络上发现应用程序并对其展开攻击。首先,我们将学习如何找出应用程序的网络痕迹,然后将讨论各种攻击方法,最后将讨论中介随机侦测程序的使用。
第7章,Web应用程序:会话攻击。本章重点介绍针对Web站点的会话(session)管理功能展开的攻击。我们将学习密码的暴力攻击、cookie分析以及跨站点执行脚本攻击。
第8章,Web应用程序:常见问题。本章将向你展示如何执行SQL注入攻击。然后,本章还将介绍针对Web服务器的其他一些常见攻击。
第9章,Web代理:使用WebScarab。本章介绍免费的Web代理软件WebScarab的使用及其特点。
第10章,实现定制的侦探工具。本章介绍如何使用快速原型开发语言来实现一个定制的侦探工具。
第11章,本地故障注入。本章详细介绍一些专用于测试本地应用程序攻击面相关的技术,这些攻击面包括ActiveX接口、文件格式、命令行参数以及共享内存段等。
第三部分
本书的最后这部分内容将提供一种分析方法,并展示如何判定漏洞的可利用性。
第12章,判定可利用性。本章描述如何基于漏洞对应用程序的潜在影响来确定其影响范围和严重程度。你将看到安全漏洞是怎样在处理器指令层上触发的,这样,你就可以辨别应用程序的崩溃是否会导致代码的执行。
读者对象
软件安全和测试工程师需要更快更彻底地开展安全测试,针对这种需要,本书讲述了一些实用技巧,并提供了开展工作所需的知识。这些技巧同样可以用于那些负责安全测试(除了单元测试和集成测试之外)的软件开发人员。本书还对软件项目经理的需要提供了支持,这些项目经理负责整个项目的安全测试。本书为他们提供了诸如安全测试的目标和结果、如何确定在哪里和是否需要执行特定的安全测试以及在测试计划、开发工作和安全测试工作的开展中需要深思的问题等资料。
下列这些软件从业人员需要用到本书讲述的实用技巧和知识:
安全工程师——本书包含了大量与SSDL有关的资料,其中包括可供安全工程师使用的各种攻击方法。过去,许多安全工程师的精力主要用在网络安全和主机级的安全上。本书将使安全工程师将其注意力转移到应用程序层,并与软件开发人员和测试人员合作,以部署更加安全的软件,而这种部署工作还包含软件补丁的管理。
软件测试工程师——本书可用于QA/测试工程师查找一些更为全面的技术来理解潜在的安全问题。本书提供了理解安全测试的应用所需的实用指南,还给出了一些用于在一个项目中引入、管理和开展安全测试的方法。过去,许多软件测试工程师都是在程序开发完成后才进行安全测试,或者根本就不做安全测试。其结果往往只是对产品中发现的安全问题的一种缀补,就像贴一块“邦迪”创可贴一样,而这些问题本应更早发现。本书概括了如何避免这些失误,以及如何在SSDL中充分平衡投入的方法。更深入的讨论则伴随着对测试工程师的逐步测试指导而开展。每一章都会对相应的测试攻击模式进行总结,这可以作为测试大纲或测试清单来使用。
软件开发人员——本书是一本指导负责开发的软件开发人员进行安全测试的图书,为开发人员提供了领悟并掌握如何开展安全测试的知识,有助于在整个软件开发过程中,将安全作为首要任务来执行。
软件开发经理——本书提供了较多的技术,用于洞察安全测试成功的关键因素。本书为各种安全测试策略和安全测试工具的应用提供了一部资料翔实的指南。书中介绍了如何就软件安全问题做出明智的决策,以及如何安排安全测试执行的优先级。
项目经理和测试经理——对于项目经理和测试经理来说,本书可用作实用的指南,以对安全测试的计划、设计和执行提供支持。本书还介绍了如何排定安全测试的优先级、如何在项目中引入安全测试以及在测试计划中需要反省的问题是什么。
质量保障(QA)工程师——本书将帮助QA工程师针对安全策略执行质量审查。SSDL可从开发计划起始阶段就开始在软件开发生命周期中及早处理安全问题。这包括安全标准和安全策略、安全需求、安全设计、安全测试过程、测试的结果以及补丁管理策略等。
配置管理(CM)专家——本书将帮助CM专家理解安全需求,并认识到确定作为基准的安全测试脚本的好处。
需求管理(RM)专家——本书将帮助RM专家理解定义好的安全需求和测试设计及测试脚本之间的关系。
首席信息官/高级经理——本书可作为一本关于可用的各种安全测试策略和安全工具及其应用的翔实指南,用于指导公司信息系统的开发。本书为高级经理以及政府和行业中的负责官员提供了一些原则,用以指导其在开发生命周期过程中思考和开展安全测试。书中还为经理们提供了一些知识,用于帮助他们理解软件安全质量度量的结果,以便进行决策。
课堂讲师——本书也可以用于为课堂培训提供有关使用最新策略和测试工具能力的指导,可向学生介绍应用程序安全的知识以及软件安全测试的重要性,还可以指导他们进行各种类型的安全测试。
附注
〔1〕Symantec公司的Internet安全威胁报告,2006年3月。
〔2〕bot软件是一种恶意程序,它可以控制一台家庭或公司的计算机。之后,被控制的计算机将用来进行“钓鱼”攻击,或传播垃圾信息,或者只是当用户登录到金融站点或者其工作网络的时候,记录用户的键盘输入。(多台这样的计算机就构成了所谓的bot网络——译者注。)
〔3〕2005年攻击趋势和分析报告,Counterpane Internet Security和MessageLabs公司发布,http://wwwcounterpanecom/cgibin/attacktrends4cgi。
〔4〕“Businesses Should Pay More Attention to Software Security”(企业应对软件安全给予更多关注),作者:Tim Greene,2006 Network World(网络世界)。文章总结了一组公司安全主管、学术界人士和专业的软件开发人员在2006年2月召开的RSA会议上发言得出的结论。
〔5〕“Recent Developments in Adware and Spyware(广告软件和间谍软件的近期发展)”,Symantec公司,2006年2月21日,文章ID:6476。
〔6〕Symantec公司的Internet安全威胁报告,第Ⅷ卷,2005年9月。
〔7〕http://wwwtmssymanteccom。
〔8〕http://wwwsecurityfocuscom/about。
〔9〕“Businesses Should Pay More Attention to Software Security”(企业应对软件安全给予更多关注),作者:Tim Greene,2006 Network World(网络世界)。
本书深入讲解软件安全方面最新的实用技术,用于在破坏之前预防并识别软件的安全问题。 本书作者具有近十年应用和渗透测试方面的经验,从简单的“验证”性测试方法讲起,进而介绍先发制人的“攻击”性测试方法。作者首先系统地回顾了软件中出现的设计和编码方面的安全漏洞,并提供了避免出现这些安全漏洞的实用指导。然后,向读者展示了定制用户化软件调试工具的方法,用以对任何程序的各个方面独立地进行测试,之后对结果进行分析,从而识别可被利用的安全漏洞。 主要内容 ●如何从软件攻击者的角度来思考从而增强防御策略。 ●兼顾成本效益,将安全测试整合到软件开发的生命周期。 ●基于最高风险领域,使用威胁模型来排定测试的优先顺序。 ●构建用于进行白盒测试、灰盒测试和黑盒测试的软件测试实验。 ●针对每个测试工程,选用恰当的工具。 ●执行当前主要的软件攻击,从故障注入到缓冲区溢出。 ●哪些缺陷在现实世界中最可能被攻击者利用。 本书是每一个负责软件安全的技术人员必备的读物:无论是测试人员、QA专家、安全从业者、开发人员,还是其他相关的人员。对于IT管理人员,本书提供了经实践检验的行动计划,用于实现有效安全测试或加强现有测试流程。
在使自己信赖软件测试之前,谁能够议论测试的事情呢?谁都不能议论,也不会议论。因此,如果没有开展测试,原因会是别的什么,但都不是令人信服的拒绝测试的理由。这些原因不外有三种:负担不起测试,不测试也可以做得很好,不知道怎么测试。
负担不起测试——考虑到节俭的人不同意超过花费的限度,所有的开销都要事先做出选择。如果进行测试的话,有什么事情就不做了呢?如果不做的事情是给软件增加别的功能特性的话,或许你值得庆贺你选定了一个较简单的产品。较简单的产品事实上比较容易测试(并且还有一个好的理由:安全的主要敌人是复杂性,而没有什么比逐步增加功能特性更能带来复杂性的了)。如果不进行测试的话,通常给出的理由是“要按时把产品弄出来”。如果不是使性子的话,这个理由是不够充分的。本书所讲的这种测试致力于软件的未来,其重要性甚至要超过按时把产品弄出来。只有那些醉心于财富之梦的CEO们才阻止测试而不去考虑软件的未来。测试是努力让你控制未来,而不是让它控制你。测试让不可避免的未来产品故障提前在当前出现。当威廉·吉布森说出名言“未来已经来临,只是尚未广为流传而已”的时候,他并不关心我们这里讲的测试。你显然想做的事情就是把未来不对等地发布,以便能在你的用户(和竞争对手)之前看到产品的未来。读了这一段以后,你极可能在头脑中已有测试的框架,所以,我们停止这个论题,继续看下一个问题。
不测试也可以做得很好——某些产品或许不需要太多的测试。这些产品和创新无关,它们是不易损坏的日用品,或者是相当无聊的东西。这不是我们关心的东西,我们这里所说的是要保护安全敏感的产品。哪些产品属于这一类呢?如果在其使用期间将面对感觉灵敏的对手,那么,这个产品就是安全敏感的。如果其仅有的危险是面对笨蛋(“嗨,看这个!”)或者无规则的偶然事件(阿尔法粒子),这个产品或许并不是安全敏感的。但是,作为软件和网络来说,几乎所有的东西都是安全敏感的,这是因为,就算没什么危险,起码每个极富攻击性的人都是你的邻居。达到完美程度需要的负担不再是罪犯实施完美的犯罪,而是防卫者实行完美的抵御。的确,不进行测试你也可能侥幸成功,就像你不穿戴任何保护装置,也可能在用电动带锯锯铝的时候、在摩亚国(Moab)进行山地自行车赛的时候或者在清洗P3级防放射泄露装置实验室时侥幸地不会受到伤害。总是有人能侥幸地逃过这些伤害,甚至是比这更危险的情况。但这种理由在这里并不适用。为什么?因为你的产品越成功,传播越广,那些攻击的人就越多,那些感觉灵敏的对手也会越多,他们将选中你的产品作为特别项目。只需要问问微软就知道了。如果你想要让你的产品得到广泛的使用,就需要对软件进行测试。唯一的问题就是“由谁来测试?”
不知道怎么测试——这又让我们回到了本书的宗旨。你已经准备好了,也愿意开展测试,可是你不会。或者,你想要确保你不落后于你的对手。抑或,你需要比这里罗列的内容更多的“极限运动”的原始材料。你到这个地方就来对了(这里不是“独一无二”的地方)。这是(让我们清楚地说)一个完全正确的地方。作者久经考验,而技术是当前最新的。尽管安全相关的技术具有从未“完备”的极大优点,但你所要做的不会超过这个范围。如果你愿意,就可以成为本书的读者。同时,掌握Chris Wysopal、Lucas Nelson、Dino Dai Zovi和Elfriede Dustin教给你的东西,并将其付诸实践。像这样的技能集合不会无限增长,而你的对手的技能发展也不会比这些东西发展得更多。
从目录中你可以看到,测试是一种思考方法,而不是一个待按的按钮,也不是一个待批准的预算。你极可能只有接受这种思考方法,并且,除了工具的常规使用和具体化的技术之外,没有什么东西更能强化思考的方法。这不是开玩笑。外部的攻击者技能非常熟练且日益专业,同时拥有工具和思考模式。恶意软件,特别是那些把好公民变成无心的坏公民的恶意软件,已经使得长期存在的对安全威胁者的假定变为现实:真正的威胁来自内部。
问:外部攻击者度量成功的第一个依据是什么?答:获得内部的信任、访问和授权。如果这个攻击者计划通过利用目标内部所运行软件的漏洞来达到这个目的,那么只有你的设计和测试能够阻止攻击者的行动。如下图所示,其中思想不是“产品在做其设定的工作吗?”而是“产品没有做它未设定的工作吧?”这个问题比质量保证问题更为严峻,因为这是安全性内在的一个口子。这种问题并不能由开发本身全部处理,它必须是经过测试保证的,更适合由受过专门训练的测试人员来执行,而不是和软件构建过程搅到一起。
这同样是本书的着眼点。本书将讲述如何施加专家级的压力,进行加快故障出现时间的测试。你将学会如何高效地完成这样的测试,以使你乐于开展测试并摒弃不经过测试而侥幸成功的想法。换句话说,这就像在灌木丛中打猎。你自学也能学会怎么做,但跟随一个专家级的追踪者比艰难地学习每一件事情更快。掌握本书所提供的东西,你不仅可以成为一个强大的猎手,而且还有自己做一个追踪者的机会。别忘了,所有的技能都是实践的结果。这些作者都是经验丰富的;现在轮到你了,他们已经帮了你一把。
Daniel E Geer, Jr, 理学博士
2006年7月24日
附注
〔1〕 Herbert H Thompson 和James AWhittaker著《Testing for Software Security》(软件安全测试) Dr Dobb’s Journal, 27(11): 2432, November 2002。
Chris Wysopal;Lucas Nelson;Dino Dai Zovi;Elfriede Dustin:Chris Wysopal: Chris Wysopal是Veracode公司CTO。曾任@stake公司的研发副总。他领导了无线、架构及应用程序安全工具的开发。他是L0phtCrack密码审计攻击的合作开发者。他曾在美国国会进行过安全声明,并曾在Black Hat大会和西点军校讲演。
Lucas Nelson: Lucas Nelson是Symantec公司的纽约地区技术经理。他领导着Semantec的Application Security Center of Excellence(卓越应用程序安全中心),该中心主要开发一些应用程序安全实践和指导原则,并对新员工进行应用程序测试方法的培训。
Dino Dai Zovi: Dino A. Dai Zovi是Matasano安全公司的主要成员,为企业和供应商提供软件安全化服务。他是在MacOS X、802.11以及硬件可视化方面受人尊敬的研究人员和权威。Dino经常出席包括Black Hat和Microsoft公司的BlueHat等大会。
Elfriede Dustin: Elfriede Dustin是《Effective Software Testing》一书的作者,也是《Automated Software Testing》和《Quality Web Systems》这两本书的第一作者。他是自动化测试生命周期方法(ATLM)的创始人。
程永敬:暂无简介
尽管“软件质量”这个概念已经为大多数业内人士所熟知,国内的软件企业和软件开发团体也已经意识到软件质量保证在成本/效益等各方面的重要性,软件测试也逐步开展了起来,但是,很多企业和团体,特别是中小企业和自发组织的开发团体,在对软件质量保证及其实施的理解上,在业务流程、专职人员、专业知识等保障上还有很长的路要走。从这种意义上讲,我们的软件质量之路还刚刚起步。
软件安全,作为网络时代软件必然的需求,其范畴既与软件质量相关,又有别于软件质量,它是一种对软件质量的更高要求。在实际工作中,我们接触过很多中小企业和软件开发团体的成员,可以说,随着安全形势越来越严峻,大部分人的头脑中还是有安全意识的,但是,绝大多数的人却不知道如何实现安全的软件。《编写安全的代码》是一本指导软件开发团队遵循安全的编码原则来编写安全代码的权威指导教材。从这里开始,我们有了构建安全软件的系统知识。但是,作为产品的软件,其安全保证和质量保证一样,不能仅仅依靠开发团队来完成。安全测试是在攻击者之前发现软件安全缺陷,并及时修补软件安全漏洞的重要环节。近年来,国外已经出版了几部涉及这一领域的专著。本书是这些优秀著作之一,为我们做好软件安全测试、把好软件质量关提供了从方法学到具体实践的全面指导。
本书倡导的以攻击者的思维进行思考,以及通过威胁建模排定测试优先级等思维方式和方法论,为我们定义安全测试工作流程、设置安全测试工作岗位、制定安全测试工作计划,从而规范地开展安全测试,提供了非常有用的指导。书中介绍的各种安全攻击和安全测试技术,尤其是很多用于安全测试的开源或免费工具的用途和用法,更是为在这方面预算紧张的软件企业,特别是中小软件企业开展软件安全测试指明了可行之路。
很荣幸能将这本书的中文版带给大家!及早阅读本书,及早开展软件安全测试,可助您在降低软件风险、降低软件总体成本、提高软件安全性,乃至提高软件全面质量方面迈出一大步!
参加本书翻译工作的有程永敬、卢敏、安志琦、董启雄、韩平、费玮、汪顶武和李波等。在本书的翻译过程中,得到了机械工业出版社华章分社的编辑们大力支持,在此表示衷心的感谢!
由于时间以及译者经验和水平所限,尽管我们尽了最大努力,但书中难免还有不尽如人意的地方,敬请读者不吝指正!您可以发送邮件到: chengyongjing@126com。对您的批评和指正,我们表示真诚的感谢!
程永敬
2007年6月
本书的“美誉”
译者序
序言
前言
致谢
关于作者
第一部分综述
第1章从传统软件测试转变2
11安全测试和传统软件测试的对比4
12安全测试转变的范式6
13高级安全测试策略7
14像攻击者一样思考9
141排定工作的优先级10
142在侦测工作中使用辅助工具11
143从漏洞知识中学习12
15小结13
第2章漏洞是怎样藏到软件中的15
21设计漏洞与实现漏洞16
22常见的安全设计问题17
221密码技术使用的败笔17
222对用户及其许可权限进行
跟踪19
223有缺陷的输入验证20
224薄弱的结构性安全21
225其他设计缺陷23
23编程语言的实现问题24
231编译型语言:C/C++24
232解释型语言:Shell脚本
和PHP32
233虚拟机语言:Java和C#35
24平台的实现问题36
241问题:符号链接37
242问题:目录遍历37
243问题:字符转换38
25常见的应用程序安全实现问题39
251SQL注入39
252跨站点执行脚本40
26开发过程中的问题41
261安全需求和前提条件的文档
记录贫乏41
262交流和文档的匮乏42
263在开发过程中缺少安全过程42
27部署上的薄弱性43
28漏洞根源分类法44
29 小结44
第3章安全的软件开发生命周期46
31将安全测试融入到软件开发
生命周期中47
32阶段1:安全原则、规则
及规章49
33阶段2:安全需求:攻击用例51
34阶段3:架构和设计评审/威胁建模53
35阶段4:安全的编码原则53
ⅩⅩⅣ36阶段5:白盒/黑盒/灰盒测试54
37阶段6:判定可利用性54
38安全地部署应用程序55
39补丁管理:对安全漏洞进行管理55
310角色和职责56
311SSDL与系统开发生命周期的
关系56
312小结58
第4章基于风险的安全测试61
41信息搜集61
411与架构师会谈62
412运行时检查63
42Windows平台63
43UNIX痕迹检查67
44完成信息搜集工作69
45建模过程69
451识别威胁路径70
452识别威胁73
453识别漏洞74
454将与漏洞相关的风险进行
分级75
46判定可利用性76
第5章白盒、黑盒和灰盒测试77
51白盒测试77
52黑盒测试78
53灰盒测试78
54建立用于测试的实验室79
541侦探程序80
542嗅探器80
543调试器81
544 硬件81
545商业的测试设备81
546网络硬件82
55开展应用程序攻击82
551实验室环境82
552网络攻击83
第二部分攻击演练
第6章常见的网络故障注入90
61网络90
62端口发现91
621netstat和本地工具91
622端口扫描94
63代理95
631最简单的代理:随机TCP/UDP
故障注入程序96
632构建故障注入数据集100
633中间人代理103
64结论104
65小结104
第7章会话攻击106
71将要测试应用程序作为攻击目标106
72身份鉴别和授权106
73对会话和资源ID进行攻击107
74Cookie搜集111
75判断SID的长度:阶段步进分析113
76跨站执行脚本115
77 结论118
78小结118
第8章Web应用程序的常见问题119
81绕过授权120
82SQL注入121
821SQL注入基础121
822数据库模式探索126
823在SQL服务器上执行命令130
83上传可执行内容133
84文件枚举135
85源代码泄露漏洞138
86HTTP中的隐藏字段140
87结论143
88 小结143
第9章使用WebScarab144
91WebScarab代理144
92结论156
93小结156
第10章实现定制的侦探工具158
101协议发现158
102SOAP和WSDL161
103SOAPpy库163
104结论170
105小结170
第11章本地故障注入171
111本地资源和进程间通信171
1111Windows NT对象172
1112UNIX上的setuserid进程
和进程间通信174
112对本地应用程序进行威胁建模175
1121列举Windows应用程序资源176
1122列举UNIX应用程序资源176
113测试可执行脚本的ActiveX对象
接口178
114识别可“安全”执行脚本对象179
115测试对象接口181
1151手工的接口测试181
1152自动的ActiveX接口测试183
1153 对崩溃进行评估183
116对文件格式进行侦探184
117文件破坏测试185
118文件破坏自动化185
119对命令行工具进行侦探186
1110Immunity公司的ShareFuzz187
1111暴力的二进制测试程序188
1112CLI Fuzz188
1113共享内存192
1114小结194
第三部分分析
ⅩⅩⅤ第12章判定可利用性198
121漏洞分级198
1211时间198
1212可靠性/再现性198
1213访问199
1214定位200
122内存侵害和任意代码执行201
123计算机体系结构202
1231栈203
1232栈缓存区溢出205
1233堆205
124判定可利用性208
1241进程崩溃转储208
1242被控制的内存和寄存器208
1243缓解因素:栈和堆保护212
125更多资料213