首页>参考读物>计算机科学与技术>综合

C和C++安全编码
作者 : (美)Robert C. Seacord 著
译者 : 荣耀 罗翼 译
丛书名 : C++设计新思维
出版日期 : 2009-11-03
ISBN : 978-7-111-26148-3
定价 : 45.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 242
开本 : 16
原书名 : Secure Coding in C and C++
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书是关于C和C++安全编码的著作。本书介绍了C和C++程序中已经导致危险的、破坏性的基本编程错误,包括在字符串、指针、动态内存管理、整数、格式化输出、文件I/O等中的漏洞或缺陷。本书还提供了对这些编程错误的深入剖析,并给出缓解策略,以减少或消除恶意利用漏洞的风险。

图书特色

“信息系统的安全性并未随受攻击的数目和程度的增长同步得到改善。为了改变这一现状,必须改进用于创建系统的策略和技术。具体来说,必须从一开始就将安全性构建于系统之内而不是将其作为补救措施附加进来,这正是本书的要旨。这本书向软件开发者详尽展示了如何构建高质量的系统,它们具有更少的漏洞,不易遭受代价高昂或后果严重的攻击。任何开发者在进行重大的项目开发之前都应该阅读本书。”
——Frank Abagnale,作家、讲师、欺诈预防和安全文献领域资深顾问

洞悉软件漏洞的成因,熟知规避之道
通常而言,可利用的软件漏洞都由本可避免的软件缺陷所导致。在分析了过去10年中近18000份漏洞报告后,CERT/CC发现少量的根本原因导致了这些漏洞的产生。本书识别并解释了这些原因,而且展示了预防利用漏洞的步骤。此外,本书还鼓励程序员采用最佳安全实践,并培养安全的开发理念,这不但有助于保护软件免遭当前的攻击,更可使它们免遭将来可能发生的攻击。
基于CERT/CC的报告和总结,Robert Seacord系统地揭示了最可能导致安全缺陷的编程错误,展示了这些缺陷的利用方式,介绍了可能导致的后果,并提供了安全的替代做法。

本书特别讨论了如下技术细节:
■ 改善任何C/C++应用程序的整体安全性。
■ 抵御利用不安全的字符串操作逻辑的缓冲区溢出和栈粉碎攻击。
■ 避免因对动态内存管理函数的不当使用而导致的漏洞和安全缺陷。
■ 消除与整数相关的问题,包括整数溢出、符号错误以及截断错误等。
■ 正确地使用格式化输出函数,避免引入格式字符串漏洞。
■ 避免I/O漏洞,包括竞争条件等。
本书提供了许多针对Windows和Linux的安全代码、不安全代码以及利用程序的例子。如果你负责创建安全的C或C++软件,或者需要保持这类软件的安全性,本书为你提供了详尽的专家级协助。在这方面,其他任何书籍都望尘莫及。

作者简介
Robert Seacord 1982年,Robert Seacord在IBM开始职业编程生涯,1985年开始进行C编程,1992年开始C++编程。Robert目前是SEI CERT/CC的高级漏洞分析师。他还是《Building Systems from Commercial Components》 (Addison-Wesley, 2002)和《Modernizing Legacy Systems》(Addison-Wesley, 2003)的合著者。
CERT/CC除了从事其他与安全有关的活动外,还定期分析软件漏洞报告并评估它们对Internet以及其他关键的基础设施造成的风险。在这本书中,除了作者外,另有几位CERT成员也贡献了他们的专家经验。

图书前言

1988年11月爆发的Morris蠕虫事件造成当时全球十分之一的互联网系统陷入瘫痪,作为对该事件的响应,当月美国国防部高级研究计划局(Defense Advanced Research Projects Agency,DARPA)成立了CERT协调中心(CERT Coordination Center,CERT/CC)。CERT/CC位于宾夕法尼亚州匹兹堡市的软件工程研究院(Software Engineering Institute,SEI)内,这是一个由美国国防部发起的研发中心,受联邦政府资助。
  CERT/CC最初的工作重点是对各种网络事件作出快速响应和分析。这里所说的事件既包括得逞的攻击(如系统受损与拒绝服务等),也包括未得逞的攻击企图、探测和扫描。自1988年以来,CERT/CC共已接到逾22 665个报告计算机安全事件或咨询有关信息的热线电话,已处理总共逾319 992起计算机安全事件,而且每年报告的事件数目呈持续增长的态势。
  虽然对事件作出及时响应必不可少,然而这还不足以保护互联网和互联的信息系统的安全。分析表明,大部分计算机安全事件是由于特洛伊木马、社会工程学(social engineering)以及软件漏洞利用(exploitation)所造成的,包括软件缺陷、设计决策、配置决策以及非预期的系统间交互等。CERT/CC监控漏洞信息的公共来源并经常性地接到漏洞报告。自1995年以来,CERT已经收到超过16 726份漏洞报告。每当收到一份报告,CERT/CC就会分析报告所述的可能的漏洞,并与软件制造者协作,通知其产品中存在安全缺陷,促进并追踪其对问题的响应。
  和事件报告相似,漏洞报告也以惊人的速度持续增长。虽然对漏洞的管理抑制了这一进程的发展,然而对于解决互联网和信息系统的安全问题来说,这同样远远不够。为了解决日益增加的漏洞和事件问题,必须采取相应的措施:在源头予以有效地控制它们,即必须在软件的开发阶段和随后的维护工作中就避免引入软件漏洞。对现有漏洞的分析表明,大部分漏洞都是由少数根本原因所导致。本书的目标就在于告诉开发者有关这些根本原因的知识,并介绍避免引入漏洞的措施。
读者
  对任何采用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章:描述了和文件I/O相关的常见漏洞,包括竞争条件(race condition)和TOCTOU(time of creation, time of use)漏洞。
   第8章:推荐了一些可以整体改善C/C++应用程序安全性的具体开发实践。这些建议是对每一章中用于解决特定漏洞问题的推荐做法的补充。
  本书包含了数百个安全和不安全的代码示例以及漏洞利用示例。尽管其中有一些涉及与其他语言的比较,然而几乎所有例子都是C和C++的。这些例子都在Windows和Linux操作系统上验证过。除非另有说明,微软Windows程序示例均使用Visual C++ .NET编译,在运行Intel Pentium 4处理器的Windows 2000 专业版平台上测试。Linux程序示例则使用GNU gcc/g++编译,在运行Intel Pentium 4处理器的Red Hat Linux 9平台测试。
  尽管具体的示例程序通常已在一个或多个环境下编译和测试过,然而漏洞都被予以评估,以决定它们是具体相关于以下因素,或者具有包含以下因素的普遍性:编译器版本、操作系统、微处理器、适用的C或C++标准、小端表示法(即:低位在前、高位在后)或大端表示法(即:高位在前、低位在后)架构,以及执行栈架构等。
  本书集中讨论最常导致软件漏洞的C和C++编程缺陷。尽管如此,限于篇幅,本书并未涵盖漏洞的每一个可能来源。与本书有关的附加信息、更新信息、事件以及新闻参见http://www. cert.org/books/secure-coding/。书中讨论的漏洞也是参照引用来自US-CERT漏洞数据库(参见http://www.kb.cert.org/vuls/)的实际例子。
致谢
  在此我要感谢为本书问世作出贡献的每一个人。首先要感谢Noopur Davis、Chad Dougherty、Fred Long、Rob Murawski、Nancy Mead、Robert Mead、Dan Plakosh、Jason Rafail以及David Riley,他们为本书作出了直接的贡献。还要感谢研究人员的贡献,他们是Omar Alhazmi、Mathew Conover、Jeffery S.Gennari、Oded Horovitz、Poul-Henning Kamp、Doug Lea、Yashwant Malaiya以及John Robert。
  我要感谢SEI和CERT/CC的管理层,感谢他们的鼓励以及对我劳动成果的支持。他们是Jeffrey Carpenter、Shawn Hernan、Jeffrey Havrilla和Rich Pethia。
  还要感谢编辑Peter Gordon和Addison-Wesley的其他一些职员,他们是Jennifer Andrews、Kim Boedigheimer、Chanda Leary-Coutu、John Fuller、Eric Garulay、Marie McKinley以及Elizabeth Ryan。
  我还要感谢审稿人给予的深思熟虑的评论和富有洞察力的见解,他们是Tad Anderson、William Bulley、Corey Cohen、Will Dormann、Robin Eric Fredericksen、Amit Kalani、John Lambert、Jeffrey Lanza、David LeBlanc、William Fithen、Gary McGraw、Michael Howard、Ken MacInnis、Randy Meyers、Dave Mundie、Patrick Mueller、Craig Partridge、Brad Rubbo、Time Shimeall以及Katie Washok。
  我要感谢CERT/CC小组其他成员的支持和协助,没有他们我永远都不可能完成本书。最后(但并非最不重要),感谢单位内部的编辑和图书管理员,他们的帮助使得本书的最终问世成为可能,他们是Rachel Callison、Pamela Curtis、Len Estrin、Eric Hayes、Karen Riley、 Sheila Rosenthal以及Barbara White。

上架指导

计算机\程序设计

封底文字

“信息系统的安全性并未随受攻击的数目和老练程度的增长同步得到改善。为了改变这一现状,必须改进用于创建系统的策略和技术。具体来说,必须从一开始就将安全性构建于系统之内而不是将其作为补救措施附加进来。这正是《C/C++安全编程》一书的要旨。这本书向软件开发者详尽展示了如何构建高质量的系统,它们具有更少的漏洞,不易遭受代价高昂或后果严重的攻击。任何开发者在着手任何严肃的项目开发之前都应该阅读本书。”
          ——Frank Abagnale,作家,讲师,欺诈预防和安全文献领域资深顾问

 熟知软件漏洞的成因与规避之道
 通常而言,可利用的软件漏洞都是由本可避免的软件缺陷所导致。在分析了过去十年中18000份漏洞报告后,CERT/CC发现数量相对小的原因导致了这些漏洞的发生。本书识别并解释了这些原因,而且展示了预防利用(exploitation)的步骤。此外,本书还鼓励程序员采用最佳安全实践,并培养安全的开发理念,这不但有助于保护软件免遭眼下的攻击,更可使它们免遭将来可能发生的攻击。
  基于CERT/CC的报告和总结,Robert Seacord系统地揭示了最可能导致安全缺陷的编程错误,展示了这些缺陷的利用方式,介绍了可能导致的后果,并提供了安全的替代做法。
  本书特别讨论了如下技术细节:
l 改善任何C/C++应用程序的整体安全性。
l 抵御利用不安全的字符串操作逻辑的缓冲区溢出和栈粉碎攻击。
l 避免因对动态内存管理函数的不当使用而导致的漏洞和安全缺陷。
l 消除与整数相关的问题,包括整数溢出、符号错误以及截断错误等。
l 正确地使用格式化输出函数,避免引入格式字符串漏洞。
l 避免I/O漏洞,包括竞争条件等。
《C/C++安全编程》提供了许多针对Windows 和Linux的安全的代码、不安全的代码以及利用程序(exploits)的例子。如果你负责创建安全的C或C++软件,或者需要保持这类软件的安全性,本书为你提供了详尽的专家级协助,在这方面,其价值非其他任何书籍可比。

图书序言

现代社会对网络化软件系统的依赖与日俱增,以这些系统为目标的攻击数量亦与日俱增。形形色色的针对政府、公司、教育机构以及个人系统的攻击,已经导致诸多严重的后果:敏感数据丢失或被破坏,系统受损,生产效率降低,以及财务损失,等等。
  尽管今天互联网上的攻击行为大多不过是恶作剧,然而越来越多的证据表明,罪犯、恐怖分子以及其他心怀叵测的人已将软件系统中的漏洞视作达成其不可告人目的的手段。近年来,每年发现的软件漏洞逾4000个。这些漏洞的成因包括:在设计和实现方面对如何保护系统考虑不周;在开发实践方面对消除会导致安全缺陷的实现瑕疵关注不够。
  伴随着软件漏洞日益增加,攻击手法也与时俱进,变得越发老练、有效。入侵者在发现软件产品中的漏洞后,可以迅速开发出利用漏洞的脚本,继而使用这些脚本威胁计算机的安全。更糟糕的是,还将这些脚本与其他攻击者共享。这些脚本与一些“自动扫描网络以窥探脆弱系统”的程序联合起来,攻击那些脆弱系统,危害其安全,甚至利用它们进一步传播攻击。
  由于每年都会发现大量的漏洞,系统管理员为了给既有系统打补丁日益疲于奔命。打补丁有时并非易事,并可能会导致意想不到的副作用。在厂商发布一个安全补丁后,可能需耗时数月乃至数年的时间,才能有90%~95%的受影响计算机完成修补工作。
  互联网用户已经严重依赖于这样一种解决方式:互联网社群作为一个整体,对发生的安全攻击快速作出反应,以确保将损害降至最低,并将攻击迅速击溃。然而,显而易见,如今的“反应式解决方案”已经达到其效力的极限。虽然个体响应组织均为将漏洞处理过程精简化和自动化而努力工作,然而今天商业软件产品中的漏洞数目,已经多至只有财力雄厚的组织才能应对漏洞修复工作,其他组织实质上已心有余而力不足。
  没有任何证据表明大多数产品中的安全问题得到了改善,很多软件开发者尚未很好地理解从各种漏洞成因中获得的教训,或者尚未运用能够起作用的缓解策略,CERT/CC不断在同一软件产品的更新版中发现早期版本即已存在的同类漏洞就是明证。
  这些因素交织在一起,预示着我们完全可以相信,很多攻击甚至会在我们所实际希望的最短响应时间内造成巨大的经济损失和服务崩溃。
虽然积极且协调的反应仍然不可或缺,但我们还必须构建出不易被破坏的更安全的系统。
关于本书
  本书致力于解决C和C++中已经导致危险的、破坏性的常见软件漏洞的基本编程错误。这些漏洞自CERT 1988年创立以来就记录在案。针对导致这些漏洞的编程错误,本书出色地给出了深度工程分析和缓解策略,可以富有成效地减少或消除漏洞被恶意利用的风险。
  自Robert于1987年4月加入SEI以来,我就一直与他共事。Robert是一位知识渊博、技术熟练的软件工程师,在软件漏洞细节分析和表达洞察成果方面卓尔不凡。作为研究结果,本书细致而精确地分析了软件开发者面临的常见问题,并提供了实用的解决方案。Robert在软件开发方面具备的宽广背景,也使得他擅长在性能、易用性以及其他在开发安全代码过程中必须考虑的质量特性之间作出权衡。除了Robert外,本书还凝聚了CERT积累和提炼的知识,以及CERT/CC漏洞分析小组、CERT操作人员、SEI编辑和后勤人员的杰出工作。
Richard D.Pethia
CERT主管

作者简介

(美)Robert C. Seacord 著:Robert Seacord 自1982年起,Robert Seacord在IBM开始职业编程生涯,1985年起进行C编程,1992年起开始C++编程。Robert目前是SEI CERT/CC的高级漏洞分析师。他还是《Building Systems from Commercial Components》 (Addison-Wesley, 2002)和《Modernizing Legacy Systems 》(Addison-Wesley, 2003)的合著者。 除了从事其他与安全有关的活动外,CERT/CC定期分析软件漏洞报告并评估它们对Internet以及其他关键的基础设施造成的风险。在这本书中,除了作者外,另有几位CERT成员也贡献了他们的专家经验。

译者简介

荣耀 罗翼 译:暂无简介

译者序

现代社会离不开计算机软件系统的顺畅运行。然而总有一些黑客或骇客为了政治、经济或纯粹的个人满足目的攻击软件系统,其中大部分得逞的攻击是因为软件系统自身存在漏洞。尽管事后的补救措施可以在一定程度上减少损失,然而如果在软件创建之初就避免引入漏洞,攻击者就无法轻易获得下手的机会。避免软件引入漏洞首先是程序员的责任。C和C++语言的天性导致程序员必须小心谨慎才能编写出没有漏洞的程序。
  Robert Seacord是SEI CERT/CC资深漏洞分析师,具有二十多年的编程经验,洞悉C和C++在软件项目中的应用状况,这本书可以说专门为C和C++程序员而写(尽管其他语言的开发人员或技术管理者也可以从阅读本书中深深受益),并不要求读者事先掌握多少计算机安全背景知识。作者显然善于讲解复杂的技术,深入浅出地阐述了软件中的各种安全漏洞及成因,给出了很多著名的安全漏洞例子,并揭示黑客如何利用程序中的漏洞侵入并破坏系统。
  保障软件系统的安全主要有两种方式:配置安全和编程安全,前者面向系统管理员和系统用户,后者则要求程序员掌握安全的编程技术。也许完全消除漏洞是难以达到的目标(世界上根本不存在没有bug的软件),但程序员可以组合使用多种方式尽可能消除软件缺陷。作者展示了许多不安全的编程习惯和相应的改进措施,推荐了有效的软件工具和经过验证的方法,有助于我们编写出更健壮、更不容易遭受攻击的软件系统。
  每一位开发商业和项目软件系统的C或C++程序员都应该阅读本书,尤其是那些编写会被很多用户通过互联网下载安装的软件的程序员,那些编写控制电力、电信、金融、军事、航空航天等关键设施的软件系统的程序员,以及其他所有认为自己编写的软件对他人很重要的程序员。对于有漏洞的软件系统,即使没有遭受黑客的恶意攻击,出乎意料的输入或操作也可能会导致灾难性的后果。由于每一个安全漏洞也可能是导致程序崩溃或产生错误输出的缺陷,因此,即便没有黑客或骇客盯上我们的软件,程序员也有责任保证软件系统没有漏洞。
  使用Java或C#之类的语言编写软件无疑可以少引入安全漏洞,然而C和C++语言的地位无法取代。为何使用C和C++语言编程?因为对效率和灵活控制底层的苛求。如果你是一名C或C++程序员,希望本书在带给你宝贵的技术和良好阅读体验的同时,也能为你带来危机感—现在就复审以前的代码是否存在安全漏洞,并避免在未来的代码中引入安全漏洞。毕竟编写无漏洞的软件需要的不单是技术,更有高度的责任感。
  感谢读者朋友给予的一贯支持,你们的批评和赞扬对我来说同样重要。感谢初译者罗翼先生作出的贡献。感谢机械工业出版社华章分社的陈冀康先生、周茂辉编辑以及所有其他为本书的出版作出贡献的不知名的人们。感谢导师王建东老师的理解与支持。感谢朱艳和荣,你们是我生活的全部。
  祝各位阅读快乐!
荣耀
2009年5月
南京师范大学中北学院
www.royaloo.com

图书目录

译者序
序言
前言
作译者简介
第1章 夹缝求生 1
1.1 衡量危险 3
1.1.1 损失的现状 4
1.1.2 威胁的来源 5
1.1.3 软件安全 6
1.2 安全概念 7
1.2.1 安全策略 8
1.2.2 安全缺陷 8
1.2.3 漏洞 9
1.2.4 利用 10
1.2.5 缓解措施 10
1.3 C和C++ 11
1.3.1 C和C++简史 11
1.3.2 C存在的问题 12
1.3.3 遗留代码 13
1.3.4 其他语言 13
1.4 开发平台 13
1.4.1 操作系统 13
1.4.2 编译器 15
1.5 本章小结 16
1.6 阅读材料 16
第2章 字符串 17
2.1 字符串特征 17
2.2 常见的字符串操作错误 18
2.2.1 无界字符串复制 18
2.2.2 差一错误 20
2.2.3 空结尾错误 21
2.2.4 字符串截断 21
2.2.5 与函数无关的字符串错误 21
2.3 字符串漏洞 22
2.3.1 安全缺陷 23
2.3.2 缓冲区溢出 24
2.4 进程内存组织 24
2.5 栈粉碎 27
2.6 代码注入 30
2.7 弧注入 32
2.8 缓解策略 34
2.8.1 预防 34
2.8.2 字符串流 44
2.8.3 检测和恢复 45
2.9 著名的漏洞 48
2.9.1 远程登录 49
2.9.2 Kerberos 49
2.9.3 Metamail 49
2.10 本章小结 50
2.11 阅读材料 51
第3章 指针诡计 52
3.1 数据位置 52
3.2 函数指针 53
3.3 数据指针 54
3.4 修改指令指针 54
3.5 全局偏移表 56
3.6 .dtors区 57
3.7 虚指针 58
3.8 atexit()和on_exit()函数 60
3.9 longjmp()函数 61
3.10 异常处理 62
3.10.1 结构化异常处理 62
3.10.2 系统默认异常处理 64
3.11 缓解策略 65
3.11.1 W^X 65
3.11.2 Canaries 65
3.12 本章小结 65
3.13 阅读材料 66
第4章 动态内存管理 67
4.1 动态内存管理 67
4.2 常见的动态内存管理错误 69
4.2.1 初始化 69
4.2.2 检查返回值失败 70
4.2.3 引用已释放的内存 71
4.2.4 多次释放内存 72
4.2.5 不匹配的内存管理函数 73
4.2.6 未正确区分标量和数组 73
4.2.7 对分配函数的不当使用 73
4.3 Doug Lea的内存分配器 74
4.3.1 内存管理 74
4.3.2 缓冲区溢出 76
4.3.3 双重释放漏洞 80
4.3.4 写入已释放的内存 83
4.4 RtlHeap 83
4.4.1 Win32中的内存管理 83
4.4.2 RtlHeap的数据结构 85
4.4.3 缓冲区溢出 88
4.4.4 缓冲区溢出(再回顾) 89
4.4.5 写入已释放内存 92
4.4.6 双重释放 92
4.4.7 look-aside表 95
4.5 缓解策略 95
4.5.1 空指针 95
4.5.2 一致的内存管理约定 96
4.5.3 堆完整性检测 96
4.5.4 phkmalloc 97
4.5.5 随机化 98
4.5.6 哨位页 98
4.5.7 OpenBSD 98
4.5.8 运行时分析工具 99
4.5.9 Windows XP SP2 100
4.6 著名的漏洞 101
4.6.1 CVS缓冲区溢出漏洞 102
4.6.2 微软数据访问组件(MDAC) 102
4.6.3 CVS服务器双重释放漏洞 103
4.6.4 MIT Kerberos 5中的漏洞 103
4.7 本章小结 103
4.8 阅读材料 103
第5章 整数安全 105
5.1 整数 105
5.1.1 整数表示法 106
5.1.2 整数类型 106
5.1.3 整数取值范围 108
5.2 整型转换 109
5.2.1 整型提升 109
5.2.2 整数转换级别 109
5.2.3 从无符号整型转换 111
5.2.4 从带符号整型转换 112
5.2.5 带符号或无符号字符 113
5.2.6 普通算术转换 113
5.3 整数错误情形 113
5.3.1 整数溢出 114
5.3.2 符号错误 115
5.3.3 截断错误 115
5.4 整数操作 116
5.4.1 加法 117
5.4.2 减法 119
5.4.3 乘法 120
5.4.4 除法 122
5.5 漏洞 126
5.5.1 整数溢出 126
5.5.2 符号错误 127
5.5.3 截断错误 128
5.6 非异常的整数逻辑错误 129
5.7 缓解策略 130
5.7.1 范围检查 130
5.7.2 强类型 131
5.7.3 编译器运行时检查 131
5.7.4 安全的整数操作 132
5.7.5 任意精度的算术 136
5.7.6 测试 137
5.7.7 源代码审查 137
5.8 著名的漏洞 137
5.8.1 XDR库 137
5.8.2 Windows DirectX MIDI库 138
5.8.3 bash 138
5.9 本章小结 139
5.10 阅读材料 140
第6章 格式化输出 141
6.1 变参函数 142
6.1.1 ANSI C标准参数 142
6.1.2 Unix System V Varargs 144
6.2 格式化输出函数 144
6.2.1 格式字符串 145
6.2.2 GCC 147
6.2.3 Visual C++.NET 147
6.3 对格式化输出函数的漏洞利用 148
6.3.1 缓冲区溢出 148
6.3.2 输出流 149
6.3.3 使程序崩溃 149
6.3.4 查看栈内容 150
6.3.5 查看内存内容 151
6.3.6 覆写内存 152
6.3.7 国际化 156
6.4 栈随机化 156
6.4.1 阻碍栈随机化 156
6.4.2 以双字的格式写地址 157
6.4.3 直接参数存取 158
6.5 缓解策略 160
6.5.1 静态内容的动态使用 160
6.5.2 限制字节写入 161
6.5.3 ISO/IEC TR 24731 162
6.5.4 iostream与stdio 162
6.5.5 测试 163
6.5.6 编译器检查 164
6.5.7 词法分析 164
6.5.8 静态污点分析 164
6.5.9 调整变参函数的实现 165
6.5.10 Exec Shield 166
6.5.11 FormatGuard 166
6.5.12 Libsafe 167
6.5.13 静态二进制分析 167
6.6 著名的漏洞 168
6.6.1 华盛顿大学FTP Daemon 168
6.6.2 CDE ToolTalk 168
6.7 本章小结 169
6.8 阅读材料 170
第7章 文件I/O 171
7.1 并发 171
7.1.1 竞争条件 171
7.1.2 互斥和死锁 172
7.2 检查时间和使用时间 173
7.3 作为锁的文件和文件锁定 174
7.4 文件系统利用 176
7.4.1 符号链接利用 176
7.4.2 临时文件打开利用 178
7.4.3 unlink()竞争利用 180
7.4.4 受信文件名 180
7.4.5 非唯一的临时文件名 181
7.5 缓解策略 181
7.5.1 关闭竞争窗口 182
7.5.2 消除竞争对象 184
7.5.3 控制对竞争对象的访问 187
7.5.4 竞争侦测工具 188
7.6 本章小结 189
第8章 推荐的实践 190
8.1 安全的软件开发原则 191
8.1.1 机制经济性原则 192
8.1.2 失败-保险默认原则 192
8.1.3 完全仲裁原则 192
8.1.4 开放式设计原则 192
8.1.5 特权分离原则 192
8.1.6 最小特权原则 193
8.1.7 最少公共机制原则 193
8.1.8 心理可接受性原则 194
8.2 系统质量需求工程 194
8.3 威胁建模 195
8.4 使用/误用案例 196
8.5 架构与设计 196
8.6 现成软件 198
8.6.1 现有代码中的漏洞 198
8.6.2 安全的包装器 199
8.7 编译器检查 199
8.8 输入验证 200
8.9 数据净化 201
8.9.1 黑名单 201
8.9.2 白名单 202
8.9.3 测试 203
8.10 静态分析 203
8.10.1 Fortify 203
8.10.2 Prexis 204
8.10.3 Prevent 204
8.10.4 PREfix和PREfast 205
8.11 质量保证 205
8.11.1 渗透测试 205
8.11.2 模糊测试 206
8.11.3 代码审计 206
8.11.4 开发人员准则与检查清单 206
8.11.5 独立安全审查 207
8.12 内存权限 207
8.12.1 W^X 207
8.12.2 PaX 208
8.12.3 数据执行防护 208
8.13 深层防御 209
8.14 TSP-Secure 209
8.14.1 计划和跟踪 209
8.14.2 质量管理 210
8.15 本章小结 211
8.16 阅读材料 211
参考文献 212
缩略语 223

教学资源推荐
作者: (美)Maurice J.Bach  著
作者: 禹晶 孙卫东 肖创柏 编著
作者: 中国计算机学会 主编
作者: [美]克利福德·斯坦(Clifford Stein) 罗伯特 L. 戴斯得尔(Robert L. Drysdale) 肯尼斯·博加特(Kenneth Bogart) 著
参考读物推荐
作者: (美)Joseph J.Bambara Paul R.Allen等