本书深入探讨了现实世界中的软件破解问题,解释了它们是如何以及为什么被破解的,介绍了相关的攻击模式,以及它们是如何被发现的。本书还展示了如何发现新软件的脆弱点以及如何利用这个脆弱点去攻破机器。\r\n 第1章介绍了软件是计算机系统安全问题的根本原因。引入了“问题三组合”——复杂性、可扩展性以及连通性——并描述了为什么软件安全问题是不断成长的。还介绍了软件的一些特征以及它们在软件攻击中的含义。\r\n 第2章介绍了实现bug和体系结构缺陷之间的区别,讨论了开放式系统的安全问题,并解释了为什么冒险管理是最明智的办法。介绍了现实世界中的两个攻击案例:一个比较简单,另一个在技术上比较复杂。本章的核心是讨论攻击模式,给出了攻击模式是如何适应不同网络安全特征的,并在本书的其他部分也介绍了攻击模式。\r\n 第3章的主题是逆向工程。攻击者反汇编、反编译以及解构程序来理解程序是如何工作的,以及如何阻止程序这样工作。在这一章里还介绍了常用的灰箱分析技术,包括利用安全补丁作为攻击地图的思想等。介绍了交互式反汇编程序(Interactive Disassembler,IDA),它是黑客用于理解程序行为的工具。我们还仔细介绍了实用的黑客工具是如何被开发及使用的。\r\n第4~7章讨论了攻击模式在实际中的使用案例。\r\n 第4章和第5章介绍了双端的客户机-服务器模型。第4章从Hacking Exposed一书[McCluYe等著,1999]中遗留下的部分开始谈起,介绍了可信任的输入、权限提升、代码注入、路径追踪、破解可信任以及其他专用于服务端软件的攻击技术。第5章介绍了如何利用混合信号、跨网站脚本以及移动代码来攻击客户端软件。同时本章还介绍了逆向攻击的问题。这两章都讨论了攻击模式和实际的攻击案例。\r\n 第6章介绍了有关恶意代码输入的问题。该问题已超出了我们所讨论的分割分析、代码追踪以及反向分析程序代码的问题。解决该问题需要有较好的编码技术。再次说明,不管是现实世界中的攻击案例还是攻击模式,本书都做了比较全面的介绍。\r\n 正如需要受到鞭笞的坏小子一样,致命性的缓冲区溢出是第7章的主题。本章高度关注在其他一些技术资料里已谈到的缓冲区攻击技术。讨论了嵌入式系统中的缓冲区溢出、数据库中的缓冲区溢出、Java环境下的缓冲区溢出以及基于内容的缓冲区溢出。本章讨论了如何发现潜在的各种类型的缓冲区溢出,包括栈溢出、运算错误、格式字符串的脆弱点、堆溢出, C++虚函数表,以及多阶段跳跃。详细介绍了一些特定操作平台上的攻击代码结构,例如x86、MIPS、SPARC和PA-RISC平台。同时,还介绍了一些攻破脆弱的安全系统的高级攻击代码结构技术,例如active armor和跳跃技术。本章还给出了大量的攻击模式。\r\n 第8章介绍了软件攻击中的顶尖技术——rootkit。利用该技术,攻击者可以完全控制整个系统。第8章的主要部分就是介绍基于Windows XP的一个实际rootkit。主要包括钩子调用技术、可执行重定向技术、隐藏进程及文件技术、网络支持技术和二进制代码的补丁技术。同时,本章还详细讨论了部分硬件技术,包括利用EEPROM隐藏rootkit的技术。当然除本章介绍的之外还有很多其他rootkit技术。\r\n 读者对象\r\n 本书适用于网络管理员、安全顾问、信息人士、开发人员以及希望编写安全代码的程序员。
第1章 软件-- 问题的根源 \r\n 1.1 软件简史 \r\n 1.1.1 软件和信息战 \r\n 1.1.2 数字谍报手段 \r\n 1.2 不良软件很普遍 \r\n 1.2.1 NASA(美国国家航空和宇宙航行局)的火星登陆器\r\n 1.2.2 丹佛机场行李管理系统\r\n 1.2.3 鱼鹰MV-22 \r\n 1.2.4 美国军事系统自伤 \r\n 1.2.5 Microsoft和“爱”bug \r\n 1.3 问题三组合 \r\n 1.3.1 复杂性 \r\n 1.3.2 代码行数越多,bug就越多\r\n 1.3.3 可扩展性\r\n 1.3.4 连通性 \r\n 1.3.5 结论 \r\n 1.4 软件的未来 \r\n 1.4.1 短期未来:2003-2004\r\n 1.4.2 中期未来:2005-2007\r\n 1.4.3 长期未来:2008-2010\r\n 1.4.4 十条思路\r\n 1.5 什么是软件安全\r\n 1.6 小结 \r\n第2章 攻击模式 \r\n 2.1 分类 \r\n 2.1.1 bug \r\n 2.1.2 缺陷 \r\n 2.1.3 脆弱点 \r\n 2.1.4 设计中的脆弱点 \r\n 2.2 开放系统 \r\n 2.2.1 风险 \r\n 2.2.2 潜在损失 \r\n 2.2.3 暴露度与力度 \r\n 2.2.4 实际风险 \r\n 2.3 一次攻击历程 \r\n 2.3.1 攻击者的观点 \r\n 2.3.2 为什么不能信任用户\r\n 2.3.3 “开锁” \r\n 2.3.4 一个简单的示例 \r\n 2.4 攻击模式:灾难性的蓝图 \r\n 2.4.1 破解、攻击和攻击者 \r\n 2.4.2 攻击模式\r\n 2.4.3 代码注入\r\n 2.4.4 活动区 \r\n 2.4.5 输出事件 \r\n 2.4.6 反馈事件 \r\n 2.5 攻击示例:对Microsoft C++编译器的攻击 \r\n 2.5.1 攻击的技术细节 \r\n 2.5.2 对Microsoft栈保护的概述\r\n 2.5.3 绕过Microsoft的安全特性\r\n 2.5.4 解决方案 \r\n 2.5.5 攻击回顾 \r\n 2.6 应用攻击模式 \r\n 2.6.1 网络扫描 \r\n 2.6.2 操作系统辨识 \r\n 2.6.3 端口扫描 \r\n 2.6.4 路径追踪和区文件传输\r\n 2.6.5 目标组件 \r\n 2.6.6 选择攻击模式 \r\n 2.6.7 环境缺陷的影响 \r\n 2.6.8 间接使用攻击 \r\n 2.6.9 种植后门 \r\n 2.7 攻击模式工具箱\r\n 2.8 小结 \r\n第3章 逆向工程和程序理解 \r\n 3.1 进入逻辑的“房屋” \r\n 3.1.1 逆向工程 \r\n 3.1.2 为什么需要逆向工程\r\n 3.2 逆向工程是非法的吗 \r\n 3.3 逆向工程的概念及其使用的工具\r\n 3.3.1 调试程序 \r\n 3.3.2 缺陷注入工具 \r\n 3.3.3 反汇编工具 \r\n 3.3.4 反编译器 \r\n 3.4 逆向工程的方法 \r\n 3.4.1 白箱分析 \r\n 3.4.2 黑箱分析 \r\n 3.4.3 灰箱分析 \r\n 3.4.4 使用灰箱技术在Microsoft的SQL Server 7中寻找脆弱点 \r\n 3.5 逆向方法 \r\n 3.5.1 输入追踪 \r\n 3.5.2 软件版本的差异 \r\n 3.5.3 代码覆盖 \r\n 3.5.4 内核访问 \r\n 3.5.5 共享缓冲区中的数据泄漏\r\n 3.5.6 对访问请求的审计 \r\n 3.5.7 使用自己的API资源\r\n 3.6 编写IDA插件 \r\n 3.7 对软件进行反编译和反汇编 \r\n 3.8 实练反编译:逆向helpctr.exe \r\n 3.8.1 bug报告 \r\n 3.8.2 调试记录 \r\n 3.9 自动、成批地审计脆弱点\r\n 3.10 编写属于自己的破解工具\r\n 3.10.1 x86工具\r\n 3.10.2 基本的x86调试程序\r\n 3.10.3 断点 \r\n 3.10.4 存储器的读写 \r\n 3.10.5 调试多线程程序\r\n 3.10.6 枚举线程或进程\r\n 3.10.7 单步执行\r\n 3.10.8 修补 \r\n 3.10.9 故障注入 \r\n 3.10.10 进程快照 \r\n 3.10.11 反汇编机器代码 \r\n 3.11 编写基本的代码覆盖工具\r\n 3.12 小结 \r\n第4章 攻击服务器软件\r\n第5章 攻击客户端软件\r\n第6章 构造恶意输入\r\n第7章 缓冲区溢出 \r\n第8章 rootkit \r\n附录A 攻击模式
在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
约翰•霍普金斯大学计算机科学学院 教授
Greg Hoglund博士 十几年来一直是软件安全领域的领军人物。他创建并记录了第一个基于Windows NT的rootkit,可以通过站点www.rootkit.com找到相关内容。
Gary McGraw博士 Cigital公司的CTO,也是软件和应用程序安全领域的世界级权威。McGraw博士与其他作者合著了Java Secure Software(Addison-Wesley,2002)。他同时还兼任一些大公司的顾问,致力于软件安全的科学研究、并提供安全建议。
当安全领域的专家意识到计算机系统的安全事实上就是软件行为的安全时,软件安全得到了推动性的发展。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的软件攻击的各种技术,利用攻击模式、示例代码以及攻击示例,清晰地展示了那些恶意黑客们每天都会使用的攻击软件的技术。
读者对象
本书适用于网络管理员、安全顾问、信息人士、开发人员以及希望编写安全代码的程序员。
● 假如您管理着一个到处都有软件运行的网络,就应该阅读本书,以了解系统中可能存在的弱点,并知道如何让它们显现出来。
● 假如您是一名安全顾问,就应该阅读本书,这样才能有效地定位、理解并度量客户系统中的安全漏洞。
● 假如您是信息战场上的一名进攻者,就应该阅读本书,知道如何利用软件入侵敌人的系统。
● 假如您是软件开发人员,就应该阅读本书,以了解知道黑客们会如何攻击您的系统。今天,所有的开发人员都必须在头脑里有安全的概念。本书给所有的开发人员提供了在软件安全问题上的现实理解。
● 而假如您是希望编写安全代码的程序员,您也会喜欢本书。
本书的主要读者群是编写安全代码的程序员,但对所有的计算机专家都大有裨益。
在此有必要强调,本书中讨论的技术对于黑客群体来说早已不是新鲜的内容了,其中的一些技术甚至可以和一座座大山比年龄了。我们的真实目的是提供一些启发性的信息,以及提升软件安全领域中论文的层次。
一些安全专家担心会有更多的人利用本书中所介绍的技术去攻击系统。也许吧!但黑客有比“好孩子”更好的通信联系方式和信息共享方式。安全专家们需要理解并消化本书中的知识,这样他们就知道了如何处理软件中的安全问题,就能合适地给本书定位了。我们是应该勇敢地抓住公牛的角,还是应该把我们的脑袋埋在沙子里呢?
也许本书会使您震惊,但是,不管怎么说,本书会使您受益匪浅!