模糊测试――强制发掘安全漏洞的利器(Jolt 大奖精选丛书)
【美】Sutton, M.Greene, A.Amini, P. 著
段念赵勇译
ISBN 978-7-121-21083-9
2013年10月出版
定价:89.00元
564页
16开
内容提要
随着软件安全性问题变得越来越关键,传统的仅由组织内的少数安全专家负责安全的模式正受到越来越多的挑战。模糊测试是一种能够降低安全性测试门槛的方法,它通过高度自动化的手段让组织的开发和测试团队都能参与到安全性测试中,并能够通过启发式等方法不断积累安全测试的经验,帮助组织建立更有效的面向安全性的开发流程。本书是一本系统性描述模糊测试的专著,介绍了主要操作系统和主流应用类型的模糊测试方法,系统地描述了方法和工具,并使用实际案例帮助读者建立直观的认识。无论读者是否已有一定的安全性测试经验,本书都能够让你立即获得收益。
目录
译者序V
前言IX
原书序XI
致谢XV
关于作者XVII
第一部分基础知识
第1章安全漏洞发现方法学2
1.1白盒测试3
1.2黑盒测试8
1.3灰盒测试12
1.4小结16
第2章什么是模糊测试17
2.1模糊测试的定义17
2.2模糊测试的历史18
2.3模糊测试各阶段22
2.4模糊测试的局限性和期望24
2.5小结27
第3章模糊测试方法与模糊测试器类型28
3.1模糊测试方法28
3.2模糊测试器类型31
3.3小结39
第4章数据表示和分析40
4.1什么是协议40
4.2协议中的字段41
4.3简单文本协议(PLAIN TEXT PROTOCOLS)43
4.4二进制协议44
4.5网络协议47
4.6文件格式48
4.7常用协议元素51
4.8小结52
第5章有效模糊测试的需求53
5.1可重现性与文档53
5.2可重用性54
5.3过程状态和过程深度55
5.4跟踪、代码覆盖和度量58
5.5错误检测58
5.6资源约束60
5.7小结60
第二部分目标与自动化
第6章自动化与数据生成62
6.1自动化的价值62
6.2有用的工具和库63
6.3编程语言的选择66
6.4数据生成与模糊试探值(FUZZ HEURISTICS)66
6.5小结75
第7章环境变量与参数模糊测试76
7.1本地模糊测试介绍76
7.2本地模糊测试原则78
7.3寻找测试目标79
7.4本地模糊测试方法82
7.5枚举环境变量83
7.6自动化的环境变量模糊测试84
7.7检测问题86
7.8小结88
第8章自动化的环境变量与参数模糊测试89
8.1IFUZZ本地模糊测试器的功能89
8.2开发IFUZZ工具91
8.3IFUZZ使用的编程语言95
8.4案例研究96
8.5优点与改进97
8.6小结98
第9章WEB应用与服务器模糊测试99
9.1什么是WEB应用模糊测试99
9.2测试目标102
9.3测试方法104
9.4漏洞116
9.5异常检测119
9.6小结120
第10章WEB应用和服务器的自动化模糊测试121
10.1WEB应用模糊测试器122
10.2WEBFUZZ的特性124
10.3必备的背景信息128
10.4开发WEBFUZZ131
10.5案例研究139
10.6优点与可能的改进148
10.7小结149
第11章文件格式模糊测试150
11.1测试目标151
11.2测试方法152
11.3测试输入154
11.4安全漏洞155
11.5检测错误158
11.6小结159
第12章UNIX平台上的文件格式自动化模糊测试161
12.1NOTSPIKEFILE和SPIKEFILE162
12.2开发过程162
12.3有意义的代码片段165
12.4僵尸进程(ZOMBIE PROCESS)168
12.5使用注意事项170
12.6案例研究:REALPLAYER REALPIX格式字符串漏洞172
12.7开发语言174
12.8小结174
第13章WINDOWS平台上的文件格式自动化模糊测试175
13.1WINDOWS文件格式漏洞175
13.2FILEFUZZ工具的功能178
13.3必需的背景信息183
13.4开发FILEFUZZ工具186
13.5案例研究194
13.6优势和提升空间198
13.7小结199
第14章网络协议的模糊测试200
14.1什么是网络协议的模糊测试201
14.2选择目标应用203
14.3测试方法207
14.4错误检测209
14.5小结210
第15章UNIX平台上的自动化网络协议模糊测试211
15.1使用SPIKE进行模糊测试212
15.2SPIKE必要知识215
15.3基于块的协议模型217
15.4其他的SPIKE特性219
15.5编写SPIKE NMAP模糊测试器脚本220
15.6小结224
第16章WINDOWS平台上网络协议的模糊测试225
16.1特性226
16.2必备的背景知识229
16.3开发231
16.4案例研究237
16.5优势与可改进空间239
16.6小结240
第17章WEB浏览器的模糊测试241
17.1什么是WEB浏览器模糊测试242
17.2目标242
17.3方法243
17.4漏洞253
17.5检测254
17.6小结255
第18章WEB浏览器的自动化模糊测试256
18.1组件对象模型背景256
18.2开发模糊测试器260
18.3小结271
第19章内存模糊测试272
19.1为什么需要内存模糊测试?怎么进行?273
19.2必要的背景知识273
19.3究竟什么是内存模糊测试的简要解释277
19.4目标278
19.5内存模糊测试方法之变异循环插入(MUTATION LOOP INSERTION)279
19.6内存模糊测试方法之快照恢复变异(SNAPSHOT RESTORATION MUTATION)280
19.7测试速度与处理深度281
19.8错误检测281
19.9小结282
第20章自动化内存模糊测试284
20.1内存模糊测试工具特性集284
20.2选择开发语言286
20.3WINDOWS调试API288
20.4整合以上的内容292
20.5PYDBG,一个新朋友299
20.6一个人造的示例301
20.7小结314
第三部分高级模糊测试技术
第21章模糊测试框架318
21.1什么是模糊测试框架319
21.2现有的模糊测试框架321
21.3定制模糊测试器案例研究:SHOCKWAVE FLASH338
21.4模糊测试框架SULLEY352
21.5小结382
第22章自动化协议分析383
22.1模糊测试的痛处383
22.2启发式技术385
22.3生物信息学390
22.4遗传算法394
22.5小结398
第23章模糊测试器跟踪399
23.1我们跟踪的究竟是什么399
23.2可视化和基础块401
23.3构建一个模糊测试器跟踪器403
23.4分析一个代码覆盖工具410
23.5案例研究417
23.6优势与将来的改进425
23.7小结428
第24章智能错误检测429
24.1原始的错误检测技术429
24.2我们寻找的是什么432
24.3选择模糊测试值的注意事项437
24.4自动化的调试器监视438
24.5首轮异常与末轮异常446
24.6动态二进制插装447
24.7小结449
第四部分展望
第25章我们学到了什么452
25.1软件开发生命周期452
25.2开发者457
25.3QA研究员458
25.4安全研究者458
25.5小结459
第26章展望460
26.1商业工具460
26.2发现漏洞的混合方法467
26.3集成的测试平台468
26.4小结468
附录A本书引用的小布什语录之详细解读469
索引480
作者简介
Michael Sutton
Micheal Sutton是SPI Dynamics的安全性专业顾问(Security Evangelist)。作为安全性专业顾问,Michael负责识别、研究及提出Web应用安全性历史上出现的问题。他经常在主要的信息安全会议上演讲,写作了大量文章,并在多种信息安全主题中被引用。Michael同时也是Web 应用安全性协会(Web Application Security Consortium,WASC)的会员,领导着Web应用安全性统计项目。
在加入SPI Dynamics之前,Michael是iDefense/VeriSign的总监,领导iDefense Labs这个世界级的研究团队,该团队的目标是发现和研究安全性漏洞。Michael还在百慕大建立了为安永服务的信息系统保证和咨询服务(Information System Assurance and Advisory Services,ISAAS)。Michael拥有阿尔伯塔大学和乔治华盛顿大学的学位。
Michael是一个骄傲的加拿大人,在他看来,曲棍球是一种信仰而不只是一种运动。在工作之外,Micheal还是Fairfax志愿救火部门的一名士官。
Adam Greene
Adam Greene是某大金融新闻公司的工程师,公司位于纽约。在加入这家公司之前,Adam是iDefense的工程师,iDefense是位于弗吉尼亚州雷斯顿城的一家智能公司。Adam在计算机安全性方面的兴趣主要在于可信利用(reliable exploitation)方法、模糊测试,以及开发基于UNIX系统的利用漏洞的工具。
Pedram Amini
Pedram Amini目前领导着TippingPoint的安全研究和产品安全评估团队,在此之前,他是iDefense Labes的助理总监和创始人之一。顶着“助理总监”这个奇怪的头衔,Pedram在逆向工程的基础方面投入了相当多的时间――开发自动化工具、插件及脚本。他最近的项目(也叫“Babies”)包括PaiMei逆向工程框架和Sulley模糊测试框架。
出于热情,Pedram创建了OpenRCE.org,一个专注于逆向工程的艺术和科学的社区网站。他在RECon、BlackHat、DefCon、ShmooCon和ToorCon上都进行过演讲,并教授了多次逆向工程课程。Pedram拥有杜兰大学的计算机科学学位。
前言
译者序
翻译《模糊测试――强制发掘安全漏洞的利器》所花费的时间远超译者的预期,其过程也比想象得艰难很多。在开始翻译本书之前,译者曾乐观地估计可以较快地完成本书的翻译,可是真正开始之后才发现,由于本书的跨度大(从内容上,本书覆盖了UNIX、Windows操作系统的诸多底层知识;模糊测试的对象从本地应用跨越到网络应用和Web应用;在工具层面,展示了让人目不暇接的诸多工具;在扩展层面,还进入生物信息学,介绍了各种前沿的自动化协议分析的算法和工具),翻译起来让译者不免心中惴惴。翻译时遇到不能确定的地方,译者只能反复验证,尽力避免错漏;对于书中作者的小幽默,如果不能确切理解,也尽量反复参照,尽力体现作者的原意。不得不说,如果没有符隆美编辑的不断催促和鼓励,没有家人的支持,恐怕译者真不一定有勇气投入这么多的周末和假期,最终完成这本书的翻译。
不过,在“抱怨”投入了大量的时间来翻译这本书之外,翻译这本书的过程也着实让译者收获不小。模糊测试是一个并不算新的领域,但这个领域得到足够重视的历史并不算长。最早,模糊测试是安全研究者手中的秘密武器,他们通过这种强力武器发现应用中存在的问题,把自己变成像魔术师一样(这一点儿没有夸张,我原来一直仰视那些能发现UNIX中稀奇古怪的漏洞的安全人员,但当从本书中发现我也可以做到同样的事情时,就不再对这些曾经的“魔法师”心生敬畏了)。在那个年代,模糊测试仅出现在“美国黑帽大会”及其他以安全研究者为主的社区中,离普通的开发者和测试者甚为遥远。但随着软件产品的数量越来越多,以及越来越多的主流应用被部署在互联网上,安全性问题成了一个越来越严重的问题。在这种背景下,模糊测试技术才被更多的人接受,并逐渐开始走入一般组织的开发和测试群体中。
模糊测试是一种通过高度自动化的手段,在产品发布之前发现产品中存在的安全漏洞的测试方法,它的高度自动化和可重复的特性使得那些重视安全的前沿软件企业早就接纳了它。虽然模糊测试并不是安全性测试的唯一手段,但这种手段的有效性和效率已经得到了诸多大的软件企业的证实。如本书所言,微软建立了自己的安全性开发生命周期SDL,在整个产品开发周期中引入了模糊测试;而根据译者的经历,Google也在自己的产品开发过程中大量和普遍地使用模糊测试,帮助发现可能导致服务器DoS问题或数据泄漏的漏洞。而且,在自动化之外,模糊测试还能够充分利用测试执行者已有的知识,通过启发式列表、智能数据集,甚至是遗传算法等方法不断提高模糊测试的有效性和效率。
本书可能不是模糊测试领域最权威或具有最高技术含量的书,但却绝对是最系统和最具实践性的书,没有之一。无论你是开发工程师还是测试工程师,无论你是否有模糊测试或安全性测试的经验,这本书都不会让你失望。相信书中对模糊测试的系统性描述、列举的立即可用的工具和精彩的案例分析,都能使读者对安全性和模糊测试有较为深入的思考和体会。作为一种能够有效降低安全性测试参与门槛的技术,模糊测试――你值得拥有。
本书的英文版成书于2007年(出版于2007年7月),书中作为示例的某些目标应用已经经历了多次大的版本更新,甚至退出了市场,书中描述的工具可能也已经经历了大的改进和提升,甚至书中提供的某些网站和网页都已经不复存在,但贯穿在书中的方法并未过时。即使在这个云计算已经不再新鲜、移动互联网应用已经开始崭露头角的时代,要想对现有的云应用和移动设备上的应用程序进行模糊测试,仍然可以在本书中轻易地找到对应的方法与工具。“时间是判断经典的最好方法”这句话对本书来说非常适用,尽管成书的时间离现在已有6年(在计算机领域,6年可是相当长的时间!),但是,本书的核心价值丝毫没有被时间所影响。本书风格轻松,内容深入浅出(作者在序中特别提到,这本书在写作时尽量兼顾对模糊测试有实践经验和没有经验的读者),虽然覆盖了相当多的主题,但每个主题的讲述都相当系统,既有理论框架的讲解,也有工具使用的介绍,甚至还包括具体的案例分析。译者在翻译的过程中常常有豁然开朗的感觉,希望本书的各位读者在细品本书时,也同样有豁然开朗之后的喜悦之情。
当然,由于本书中涉及的内容较多,自然对读者的预备知识也有一定的要求。不过,本书的几位作者已经充分考虑到了对模糊测试领域不熟悉的读者的需求,因此,只要读者具有一定的编码基础(本书中使用了Python、C#等多种编程语言,读者无须对本书涉及的这些语言都非常熟悉,但需要有一定的对编码的了解),对书中涉及的操作系统(Windows和Unix/Linux操作系统)和计算机网络有所了解,就能够顺利地阅读本书,并从中获得不小的收益。
介绍完本书的内容,接下来对本书的翻译进行一些说明。首先,为了尽量保持本书的“原汁原味”,译者保留了原书的所有内容,包括原书的前言、序、致谢、索引等。对于书中饶有特色的每章开头的小布什的语录,本书也尽量保持原味,以原始英文的形式添加在每一章开头。小布什总统以语言能力差和浓重的德州口音著称,本书每一章开头引用的语录都带有非常有趣的错误(语法错误、辞不达意或其他问题),有兴趣的读者可以尝试自己端详和揣摩,看看能不能发现其中的有趣之处。当然,为了方便读者,本书最后的附录也给出了译者对每一条引用语录的解读,供读者参考。
本书的译者有两位,主要的译者是段念,翻译了本书的大部分内容并负责统稿,另一位译者是赵勇,承担了本书的第9章、第10章、第14章的翻译工作。虽然译者已经尽力使本书能够以较为完美的形态出现在读者面前,但由于译者能力所限,如在书中出现错误和疏漏,还请读者不吝指正。
最后,感谢电子工业出版社的符隆美编辑,没有她的耐心和坚定的推动,这本书的翻译是否能最终完成尚不可知;感谢各位参与稿件审阅的评委,你们的意见为本书增色不少;我个人还要感谢我的家人,感谢我的母亲对我们的照顾,感谢我的妻子和儿子,你们容忍了我在许多个周末和晚上把本应该陪你们的时间投入在本书上,在我快要失去耐心的时候继续给我动力。
段念
2013年4月8日
原书序
"I Know the human being and fish can coexist peacefully."
――George W. Bush, Saginaw, Mich., Sept. 29, 2000
本书介绍
模糊测试的概念已经存在了将近20年,但直到最近,模糊测试才得到广泛的关注。2006年,流行的客户端应用,包括微软的Internet Explorer、Word以及Excel等都受到了大量漏洞的影响,而这些漏洞中的大部分是通过模糊测试发现的。模糊测试的有效应用催生了新的工具,也导致越来越多的漏洞被发现。另外,作为第一本模糊测试方面的正式出版书籍,本书也说明了大众对模糊测试的兴趣越来越大。
由于多年来一直混迹于漏洞研究社区,我们已经在日常工作中使用过许多模糊测试技术,从不成熟的hobby项目到成熟的商业产品。本书的每位作者都拥有开发私有和公开的模糊测试器的经验。希望这本混合了我们几位作者的经验和研究项目的前沿书籍能够给读者带来收获。
适合阅读本书的读者
安全性书籍和文章通常由安全性研究者写成,目标读者同样是安全性研究者。我们强烈地相信,如果安全性仍然只由安全性团队来负责,漏洞的数量和严重性将继续增长。因此,我们尽最大的努力使得本书可以面向更广泛的人群,包括模糊测试新手和在这方面有经验的读者。
指望仅仅在产品发布前由安全团队快速进行审计就能发布出安全的应用是不现实的。开发人员和QA团队再也不能说“安全性不是我的问题――我们有安全团队为此操心”了。安全性现在必须成为每个人的问题。安全性必须贯穿软件开发生命周期(SDLC)的各个阶段,而不是仅仅在最后阶段。
要求开发和QA团队关注安全性可能是一种苛求,尤其是对那些以前从未被如此要求的团队来说。我们相信模糊测试提供了一种面向更广受众的独特的漏洞发现方法,因为模糊测试可以高度自动化地运行。在期望安全研究者可以从本书中获得有价值信息的同时,我们也希望开发者和QA团队同样可以从本书中得到有价值的信息。模糊测试可以而且应该成为集成在软件开发生命周期中的一个部分,它不仅应该出现在测试阶段,也应该出现在开发阶段。越早发现缺陷,修复缺陷的代价就越低。
读者应该具有的预备知识(Prerequisites)
模糊测试是一个覆盖面很广的主题。在本书中我们涉及了一些并非专门面向模糊测试的主题,也假定读者具有一些预备知识。在阅读本书之前,读者至少应该对编程、计算机网络有基本的了解。模糊测试完全是自动化的安全测试,因此很自然地,本书的许多内容都与工具构建相关。我们故意为这些任务选择了多种编程语言。我们根据手头的任务选择编程语言,但编程语言的多样化也表明模糊测试可以使用多种方式达成。读者当然不必了解本书中用到的所有编程语言,但理解一两种语言将有助于读者从这些章节中收获更多。
在本书中我们描述了许多漏洞的细节,并讨论了如何通过模糊测试来发现这些漏洞。然而,定义或研究漏洞本身并不是我们的目标。目前已经有不少出色的书籍讨论了这方面的主题。如果你想要寻找软件漏洞方面的经典书籍,Greg Hoglund的《软件剖析》(Exploiting Software)和《黑客大曝光》(Hacking Exposed)系列,以及Jack Kiziol和David Litchfield的《Shellcoder手册》(Shellcoder's Handbook)等都是不错的参考。