首页>参考读物>计算机科学与技术>软件与程序设计

C和C++安全编码(原书第2版)
作者 : (美)Robert C.Seacord 著
译者 : 卢涛 译 李颖 审校
丛书名 : 华章程序员书库
出版日期 : 2013-12-23
ISBN : 978-7-111-44279-0
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 393
开本 : 16
原书名 : Secure Coding in C and C++
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书识别并解释这些根源和可以采取的步骤,以防止漏洞被利用。此外,本书鼓励程序员采用安全的最佳实践,并建立一个安全的心态,防止软件在未来遭到攻击,而不只是目前。 利用CERT的报告和结论,作者系统性地识别最有可能导致安全漏洞的程序错误,显示了如何利用它们,审查可能产生的后果,并提出了安全的替代方案。
本书主要内容:提高任何C或C + +应用程序的整体安全性;阻止缓冲区溢出、栈溢出和返返回导向编程的攻击,后者利用不安全的字符串操作逻辑;避免不正确使用动态内存管理功能引起的漏洞和安全缺陷;消除由于无符号整数溢出、无符号整数包装和截断误差产生的与整数有关的问题;执行安全I / O,避免文件系统的漏洞;正确地使用格式化输出的功能,而无需引入格式字符串漏洞;避免竞争条件和其他可利用的漏洞,而开发并行代码;数百个关于安全代码、不安全代码和漏洞的例子。 
第2版新增内容: C11和C + +11的更新;关于字符串、动态内存管理和整数安全的章节大幅修订;对并发性的章节;通过卡耐基梅隆大学的开放学习计划(OLI)访问网上安全编码课程。

图书特色

前勒口
作者简介
Robert C. Seacord?资深软件安全专家,拥有30余年软件行业工作经验,卡内基-梅隆大学的软件工程研究所(SEI)CERT计划的安全编码技术经理和计算机科学与信息网络学院的兼职教授,在ISO/IEC JTC1/SC22/WG14的C编程语言国际标准化工作组代表卡内基-梅隆大学工作。著有《C安全编码标准》和《Java安全编码标准》等多本著作,还发表了40余篇论文,涉及软件的安全性、基于组件的软件工程、基于Web的系统设计、传统系统的现代化建设、组件库和搜索引擎、用户界面设计以及开发等多个领域。
封面
C/C++安全编程领域的“标准”著作,资深安全专家撰写,美国CERT主管亲自作序推荐,权威性毋庸置疑
详细阐述C/C++语言及其相关库固有的安全问题和陷阱,系统总结导致软件漏洞的常见编码错误,并给出了应对的解决方案
对C/C++软件中常见漏洞的危害、被利用方式、检测方法和应对之道进行了全方位讲解,包含大量编码练习,实践性强
封底
悉软件漏洞的成因,熟知规避之道
常被利用的软件漏洞通常都由本可避免的软件缺陷造成。通过对1988年以来几万份漏洞报告的分析,CERT确定了引起绝大多数漏洞的少数原因。本书识别并解释了这些原因,并展示了可以采取哪些措施来防止它们被利用。此外,本书鼓励程序员采用安全的最佳实践,培养安全的理念,以保护软件不仅免受现在的攻击,也免受未来的攻击。根据CERT的报告和结论,Robert C. Seacord系统地识别了最有可能导致安全漏洞的程序错误,显示了它们被利用的方式,考察了其潜在的后果,并提出了安全的替代方案。
本书主要内容
提高任何C或C++应用程序的整体安全性
阻止利用不安全的字符串操作逻辑进行缓冲区溢出、栈溢出以及面向返回值的编程攻击
避免因不正确使用动态内存管理函数而导致的漏洞和安全缺陷
消除因有符号整数溢出、无符号整数回绕和截断误差而导致的整数相关问题
执行安全的I/O操作,避免文件系统漏洞
正确使用格式化输出函数,避免引入格式字符串漏洞
在开发并发代码时,避免竞争条件和其他可利用的漏洞
第2版特色
针对C11和C++11进行了更新
对字符串(第2章)、动态内存管理(第4章)、整数安全(第5章)等章节做了重大修改
增加了新的一章“并发”(第7章)
增加了可以通过卡内基-梅隆大学的开放式学习计划(OLI)访问的在线安全编码课程
本书介绍了Windows和Linux上数以百计的例子,包括安全的代码、不安全的代码和利用方法。如果你负责创建安全的C或C++软件,或者需要保证它们的安全,本书将为你提供详尽的专家级援助。

图书前言

1988年11月爆发的Morris蠕虫事件造成当时全球10%的互联网系统陷入瘫痪,作为对该事件的回应,当月美国国防部高级研究计划局(Defense Advanced Research Projects Agency,DARPA)成立了CERT。CERT位于宾夕法尼亚州匹兹堡市的软件工程研究院(Software Engineering Institute,SEI)内,这是一个由美国国防部发起的研发中心,并受联邦政府资助。
  CERT最初的工作重点是对各种网络事件做出快速响应和分析。这里所说的事件既包括得逞的攻击(如系统受损与拒绝服务等),也包括未得逞的攻击企图、探测和扫描。自1988年以来,CERT共已接到逾22 665个报告计算机安全事件或咨询有关信息的热线电话,已处理逾319 992起计算机安全事件,而且每年报告的事件数目呈持续增长的态势。
  虽然对事件做出及时响应必不可少,但是这还不足以保护互联网和互联的信息系统的安全。分析表明,大部分计算机安全事件是由特洛伊木马、社会工程学(social engineering)以及软件漏洞利用(exploitation)造成的,包括软件缺陷、设计决策、配置决策以及非预期的系统间交互等。CERT监控漏洞信息的公共来源并且经常性地收到漏洞报告。自1995年以来,CERT已经收到超过16 726份漏洞报告。每收到一份报告,CERT就会分析报告所述的可能的漏洞,并与软件制造者协作,通知其产品中存在安全缺陷,促进并追踪其对问题的响应。 
  和事件报告相似,漏洞报告也以惊人的速度持续增长。虽然对漏洞的管理抑制了这一进程的发展,但是对于解决互联网和信息系统的安全问题来说,这同样远远不够。为了解决日益增加的漏洞和事件问题,必须采取相应的措施:在源头有效地控制它们,即必须在软件的开发阶段和随后的维护工作中避免引入软件漏洞。对现有漏洞的分析表明,大部分漏洞都是由少数根本原因导致。本书旨在传授开发者有关这些根本原因的知识,并介绍避免引入漏洞的措施。
本书读者对象
  对任何采用C和C++开发或维护软件的人来说,本书都是非常有价值的。
  如果你是一位C/C++程序员,本书将教你如何识别会导致软件漏洞的常见编程错误,理解这些错误是如何被利用的,并以安全的方式实现解决方案。
  如果你是一位软件项目经理,本书将教你识别软件漏洞的风险及导致的后果,对投资开发安全软件给出指导。
  如果你是一位计算机专业的学生,本书将教你有用的编程实践,帮助你避免不良的开发习惯,使你能够在职业生涯中开发出安全的程序。
  如果你是一位安全分析师,本书对常见的漏洞提供了细致的描述,并提供了检测漏洞的方法和实用的规避措施。
本书组织和内容
  本书提供了C和C++编程中关于安全实践方面的实用指导。安全的程序需要安全的设计,然而,如果开发者不了解C和C++编程中许多固有的安全陷阱,那么即便是最佳设计也可能最终导致不安全的程序。本书对C和C++中常见的编程错误提供了详细的解释,并描述了这些错误是如何导致有漏洞的代码的。本书重点讨论C和C++编程语言以及相关库固有的安全问题,而不强调和外部系统(如数据库和Web服务器等)的交互中牵涉的安全问题。这些方面话题丰富,应单独讨论。希望本书对于涉及开发安全的C和C++程序的任何人都有所裨益,而不管具体开发何种应用。
  本书围绕着软件工程师经常实现的、可能会导致安全问题的功能(例如,格式化输出和算术运算等)组织内容。每一章都描述了一些会导致漏洞的不安全编程实践和常见的错误、这些编程缺陷如何被利用、这种恶意利用所导致的后果,以及替代的安全做法等。对于软件漏洞的根源问题,例如,缓冲区溢出、整型范围错误和无效的格式字符串等,都有详细的解释。每一章都包含检测既有代码中漏洞的技术,以及如何安全地实现所需功能的措施。
  本书包含以下各章。
  第1章:概述问题,介绍安全术语和概念,并对为何C和C++程序中存在如此多的漏洞发表看法。
  第2章:描述C和C++中的字符串操作、常见的安全缺陷以及由此导致的漏洞(包括缓冲区溢出攻击和栈溢出攻击),还介绍了代码注入(code injection)和弧注入(arc injection)两种漏洞利用方式。
  第3章:介绍任意内存写(arbitrary memory write)漏洞利用方式,它允许攻击者对内存中任意位置的一个地址进行写操作。该章描述这些漏洞利用方式如何用于在受害机器上执行任意的代码。由“任意内存写”导致的漏洞在稍后的章节中讨论。
  第4章:描述动态内存管理,讨论动态分配的缓冲区溢出、写入已释放内存,以及重复释放(double-free)漏洞。
  第5章:讨论整数安全问题(即与整数操作相关的安全主题),包括整数溢出、符号错误以及截断错误等。
  第6章:描述格式化输出函数的正确和错误的用法。对因这些函数的错误使用所导致的格式字符串和缓冲区溢出漏洞都有讨论。
  第7章:重点介绍并发和可能导致死锁、竞争条件和无效的内存访问序列的漏洞。
  第8章:描述和文件I/O相关的常见漏洞,包括竞争条件(race condition)和检查时间与使用时间(Time Of Check, Time Of Use, TOCTOU)漏洞。
  第9章:推荐一些可以整体改善C/C++应用程序安全性的具体开发实践。 这些建议是对每一章中用于解决特定漏洞问题的推荐做法的补充。
  本书包含数百个安全和不安全的代码示例以及漏洞利用示例。尽管其中有一些涉及与其他语言的比较,但是几乎所有例子都是用C和C++编写的。这些例子都在Windows和Linux操作系统上验证过。具体的示例程序通常已在一个或多个特定环境下编译和测试过,同时漏洞都被予以评估,以确定它们是否具体相关于以下因素,或者具有包含以下因素的普遍性:编译器版本、操作系统、微处理器、适用的C或C++标准、小端表示法(即低位在前、高位在后)或大端表示法(即高位在前、低位在后)架构,以及执行栈架构等。
  本书以及基于它的在线课程,重点讨论通常导致软件漏洞的常见C和C++编程缺陷。尽管如此,限于篇幅,本书并未涵盖漏洞的每一个可能来源。与本书有关的附加与更新信息、活动时间表以及新闻参见www.cert.org/books/secure-coding/。书中讨论的漏洞也是参照来自US-CERT漏洞数据库(参见www.kb.cert.org/vuls/)的实际例子。
  可以通过位于https://oli.cmu.edu/的卡内基梅隆大学开放学习计划(Open Learning Initiative,OLI)。输入课程的密钥0321822137来访问与本书配套的安全编码在线课程。

上架指导

计算机\程序设计

封底文字

悉软件漏洞的成因,熟知规避之道
常被利用的软件漏洞通常都由本可避免的软件缺陷造成。通过对1988年以来几万份漏洞报告的分析,CERT确定了引起绝大多数漏洞的少数原因。本书识别并解释了这些原因,并展示了可以采取哪些措施来防止它们被利用。此外,本书鼓励程序员采用安全的最佳实践,培养安全的理念,以保护软件不仅免受现在的攻击,也免受未来的攻击。根据CERT的报告和结论,Robert C. Seacord系统地识别了最有可能导致安全漏洞的程序错误,显示了它们被利用的方式,考察了其潜在的后果,并提出了安全的替代方案。
本书主要内容
 提高任何C或C + +应用程序的整体安全性
 阻止利用不安全的字符串操作逻辑进行缓冲区溢出、堆栈溢出以及面向返回值的编程攻击
 避免因不正确使用动态内存管理函数而导致的漏洞和安全缺陷
 消除因有符号整数溢出、无符号整数回绕和截断误差而导致的整数相关问题
 执行安全的I/O操作,避免文件系统漏洞
 正确使用格式化输出函数,避免引入格式字符串漏洞
 在开发并发代码时,避免竞争条件和其他可利用的漏洞

第2版特色
 针对C11和C + +11进行了更新
 对字符串(第2章)、动态内存管理(第4章)、整数安全(第5章)等章节做了重大修改
 增加了新的一章“并发”(第7章)
 增加了可以通过卡内基-梅隆大学的开放式学习计划(OLI)访问的在线安全编码课程

  本书介绍了数以百计Windows和Linux上的例子,包括安全的代码、不安全的代码和利用方法。如果你负责创建安全的C或C + +软件,或者需要保证它们的安全,本书将为您提供详尽的专家级援助。

作者简介

(美)Robert C.Seacord 著:暂无简介

译者简介

卢涛 译 李颖 审校:暂无简介

译者序

随着信息技术与相关产业的发展,人类的工作、学习与生活越来越依赖于计算机软件和网络,但与此同时,安全事件层出不穷,网络攻击造成的损失也与日俱增。就在本书的翻译过程中,国际上发生了“棱镜门”事件。“信息战士”的工作使受害国家的安全都受到了威胁,更不用说窃取普通公民的网上交易信息以及个人信息了。然而,这些信息与人们的生产、生活息息相关,信息的盗用给人们造成了财产和无形的损失。这使人们比以往更加关注安全,逐渐意识到完善网络安全势在必行,各级政府以及各企事业单位在安全方面的投入也在不断提高。本书正是在这样的背景下产生的,它紧贴实际编程活动,深入浅出,帮你解决实际应用中的安全漏洞问题。
  我曾经编写过C和C++代码,对这两门编程语言都深有感触。C和C++语言是实现许多操作系统和服务器软件的开发语言,支撑着许多为数以万计的用户提供服务的重要应用程序,必须坚实可靠才能持续不断地正常运行。特别是移动互联网的发展,大大增加了应用程序的种类和数量,不安全的应用程序也会造成安全漏洞迅速地大面积传播。因为C和C++语言产生的年代较早并且设计为与底层设备打交道,所以对效率要求很高,这使得这两种语言存在固有的安全问题,虽然语言标准的制定者意识到了这个问题,并提出了许多更加安全的解决方案,但大量的遗留代码中仍然包含不安全的实现和库函数调用,这些都会不时引发安全问题。许多安全检测工具可以帮助人们检查出代码的漏洞,但却不能帮助他们把它们修改正确,而且对C语言中某些功能理解上的偏差往往会导致误用。总而言之,编写安全代码完全是开发人员的责任,而开发人员若要具备这方面的技能,就得掌握相关的理论并在实践中自觉加以运用。
  本书涵盖安全编码各个方面,人们普遍能意识到指针是C和C++中最灵活的功能,也是程序员最容易犯错的地方,为强调其重要性有人曾说过“不会用指针的C程序员不是真正的C程序员”,这是因为指针直接对内存地址进行读、写访问,它的重要性不言而喻。但与此同时,这两门语言的另一些要点却常常被忽视。然而编写安全代码的从业人员,则需要全面地了解字符串、整数、内存管理、格式化输入与输出、文件操作中的安全陷阱,并学会规避之法。此外,现代应用程序绝大多数具备并发访问能力,因此本书新增了这些方面的内容,使之更符合实际需要。本书每个主题都配有实例,读者能从中了解产生安全漏洞的缘由和正确的做法。本书还总结了安全编码的实施指南,指出软件开发组织应用这些规程可以提高安全软件的开发效率并更能保证产品符合安全要求。本书引用了许多相关著作,以便于读者进一步了解某个主题的细节。总之,本书值得每个从业人员在开始实际编程活动前阅读。
  此外,本书作者Robert C. Seacord是业界著名的安全专家,著有多本安全编程著作。他所领导的CERT项目定期发布安全报告,并与软件厂商合作解决安全问题,在安全领域硕果累累。本书很多内容引用自实际的安全问题,并结合了国际标准C11和C++11展开叙述,实用且跟踪了C和C++语言的最新发展。因此,我郑重向您推荐此书,希望它能在检测及修复安全漏洞上对您有所帮助!
  感谢机械工业出版社谢晓芳编辑邀请我翻译本书并对译文细致地审查和润色。感谢本书第1版译者荣耀和罗翼先生做出的贡献,他们的辛勤工作保障了本书的顺利完成。
  感谢我的妻子李颖一如既往的支持和儿子卢〇一的鼓励,他们是我工作的动力。
  希望这本书能对读者有所帮助。由于译者经验和水平有限,译文中难免有不妥之处,恳请读者批评指正!

卢涛

图书目录

译者序

前言
致谢
第1章 夹缝求生 1
1.1  衡量危险 4
1.1.1  损失的现状 4
1.1.2  威胁的来源 6
1.1.3  软件安全 7
1.2  安全概念 8
1.2.1  安全策略 9
1.2.2  安全缺陷 10
1.2.3  漏洞 10
1.2.4  漏洞利用 11
1.2.5  缓解措施 12
1.3  C和C++ 12
1.3.1  C和C++简史 13
1.3.2  C存在的问题 14
1.3.3  遗留代码 17
1.3.4  其他语言 17
1.4  开发平台 17
1.4.1  操作系统 18
1.4.2  编译器 18
1.5  小结 18
1.6  阅读材料 19
第2章 字符串 20
2.1  字符串 20
2.1.1  字符串数据类型 20
2.1.2  UTF-8 22
2.1.3  宽字符串 23
2.1.4  字符串字面值 23
2.1.5  C++中的字符串 25
2.1.6  字符类型 26
2.1.7  计算字符串大小 27
2.2  常见的字符串操作错误 29
2.2.1  无界字符串复制 29
2.2.2  差一错误 32
2.2.3  空字符结尾错误 33
2.2.4  字符串截断 34
2.2.5  与函数无关的字符串错误 34
2.3  字符串漏洞及其利用 35
2.3.1  被污染的数据 35
2.3.2  IsPasswordOK()的安全缺陷 36
2.3.3  缓冲区溢出 37
2.3.4  进程内存组织 37
2.3.5  栈管理 38
2.3.6  栈溢出 40
2.3.7  代码注入 44
2.3.8  弧注入 47
2.3.9  返回导向编程 48
2.4  字符串漏洞缓解策略 49
2.4.1  字符串处理 49
2.4.2  C11附录K边界检查接口 50
2.4.3  动态分配函数 52
2.4.4  C++ std::basic_string 54
2.4.5  使字符串对象的引用失效 55
2.4.6  使用basic_string的其他常见错误 57
2.5  字符串处理函数 57
2.5.1  gets() 57
2.5.2  C99 57
2.5.3  C11附录K边界检查接口:gets_s() 59
2.5.4  动态分配函数 60
2.5.5  strcpy()和strcat() 61
2.5.6  C99 61
2.5.7  strncpy()和strncat() 64
2.5.8  memcpy()和memmove() 68
2.5.9  strlen() 68
2.6  运行时保护策略 69
2.6.1  检测和恢复 69
2.6.2  输入验证 70
2.6.3  对象大小检查 70
2.6.4  Visual Studio中编译器生成的运行时检查 73
2.6.5  栈探测仪 74
2.6.6  栈溢出保护器 75
2.6.7  操作系统策略 76
2.6.8  检测和恢复 76
2.6.9  不可执行栈 77
2.6.10  W^X 77
2.6.11  PaX 79
2.6.12  未来发展方向 79
2.7  著名的漏洞 80
2.7.1  远程登录 80
2.7.2  Kerberos 81
2.8  小结 81
2.9  阅读材料 82
第3章 指针诡计 83
3.1  数据位置 83
3.2  函数指针 84
3.3  对象指针 85
3.4  修改指令指针 86
3.5  全局偏移表 87
3.6  .dtors区 89
3.7  虚指针 90
3.8  atexit()和on_exit()函数 91
3.9  longjmp()函数 93
3.10  异常处理 94
3.10.1  结构化异常处理 94
3.10.2  系统默认异常处理 96
3.11  缓解策略 96
3.11.1  栈探测仪 96
3.11.2  W^X 97
3.11.3  对函数指针编码和解码 97
3.12  小结 98
3.13  阅读材料 98
第4章 动态内存管理 99
4.1  C内存管理 100
4.1.1  C标准内存管理函数 100
4.1.2  对齐 101
4.1.3  alloca()和变长数组 102
4.2  常见的C内存管理错误 103
4.2.1  初始化错误 103
4.2.2  未检查返回值 104
4.2.3  Null或无效指针解引用 106
4.2.4  引用已释放内存 106
4.2.5  多次释放内存 107
4.2.6  内存泄漏 108
4.2.7  零长度分配 108
4.2.8  DR # 400 110
4.3  C++的动态内存管理 110
4.3.1  分配函数 111
4.3.2  释放函数 115
4.3.3  垃圾回收 115
4.4  常见的C++内存管理错误 117
4.4.1  未能正确检查分配失败 117
4.4.2  不正确配对的内存管理函数 118
4.4.3  多次释放内存 120
4.4.4  释放函数抛出一个异常 123
4.5  内存管理器 123
4.6  Doug Lea的内存分配器 124
4.7  双重释放漏洞 131
4.7.1  写入已释放的内存 134
4.7.2  RtlHeap 135
4.7.3  缓冲区溢出(终极版) 140
4.8  缓解策略 146
4.8.1  空指针 146
4.8.2  一致的内存管理约定 146
4.8.3  phkmalloc 147
4.8.4  随机化 148
4.8.5  OpenBSD 148
4.8.6  jemalloc内存管理器 149
4.8.7  静态分析 149
4.8.8  运行时分析工具 150
4.9  值得注意的漏洞 153
4.9.1  CVS缓冲区溢出漏洞 153
4.9.2  Microsoft数据访问组件 153
4.9.3  CVS服务器双重释放漏洞 154
4.9.4  MIT Kerberos 5中的漏洞 154
4.10  小结 154
第5章 整数安全 155
5.1  整数安全导论 155
5.2  整数数据类型 156
5.2.1  无符号整数类型 156
5.2.2  回绕 157
5.2.3  有符号整数类型 159
5.2.4  有符号整数的取值范围 162
5.2.5  整数溢出 163
5.2.6  字符类型 165
5.2.7  数据模型 165
5.2.8  其他整数类型 166
5.3  整数转换 169
5.3.1  转换整数 169
5.3.2  整数转换级别 169
5.3.3  整数类型提升 170
5.3.4  普通算术转换 171
5.3.5  由无符号整数类型转换 171
5.3.6  由有符号整数类型转换 173
5.3.7  转换的影响 176
5.4  整数操作 176
5.4.1  赋值 177
5.4.2  加法 179
5.4.3  减法 183
5.4.4  乘法 185
5.4.5  除法和求余 188
5.4.6  移位 192
5.5  整数漏洞 194
5.5.1  漏洞 194
5.5.2  回绕 194
5.5.3  转换和截断错误 196
5.5.4  非异常的整数逻辑错误 197
5.6  缓解策略 198
5.6.1  整数类型的选择 198
5.6.2  抽象数据类型 200
5.6.3  任意精度算术 200
5.6.4  范围检查 201
5.6.5  前提条件和后验条件测试 203
5.6.6  安全整数库 204
5.6.7  溢出检测 205
5.6.8  编译器生成的运行时检查 206
5.6.9  可验证范围操作 207
5.6.10  仿佛无限范围整数模型 208
5.6.11  测试与分析 208
5.7  小结 210
第6章 格式化输出 211
6.1  变参函数 212
6.2  格式化输出函数 214
6.2.1  格式字符串 215
6.2.2  GCC 216
6.2.3  Visual C++ 217
6.3  对格式化输出函数的漏洞利用 217
6.3.1  缓冲区溢出 218
6.3.2  输出流 219
6.3.3  使程序崩溃 219
6.3.4  查看栈内容 219
6.3.5  查看内存内容 221
6.3.6  覆写内存 222
6.3.7  国际化 226
6.3.8  宽字符格式字符串漏洞 226
6.4  栈随机化 226
6.4.1  阻碍栈随机化 227
6.4.2  以双字的格式写地址 227
6.4.3  直接参数访问 228
6.5  缓解策略 230
6.5.1  排除用户输入的格式字符串 230
6.5.2  静态内容的动态使用 230
6.5.3  限制字节写入 231
6.5.4  C11附录K边界检查接口 232
6.5.5  iostream与stdio 233
6.5.6  测试 234
6.5.7  编译器检查 234
6.5.8  静态污点分析 234
6.5.9  调整变参函数的实现 235
6.5.10  Exec Shield 236
6.5.11  FormatGuard 236
6.5.12  静态二进制分析 237
6.6  著名的漏洞 238
6.6.1  华盛顿大学FTP Daemon 238
6.6.2  CDE ToolTalk 238
6.6.3  Ettercap NG-0.7.2版 238
6.7  小结 239
6.8  阅读材料 240
第7章 并发 241
7.1  多线程 241
7.2  并行 242
7.2.1  数据并行 243
7.2.2  任务并行 245
7.3  性能目标 245
7.4  常见错误 247
7.4.1  竞争条件 247
7.4.2  损坏的值 248
7.4.3  易变的对象 249
7.5  缓解策略 250
7.5.1  内存模型 251
7.5.2  同步原语 253
7.5.3  线程角色分析(研究) 259
7.5.4  不可变的数据结构 260
7.5.5  并发代码属性 261
7.6  缓解陷阱 261
7.6.1  死锁 262
7.6.2  过早释放锁 266
7.6.3  争用 267
7.6.4  ABA问题 268
7.7  值得注意的漏洞 272
7.7.1  在多核动态随机访问存储器系统中的DoS攻击 272
7.7.2  系统调用包装器中的并发漏洞 272
7.8  小结 273
第8章 文件I/O 275
8.1  文件I/O基础 275
8.1.1  文件系统 275
8.1.2  特殊文件 277
8.2  文件I/O接口 278
8.2.1  数据流 278
8.2.2  打开和关闭文件 279
8.2.3  POSIX 280
8.2.4  C++中的文件I/O 281
8.3  访问控制 282
8.3.1  UNIX文件权限 282
8.3.2  进程特权 284
8.3.3  更改特权 285
8.3.4  管理特权 288
8.3.5  管理权限 292
8.4  文件鉴定 295
8.4.1  目录遍历 295
8.4.2  等价错误 297
8.4.3  符号链接 298
8.4.4  规范化 300
8.4.5  硬链接 302
8.4.6  设备文件 304
8.4.7  文件属性 306
8.5  竞争条件 308
8.5.1  检查时间和使用时间 308
8.5.2  创建而不替换 309
8.5.3  独占访问 312
8.5.4  共享目录 313
8.6  缓解策略 315
8.6.1  关闭竞争窗口 315
8.6.2  消除竞争对象 319
8.6.3  控制对竞争对象的访问 320
8.6.4  竞争检测工具 322
8.7  小结 322
第9章 推荐的实践 324
9.1  安全开发生命周期 324
9.1.1  TSP-Secure 326
9.1.2  计划和跟踪 327
9.1.3  质量管理 328
9.2  安全培训 329
9.3  要求 330
9.3.1  安全编码标准 330
9.3.2  安全质量需求工程 330
9.3.3  用例/误用例 332
9.4  设计 333
9.4.1  安全的软件开发原则 334
9.4.2  威胁建模 337
9.4.3  分析攻击面 338
9.4.4  现有代码中的漏洞 338
9.4.5  安全包装器 339
9.4.6  输入验证 339
9.4.7  信任边界 340
9.4.8  黑名单 342
9.4.9  白名单 343
9.4.10  测试 343
9.5  实现 344
9.5.1  编译器检查 344
9.5.2  仿佛无限范围整数模型 345
9.5.3  有安全保证的C/C++ 345
9.5.4  静态分析 346
9.5.5  源代码分析实验室 348
9.5.6  深层防御 349
9.6  验证 350
9.6.1  静态分析 350
9.6.2  渗透测试 350
9.6.3  模糊测试 351
9.6.4  代码审计 352
9.6.5  开发人员准则与检查清单 352
9.6.6  独立安全审查 353
9.6.7  攻击面回顾 353
9.7  小结 354
9.8  阅读材料 354
参考文献 355
缩略语 373

教学资源推荐
作者: [美]约翰·R. 莱文(John R. Levine) 著
作者: 郑阿奇 梁敬东
作者: 罗晓芳 李慧 孙涛 孙大为 朱鸣华 杨微 编著
作者: [美] 凯·霍斯特曼(Cay Horstmann) 著
参考读物推荐
作者: [美]丹尼尔?希夫曼(Daniel Shiffman)著
作者: [瑞典]托尼·奥尔森(Tony Olsson) 著