软件剖析――代码攻防之道
基本信息
- 作者: Greg Hoglund,Gary McGraw [作译者介绍]
- 译者: 邓劲生
- 出版社:清华大学出版社
- ISBN:730210445X
- 上架时间:2005-5-11
- 出版日期:2005 年1月
- 开本:185×260
- 页码:400
- 版次:1-1
- 所属分类:
计算机 > 软件工程及软件方法学 > 软件项目管理
编辑推荐
本书是第15届Jolt大奖入围作品,由两名软件专家写出的一本具有启发意义的书,它进入了最聪明和最邪恶的破坏者的思想,并揭示了这些人的思维方式。本书应该是一本基本读物——所有需要安全的人都应仔细阅读!
推荐阅读
内容简介回到顶部↑
本书详细解释了恶意的软件攻击者所采用的技术,描述了各种攻击模式,并且展示了如何发现新的薄弱环节。作者讨论了实现bug和架构缺陷的区别、逆向工程工具、服务器/客户机软件的脆弱性、恶意输入攻击、缓冲区溢出等内容,并且介绍了一个简单的windows xp内核rootkit。本书要求读者具备全面的系统硬件、操作系统软件结构、网络协议和编程(特别是c/c++和java)知识。本书是面向有意成为软件安全专家的指南,适用于对编程有一定经验的软件设计师和软件测试师。
软件是如何可被码解的?攻击者是如何有目地地破解软件的?为什么防火墙、指令检测系统以及反病毒软件不能将黑客们拒之门外?什么工具可以用来破解软件?本书为您提供了详细的答案。书中提供了大量黑客们破解软件的示例,包括实际攻击、攻击模式、攻击工具以及相关破解技术,并全面阐述了逆向工程、典型的对服务器软件的攻击、对客户端软件的攻击、制造恶意输入的技术,以及缓冲区溢出的技术细节等内容。在深入阅读本书后,您就可洞悉软件世界的激烈斗争,成为安全领域的专爱。
软件是如何可被码解的?攻击者是如何有目地地破解软件的?为什么防火墙、指令检测系统以及反病毒软件不能将黑客们拒之门外?什么工具可以用来破解软件?本书为您提供了详细的答案。书中提供了大量黑客们破解软件的示例,包括实际攻击、攻击模式、攻击工具以及相关破解技术,并全面阐述了逆向工程、典型的对服务器软件的攻击、对客户端软件的攻击、制造恶意输入的技术,以及缓冲区溢出的技术细节等内容。在深入阅读本书后,您就可洞悉软件世界的激烈斗争,成为安全领域的专爱。
作译者回到顶部↑
本书提供作译者介绍
Greg Hoglund博士十几年来一直是软件安全领域的领军人物。他创建并记录了第一个基于Windows NT的rootkit,可以通过站点www.rootkit,com找到相关内容。
Gary McGraw博士Cigital公司的CTO,也是软件和应用程序安全领域的世界级权威。McGraw博士与其他作者合著了Java Security(Wiley,1996)和Bui/ding Secure Software(Addison-Wesley,2002)。他同时还兼任一些大公司的顾问,致力于软件安全的科学研究,并提供安全建议。
邓劲生,计算机专业博士。先后在国防科技大学网络中心、.. << 查看详细
Gary McGraw博士Cigital公司的CTO,也是软件和应用程序安全领域的世界级权威。McGraw博士与其他作者合著了Java Security(Wiley,1996)和Bui/ding Secure Software(Addison-Wesley,2002)。他同时还兼任一些大公司的顾问,致力于软件安全的科学研究,并提供安全建议。
邓劲生,计算机专业博士。先后在国防科技大学网络中心、.. << 查看详细
目录回到顶部↑
第1章 软件——问题的根源
1.1 软件简史
1.1.1 软件和信息战
1.1.2 数字谍报手段
1.2 不良软件很普遍
1.2.1 nasa(美国国家航空和宇宙航行局)的火星登陆器
1.2.2 丹佛机场行李管理系统
1.2.3 鱼鹰mv-22
1.2.4 美国军事系统自伤
1.2.5 microsoft和“爱”bug
1.3 问题三组合
1.3.1 复杂性
1.3.2 代码行数越多,bug就越多
1.3.3 可扩展性
1.3.4 连通性
1.3.5 结论
1.4 软件的未来
1.4.1 短期未来:2003—2004
1.4.2 中期未来:2005—2007
1.4.3 长期未来:2008—2010
1.1 软件简史
1.1.1 软件和信息战
1.1.2 数字谍报手段
1.2 不良软件很普遍
1.2.1 nasa(美国国家航空和宇宙航行局)的火星登陆器
1.2.2 丹佛机场行李管理系统
1.2.3 鱼鹰mv-22
1.2.4 美国军事系统自伤
1.2.5 microsoft和“爱”bug
1.3 问题三组合
1.3.1 复杂性
1.3.2 代码行数越多,bug就越多
1.3.3 可扩展性
1.3.4 连通性
1.3.5 结论
1.4 软件的未来
1.4.1 短期未来:2003—2004
1.4.2 中期未来:2005—2007
1.4.3 长期未来:2008—2010
译者序回到顶部↑
有人的地方,就有江湖。有软件的地方,就有破解和反破解的斗争。有句俗语说,税收和死亡是每个人都无法摆脱的;对于编程人员而言,恐怕还得加上一条:bug。那些可被外人利用而侵入软件系统的bug,有些是语言本身的固有缺陷,有些是编译工具所致,有些来源于操作系统平台的差异性,而更多的是系统复杂性伴生而来的编程人员顾此失彼。攻和防,犹如矛和盾,一直伴随着软件的发展历程。
从开始学习编程起,就有老师告诫我们说,在清楚业务逻辑之后,完成主要功能的代码本身编写起来并不难,但是耗费最大工作量的却是各种边界条件和可能分支的面面俱到。十多年过去了,编写的代码从十多行变成了十多万行,参与的人员从单干变成了多人协作,耗费的时间由一两次机时变成了成年累月的劳作。但是回头看时,却发现这条规则仍然有效,并且被归纳到著名的80/20中:20%的核心代码,需要80%甚至更多的周边代码来保卫。
从软件表现行为揣测内部运作机制,就如同从锁孔向房间内窥探一样,有时可以看到摆设的格局,或是衣帽架的位置,或是参差不齐的锁芯。攻击者此时就会采取不同的措施攻入房间,比如攀墙越窗、窃衣取钥或重造钥匙。随着互联网络的发展,系统脆弱点更多,而面临的对手更为强大,潜在的敌人遍布全球。测试师的任务,在很大程度上需要模拟攻击者的行径才能查漏补缺;从而要求不仅仅停留在输入某些臆想边界值的初级阶段,而是深入到和业务逻辑纠缠不清的可能被攻击点。
亡羊补牢,犹未为晚。但是弄清楚羊到底是怎么丢失的却至关重要。那些“坏孩子”到底是怎么玩的?大多数“好孩子”却懵懵懂懂甚至一无所知。在这本足以振聋发聩的著作里,真相跃然纸上。只是水无定势,那些攻击模式都在随机而变,需要我们与时俱进。在构建系统的过程中,考虑到缓冲区溢出之类的攻击模式已经被广泛利用,设计师们也不能再无动于衷了。只有意识到目标软件将会面临着的种种威胁,然后按图索骥来针对每个威胁提出解决方案,才能知己知彼百战不殆。
本书自从2004年初出版以来,一直在Amazon深受好评,排名居高不下。我们有幸首批读到本书并推介到国内,深感肩上担子的重大。本书的翻译工作由邓劲生组织并负责,白立军、张宇、李琳等完成部分初稿,(头衔)×××担任审校。在前后将近半年的时间里,李万红编辑在各个方面做了大量的工作。在征求书名的过程中,感谢DearBook、CSDN网站和《程序员》杂志社的大力协助,更要感谢400余位读者的热情积极,经过再三斟酌我们选用了《软件剖析—— 代码攻防之道》的译名,并择其优者赠送若干样书。
由于译者的水平有限,有些地方技术上或语义上理解不够到位,尽管我们已经做了相当多的努力,可能仍会有疏漏、偏颇甚至错误之处,恳请各位读者不吝指教,以期在后继印刷中修订。意见、建议和勘误表等事项都请和huben@nudt.edu.cn联系,我们将不胜感谢。
译者
2004年9月
从开始学习编程起,就有老师告诫我们说,在清楚业务逻辑之后,完成主要功能的代码本身编写起来并不难,但是耗费最大工作量的却是各种边界条件和可能分支的面面俱到。十多年过去了,编写的代码从十多行变成了十多万行,参与的人员从单干变成了多人协作,耗费的时间由一两次机时变成了成年累月的劳作。但是回头看时,却发现这条规则仍然有效,并且被归纳到著名的80/20中:20%的核心代码,需要80%甚至更多的周边代码来保卫。
从软件表现行为揣测内部运作机制,就如同从锁孔向房间内窥探一样,有时可以看到摆设的格局,或是衣帽架的位置,或是参差不齐的锁芯。攻击者此时就会采取不同的措施攻入房间,比如攀墙越窗、窃衣取钥或重造钥匙。随着互联网络的发展,系统脆弱点更多,而面临的对手更为强大,潜在的敌人遍布全球。测试师的任务,在很大程度上需要模拟攻击者的行径才能查漏补缺;从而要求不仅仅停留在输入某些臆想边界值的初级阶段,而是深入到和业务逻辑纠缠不清的可能被攻击点。
亡羊补牢,犹未为晚。但是弄清楚羊到底是怎么丢失的却至关重要。那些“坏孩子”到底是怎么玩的?大多数“好孩子”却懵懵懂懂甚至一无所知。在这本足以振聋发聩的著作里,真相跃然纸上。只是水无定势,那些攻击模式都在随机而变,需要我们与时俱进。在构建系统的过程中,考虑到缓冲区溢出之类的攻击模式已经被广泛利用,设计师们也不能再无动于衷了。只有意识到目标软件将会面临着的种种威胁,然后按图索骥来针对每个威胁提出解决方案,才能知己知彼百战不殆。
本书自从2004年初出版以来,一直在Amazon深受好评,排名居高不下。我们有幸首批读到本书并推介到国内,深感肩上担子的重大。本书的翻译工作由邓劲生组织并负责,白立军、张宇、李琳等完成部分初稿,(头衔)×××担任审校。在前后将近半年的时间里,李万红编辑在各个方面做了大量的工作。在征求书名的过程中,感谢DearBook、CSDN网站和《程序员》杂志社的大力协助,更要感谢400余位读者的热情积极,经过再三斟酌我们选用了《软件剖析—— 代码攻防之道》的译名,并择其优者赠送若干样书。
由于译者的水平有限,有些地方技术上或语义上理解不够到位,尽管我们已经做了相当多的努力,可能仍会有疏漏、偏颇甚至错误之处,恳请各位读者不吝指教,以期在后继印刷中修订。意见、建议和勘误表等事项都请和huben@nudt.edu.cn联系,我们将不胜感谢。
译者
2004年9月
前言回到顶部↑
当安全领域的专家意识到计算机系统的安全事实上就是软件行为的安全时,软件安全得到了推动性的发展。2001年出版的Building Secure Software一书(作者是Viega和McGraw),明确地指出了许多其他书籍都曾提到的软件安全问题是一个较为严重的问题。自此,安全领域的专家、软件开发者以及企业领导者都达成共识并急需更多相关的知识。
Building Secure Software一书主要是针对从开发者到管理者的软件专家,主要目的是帮助人们开发出更加安全的软件。Exploiting Software也适合于同类读者,但实际上主要针对那些有兴趣发现软件缺陷的安全领域的专家。那些抱怨缺乏软件安全技能的人们,包括开发团队和黑客们,应该对本书产生足够的兴趣。
本书描述如何破解代码。其目的是提供安全专家们需要直接面对的实际中的技术问题。本书也直接与软件安全和网络安全相关。当安全专家越来越关注软件安全问题的时候,他们也需要了解软件系统是如何被破解的。
在本书中所讨论的问题的解决方案,都能在Building Secure Software一书中找到。
我们相信,对软件安全问题和应用安全问题的实际探讨十分有价值。简单且大众化的由“暴发户”们所兜售的应用安全问题的解决方法(例如固定黑箱测试工具),仅仅是抓住了问题的表面。而本书是直切问题的实质。我们必须清楚自身所处的困境,而本书恰恰描述了这一点。
本书主要内容
本书深入探讨了现实世界中的软件破解问题,解释了它们是如何以及为什么被破解的,介绍了相关的攻击模式,以及它们是如何被发现的。本书还展示了如何发现新软件的脆弱点以及如何利用这个脆弱点去攻破机器。
第1章介绍了软件是计算机系统安全问题的根本原因。引入了“问题三组合”——复杂性、可扩展性以及连通性——并描述了为什么软件安全问题是不断成长的。还介绍了软件的一些特征以及它们在软件攻击中的含义。
第2章介绍了实现bug和体系结构缺陷之间的区别,讨论了开放式系统的安全问题,并解释了为什么冒险管理是最明智的办法。介绍了现实世界中的两个攻击案例:一个比较简单,另一个在技术上比较复杂。本章的核心是讨论攻击模式,给出了攻击模式是如何适应不同网络安全特征的,并在本书的其他部分也介绍了攻击模式。
第3章的主题是逆向工程。攻击者反汇编、反编译以及解构程序来理解程序是如何工作的,以及如何阻止程序这样工作。在这一章里还介绍了常用的灰箱分析技术,包括利用安全补丁作为攻击地图的思想等。介绍了交互式反汇编程序(Interactive Disassembler,IDA),它是黑客用于理解程序行为的工具。我们还仔细介绍了实用的黑客工具是如何被开发及使用的。
第4~7章讨论了攻击模式在实际中的使用案例。
第4章和第5章介绍了双端的客户机-服务器模型。第4章从Hacking Exposed一书[McCluYe等著,1999]中遗留下的部分开始谈起,介绍了可信任的输入、权限提升、代码注入、路径追踪、破解可信任以及其他专用于服务端软件的攻击技术。第5章介绍了如何利用混合信号、跨网站脚本以及移动代码来攻击客户端软件。同时本章还介绍了逆向攻击的问题。这两章都讨论了攻击模式和实际的攻击案例。
第6章介绍了有关恶意代码输入的问题。该问题已超出了我们所讨论的分割分析、代码追踪以及反向分析程序代码的问题。解决该问题需要有较好的编码技术。再次说明,不管是现实世界中的攻击案例还是攻击模式,本书都做了比较全面的介绍。
正如需要受到鞭笞的坏小子一样,致命性的缓冲区溢出是第7章的主题。本章高度关注在其他一些技术资料里已谈到的缓冲区攻击技术。讨论了嵌入式系统中的缓冲区溢出、数据库中的缓冲区溢出、Java环境下的缓冲区溢出以及基于内容的缓冲区溢出。本章讨论了如何发现潜在的各种类型的缓冲区溢出,包括栈溢出、运算错误、格式字符串的脆弱点、堆溢出,C++虚函数表,以及多阶段跳跃。详细介绍了一些特定操作平台上的攻击代码结构,例如x86、MIPS、SPARC和PA-RISC平台。同时,还介绍了一些攻破脆弱的安全系统的高级攻击代码结构技术,例如active armor和跳跃技术。本章还给出了大量的攻击模式。
第8章介绍了软件攻击中的顶尖技术——rootkit。利用该技术,攻击者可以完全控制整个系统。第8章的主要部分就是介绍基于Windows XP的一个实际rootkit。主要包括钩子调用技术、可执行重定向技术、隐藏进程及文件技术、网络支持技术和二进制代码的补丁技术。同时,本章还详细讨论了部分硬件技术,包括利用EEPROM隐藏rootkit的技术。当然除本章介绍的之外还有很多其他rootkit技术。
正如您所看到的,本书包括了从恶意输入到rootkit的软件攻击的各种技术,利用攻击模式、示例代码以及攻击示例,清晰地展示了那些恶意黑客们每天都会使用的攻击软件的技术。
读者对象
本书适用于网络管理员、安全顾问、信息人士、开发人员以及希望编写安全代码的程序员。
● 假如您管理着一个到处都有软件运行的网络,就应该阅读本书,以了解系统中可能存在的弱点,并知道如何让它们显现出来。
● 假如您是一名安全顾问,就应该阅读本书,这样才能有效地定位、理解并度量客户系统中的安全漏洞。
Building Secure Software一书主要是针对从开发者到管理者的软件专家,主要目的是帮助人们开发出更加安全的软件。Exploiting Software也适合于同类读者,但实际上主要针对那些有兴趣发现软件缺陷的安全领域的专家。那些抱怨缺乏软件安全技能的人们,包括开发团队和黑客们,应该对本书产生足够的兴趣。
本书描述如何破解代码。其目的是提供安全专家们需要直接面对的实际中的技术问题。本书也直接与软件安全和网络安全相关。当安全专家越来越关注软件安全问题的时候,他们也需要了解软件系统是如何被破解的。
在本书中所讨论的问题的解决方案,都能在Building Secure Software一书中找到。
我们相信,对软件安全问题和应用安全问题的实际探讨十分有价值。简单且大众化的由“暴发户”们所兜售的应用安全问题的解决方法(例如固定黑箱测试工具),仅仅是抓住了问题的表面。而本书是直切问题的实质。我们必须清楚自身所处的困境,而本书恰恰描述了这一点。
本书主要内容
本书深入探讨了现实世界中的软件破解问题,解释了它们是如何以及为什么被破解的,介绍了相关的攻击模式,以及它们是如何被发现的。本书还展示了如何发现新软件的脆弱点以及如何利用这个脆弱点去攻破机器。
第1章介绍了软件是计算机系统安全问题的根本原因。引入了“问题三组合”——复杂性、可扩展性以及连通性——并描述了为什么软件安全问题是不断成长的。还介绍了软件的一些特征以及它们在软件攻击中的含义。
第2章介绍了实现bug和体系结构缺陷之间的区别,讨论了开放式系统的安全问题,并解释了为什么冒险管理是最明智的办法。介绍了现实世界中的两个攻击案例:一个比较简单,另一个在技术上比较复杂。本章的核心是讨论攻击模式,给出了攻击模式是如何适应不同网络安全特征的,并在本书的其他部分也介绍了攻击模式。
第3章的主题是逆向工程。攻击者反汇编、反编译以及解构程序来理解程序是如何工作的,以及如何阻止程序这样工作。在这一章里还介绍了常用的灰箱分析技术,包括利用安全补丁作为攻击地图的思想等。介绍了交互式反汇编程序(Interactive Disassembler,IDA),它是黑客用于理解程序行为的工具。我们还仔细介绍了实用的黑客工具是如何被开发及使用的。
第4~7章讨论了攻击模式在实际中的使用案例。
第4章和第5章介绍了双端的客户机-服务器模型。第4章从Hacking Exposed一书[McCluYe等著,1999]中遗留下的部分开始谈起,介绍了可信任的输入、权限提升、代码注入、路径追踪、破解可信任以及其他专用于服务端软件的攻击技术。第5章介绍了如何利用混合信号、跨网站脚本以及移动代码来攻击客户端软件。同时本章还介绍了逆向攻击的问题。这两章都讨论了攻击模式和实际的攻击案例。
第6章介绍了有关恶意代码输入的问题。该问题已超出了我们所讨论的分割分析、代码追踪以及反向分析程序代码的问题。解决该问题需要有较好的编码技术。再次说明,不管是现实世界中的攻击案例还是攻击模式,本书都做了比较全面的介绍。
正如需要受到鞭笞的坏小子一样,致命性的缓冲区溢出是第7章的主题。本章高度关注在其他一些技术资料里已谈到的缓冲区攻击技术。讨论了嵌入式系统中的缓冲区溢出、数据库中的缓冲区溢出、Java环境下的缓冲区溢出以及基于内容的缓冲区溢出。本章讨论了如何发现潜在的各种类型的缓冲区溢出,包括栈溢出、运算错误、格式字符串的脆弱点、堆溢出,C++虚函数表,以及多阶段跳跃。详细介绍了一些特定操作平台上的攻击代码结构,例如x86、MIPS、SPARC和PA-RISC平台。同时,还介绍了一些攻破脆弱的安全系统的高级攻击代码结构技术,例如active armor和跳跃技术。本章还给出了大量的攻击模式。
第8章介绍了软件攻击中的顶尖技术——rootkit。利用该技术,攻击者可以完全控制整个系统。第8章的主要部分就是介绍基于Windows XP的一个实际rootkit。主要包括钩子调用技术、可执行重定向技术、隐藏进程及文件技术、网络支持技术和二进制代码的补丁技术。同时,本章还详细讨论了部分硬件技术,包括利用EEPROM隐藏rootkit的技术。当然除本章介绍的之外还有很多其他rootkit技术。
正如您所看到的,本书包括了从恶意输入到rootkit的软件攻击的各种技术,利用攻击模式、示例代码以及攻击示例,清晰地展示了那些恶意黑客们每天都会使用的攻击软件的技术。
读者对象
本书适用于网络管理员、安全顾问、信息人士、开发人员以及希望编写安全代码的程序员。
● 假如您管理着一个到处都有软件运行的网络,就应该阅读本书,以了解系统中可能存在的弱点,并知道如何让它们显现出来。
● 假如您是一名安全顾问,就应该阅读本书,这样才能有效地定位、理解并度量客户系统中的安全漏洞。
序言回到顶部↑
在2003年7月,我接到斯坦福大学计算机系David Dill教授的电话。他告诉我,由Diebold Election Systems公司开发的电子投票系统的的源代码已经泄漏到了Internet上,为了保证系统的安全性,有必要对系统作安全缺陷的检查。由于投票系统的开发商对于自身的代码一直是比较严谨的,因此这样的检查机会不是很多。但是在对系统作安全检查之后,结果却令我们大吃一惊:安全缺陷和代码缺陷是如此之多,以至于在攻击者面对如此之多,而又各不相同的系统缺陷时,在决定先使用哪种方案时大伤脑筋,从而导致攻击工作停滞不前(这种停滞并不是所推荐的安全策略)。在系统中,大块的复杂代码没有注释。只有一个静态密钥硬连接到加密的投票计算器的代码战术,使用不安全的伪随机数生成器和未加密的校验。而对CVS日志的检查也暴露了随意的源代码管理进程。整个系统中还存在其他严重的系统缺陷。
难道Diebold的投票机器在众多投票机器中是惟一的质量控制不好的例子吗?我认为并非如此。许多生产厂家,例如Diebold,都面临着需要以比竞争对手更快的速度把产品投放市场的巨大压力,而拥有最好的、功能最可靠系统的厂家最终会取胜。这样的激励模式只会照顾那些最快进入市场,产品功能最多的生产厂家,而不是那些产品最安全的厂家。让系统做到安全是很困难的,最终结果也不都是切实可行的。Diebold是不幸的,因为他们的代码会被公众检查并且证明是完全失败的。而大多数的厂家则相对比较安全,因为他们的代码仅在严格限制的非公开的情况下才会接受独立的调查分析。只有在代码出现问题后,这些厂家才会对安全性的问题稍加重视。Diebold的投票系统代码并不是我所遇到的第一个充满了安全缺陷的高复杂度代码,那为什么生产安全软件是如此之难呢?
答案很简单:因为安全软件很复杂。任何有编程经验的人都知道,在编写代码的时候面临着无数的选择方案。一个重要的选择是使用哪种编程语言。您是想为了获得系统性能的优化提高而使用灵活的指针运算呢,还是想为了避免缓冲区溢出而使用类型安全的语言以至减少系统的一些功能呢?每一项任务,在算法、参数以及数据结构的选择上都有无数的方案可选用。对每一块代码,都要决定如何命名变量,如何进行注释,甚至如何安排环绕着代码的空白区域。每一名程序员都不一样,因此每一名程序员都有可能做出不同的选择。大型的软件项目都是由团队开发的,而团队中的每一名程序员都必须能够理解并修改其他伙伴所编写的代码。管理自身所写的代码已经是一件很困难的事情了,更不用说去管理由他人编写的代码。对于一个有着成百上千行代码的程序,避免系统安全的脆弱性是一项极具挑战性的工作。而对于有着几百万行代码的程序,例如现代操作系统,则是不可能的任务。
然而,必须要创建大型的系统,因此我们不能仅仅是放弃或者安慰自己:保证系统的安全性是不可能的。McGraw和Hoglund先生做了大量优秀的工作,解释了软件为什么会被破解,展示了软件是如何被破解的,以及告诫读者如何避免写出容易被破解的代码。您可能想知道,向人们展示如何破解代码——正如本书所做的——是不是一个好主意?事实上,安全领域的专家也必须深思熟虑,在提示攻击和保持沉默之间作出权衡。本书采用这样一个观点:最大限度地降低软件中的脆弱点的编程方法就是理解脆弱点是如何产生的,以及攻击者是如何攻破它们的。为此目的,本书是任何想编写网络代码或者操作系统代码的人都必须阅读的。
在软件安全领域,《软件剖析——代码攻防之道》是我所见过的最好的一本书。Gary McGraw和Greg Hoglund先生长期致力于这一领域的研究。Gary McGraw的第一本书Java Security,是在Java运行环境下对安全问题的基础性探索,以及针对在可信任浏览器内运行不可信任移动代码的新概念的安全问题的探索。Gary McGraw的另一本书Building Secure Software,则是一本经典的著作,展示了一些可用来避免本书中描述的脆弱点的方法。Hoglund先生在rootkit领域和攻防对抗的实践开发中有着丰富的经验。
读完此书后,您并不会惊讶于为什么有如此多的系统已被入侵,而有太多的系统还没有被入侵。对电子投票系统做的分析,展示了我们所面临的软件脆弱点问题。而众多系统还没有被入侵的事实,仅表明攻击者对他们现在的“果实”还比较满意。当下一次我走到投票点投票,面对基于Windows的电子投票系统时,我心里会有一点安全感。当所投的票无缘消失时,或许是因为投票技术不安全而不是软件缺陷造成的。
Aviel D. Rubin
约翰·霍普金斯大学计算机科学学院 教授
信息安全研究所 技术指导
难道Diebold的投票机器在众多投票机器中是惟一的质量控制不好的例子吗?我认为并非如此。许多生产厂家,例如Diebold,都面临着需要以比竞争对手更快的速度把产品投放市场的巨大压力,而拥有最好的、功能最可靠系统的厂家最终会取胜。这样的激励模式只会照顾那些最快进入市场,产品功能最多的生产厂家,而不是那些产品最安全的厂家。让系统做到安全是很困难的,最终结果也不都是切实可行的。Diebold是不幸的,因为他们的代码会被公众检查并且证明是完全失败的。而大多数的厂家则相对比较安全,因为他们的代码仅在严格限制的非公开的情况下才会接受独立的调查分析。只有在代码出现问题后,这些厂家才会对安全性的问题稍加重视。Diebold的投票系统代码并不是我所遇到的第一个充满了安全缺陷的高复杂度代码,那为什么生产安全软件是如此之难呢?
答案很简单:因为安全软件很复杂。任何有编程经验的人都知道,在编写代码的时候面临着无数的选择方案。一个重要的选择是使用哪种编程语言。您是想为了获得系统性能的优化提高而使用灵活的指针运算呢,还是想为了避免缓冲区溢出而使用类型安全的语言以至减少系统的一些功能呢?每一项任务,在算法、参数以及数据结构的选择上都有无数的方案可选用。对每一块代码,都要决定如何命名变量,如何进行注释,甚至如何安排环绕着代码的空白区域。每一名程序员都不一样,因此每一名程序员都有可能做出不同的选择。大型的软件项目都是由团队开发的,而团队中的每一名程序员都必须能够理解并修改其他伙伴所编写的代码。管理自身所写的代码已经是一件很困难的事情了,更不用说去管理由他人编写的代码。对于一个有着成百上千行代码的程序,避免系统安全的脆弱性是一项极具挑战性的工作。而对于有着几百万行代码的程序,例如现代操作系统,则是不可能的任务。
然而,必须要创建大型的系统,因此我们不能仅仅是放弃或者安慰自己:保证系统的安全性是不可能的。McGraw和Hoglund先生做了大量优秀的工作,解释了软件为什么会被破解,展示了软件是如何被破解的,以及告诫读者如何避免写出容易被破解的代码。您可能想知道,向人们展示如何破解代码——正如本书所做的——是不是一个好主意?事实上,安全领域的专家也必须深思熟虑,在提示攻击和保持沉默之间作出权衡。本书采用这样一个观点:最大限度地降低软件中的脆弱点的编程方法就是理解脆弱点是如何产生的,以及攻击者是如何攻破它们的。为此目的,本书是任何想编写网络代码或者操作系统代码的人都必须阅读的。
在软件安全领域,《软件剖析——代码攻防之道》是我所见过的最好的一本书。Gary McGraw和Greg Hoglund先生长期致力于这一领域的研究。Gary McGraw的第一本书Java Security,是在Java运行环境下对安全问题的基础性探索,以及针对在可信任浏览器内运行不可信任移动代码的新概念的安全问题的探索。Gary McGraw的另一本书Building Secure Software,则是一本经典的著作,展示了一些可用来避免本书中描述的脆弱点的方法。Hoglund先生在rootkit领域和攻防对抗的实践开发中有着丰富的经验。
读完此书后,您并不会惊讶于为什么有如此多的系统已被入侵,而有太多的系统还没有被入侵。对电子投票系统做的分析,展示了我们所面临的软件脆弱点问题。而众多系统还没有被入侵的事实,仅表明攻击者对他们现在的“果实”还比较满意。当下一次我走到投票点投票,面对基于Windows的电子投票系统时,我心里会有一点安全感。当所投的票无缘消失时,或许是因为投票技术不安全而不是软件缺陷造成的。
Aviel D. Rubin
约翰·霍普金斯大学计算机科学学院 教授
信息安全研究所 技术指导








点击看大图






加载中...
