序
网络空间安全已是世界各国关注的重要战略问题,各国政府、学术界、产业界都投入了大量的资源来改善网络空间安全状况,发展网络空间安全防护手段。为适应网络技术和应用的快速发展,各种新的安全技术、安全产品、安全方案层出不穷。当前网络系统中,从不同层次、不同角度实现的安全产品已广泛应用,但从近年来曝光的各类安全事件来看,各种攻击手段仍然防不胜防。究其原因,软件漏洞及其利用是攻击成功的关键,也是系统防御的难点。
“千丈之堤,以蝼蚁之穴溃;百尺之室,以突隙之烟焚。”纵然我们有完美的安全模型和设计方案,但在这些方案的实现中,开发人员的疏忽或个别技术的缺陷都可能引入软件漏洞,让整个方案失效,甚至直接威胁整个系统的安全。2010年,震网蠕虫利用7个软件漏洞成功突破了伊朗核电站的物理隔离网络,造成严重破坏;2011年,攻击者利用漏洞成功渗透进入了著名的安全公司RSA公司的内部网络,并窃取了大量敏感信息;2015年,以擅长攻击著称的黑客团队Hacking Team的内部网络遭受攻击,大量的漏洞利用代码、内部研讨资料等敏感数据泄露。这些案例都给我们敲响了警钟,无论多么安全的防护方案都有可能因为“小小的”软件缺陷而被彻底突破。
近年来,各类安全事件的曝光让人们越来越关注软件的安全性问题。各类软件漏洞挖掘的高手也成为业界的宠儿,但随着软件复杂性的增加以及漏洞和漏洞利用模式的变化,仅仅依赖于少量有个人天赋的高手已经远远不能满足现实的需求。利用先进的技术方法来解决软件安全问题,一直是学术界、产业界共同关注的焦点问题,也是当前的一大难点问题。
2016年,美国国防部组织的DARPA CGC比赛(Cyber Grand Challenge)更是将软件漏洞的自动化发掘、分析、利用、防御技术研究推向高潮,DARPA组织该比赛的初衷之一也是为了吸引更多的社会资源关注、参与该问题的技术研究工作。这次比赛吸引了众多高校、科研机构和企业团队的关注。最终,来自卡耐基·梅隆大学的ForAllSecure团队获得第一。虽然CGC比赛中的场景设定与实际情况有很大差距,但这次比赛验证了自动化攻防的技术可能性,代表了未来的技术发展方向。随着未来软件技术的发展和广泛应用,软件安全问题将越来越突出,因此,发展新的软件安全技术是未来的主要发展方向。
我国是软件产业大国,也是软件应用大国。在软件安全方面面临的问〖1〗软件安全分析与应用题尤为突出。究其原因,一方面是由于我国大量的软件产品,尤其是操作系统、数据库等基础软件产品依赖于国外厂商,我们不得不面对软件厂商不可信的现实问题;但更重要的是我们目前在软件产品安全方面的审查能力仍很薄弱,缺乏有效的技术手段对软件产品的安全问题实施监管。针对软件安全问题,我国相关部门和机构做了大量的部署,取得了一系列的成果和突破。在软件安全检测、软件漏洞分析等方面形成了一系列成果,大量成果也已经成功转化,为提升我国网络空间安全保障能力发挥了重要作用。
但软件安全问题是典型的对抗性问题,面对我国软件产业的快速发展,当前软件安全技术和成果仍远无法满足现实的需求。高技术对抗需要高技术手段支撑,从2016年的DARPA CGC比赛可以看出,污点传播分析、符号执行等以前主要在学术研究工作中采用的方法和技术已逐步可支撑一系列软件安全分析实践工作,如何进一步推进相关方法和技术的实用化是当前学术界和工业界共同关注的焦点问题。
本书作者苏璞睿研究员及其团队十多年来一直从事软件安全研究工作,曾主持了国家863计划、国家自然科学基金、国家科技支撑计划等一系列国家重点任务的攻关工作,在软件安全方面取得了一系列技术突破,在动态污点传播分析、恶意软件分析与检测、软件漏洞分析与利用等方面有重大创新与积累,主持研制了恶意软件分析检测系统、软件漏洞分析系统等多项成果,在软件安全方面具有丰富的研究和实践经验。
本书由他和他的团队根据多年的研究积累和实践凝练而成,从基本概念、方法原理、重要工具系统和关键应用场景等不同层面对目前国内外的软件安全分析相关技术和方法进行了系统的总结和梳理。本书兼顾了学术研究前沿技术方法和相关技术方法在工程实践中的应用,既剖析了软件安全分析中常用的动态污点分析、符号执行等基础方法,也结合真实应用场景和实际案例,阐述了相关技术方法在软件漏洞分析与利用、恶意软件分析、协议逆向分析等多个具体问题中的应用。
本书是软件安全分析方面一本难得的理论与实践紧密结合的书籍,我愿意把它推荐给从事软件安全研究与实践的科研人员、研究生和技术人员。
2017年9月于北京前言软件的应用已经渗透到社会的方方面面,承载着重要的社会价值。软件开发过程无法做到完美,软件问题与漏洞难以避免,软件也成为攻击者的重要目标。当前曝光的各类网络安全事件中,绝大部分都与软件安全问题相关,软件安全问题已成为关乎个人利益、社会稳定、国家安全的重要问题。
软件安全问题中的软件漏洞和恶意软件是两大经典问题,前者是由于软件设计开发过程中的缺陷带来的安全隐患,后者则是攻击者有意设计的具有破坏性的软件工具。软件自身越来越复杂,规模越来越庞大,软件漏洞模式、利用方式也越来越多样化,这就对软件漏洞的发现、分析与评估等工作带来了一系列的挑战;而恶意软件自身的技术也在不断发展,出现了各种自我保护技术、隐蔽通信手段等,这也对恶意软件的分析和处置提出了新的要求。无论是软件漏洞分析还是恶意软件分析,软件自身的复杂性已经超越一般技术人员的分析能力和理解能力,复杂软件的深度分析能力是软件漏洞分析和恶意软件分析共同面临的瓶颈问题。
如何提高对复杂软件的深度分析能力,并针对具体的应用场景,设计相关的分析、检测方法,一直是软件分析领域乃至信息安全领域关注的焦点问题。特别是考虑到很多软件系统无法获得源代码的现实,如何实现不依赖于源代码的软件深度分析是近年来的研究热点。
面向软件安全问题,本书总结了一系列软件分析基础性方法,并重点介绍了软件安全分析工作中的典型场景和相关技术手段。考虑到技术内容的完整性,书中也对当前常见的成熟工具(如反汇编工具、调试工具等)和相关基础知识(如Intel指令集、操作系统内核等)进行了简单介绍。
本书的写作主要由中国科学院软件研究所可信计算与信息保障实验室(TCA实验室)的信息对抗与网络保障团队共同完成,本书的撰写也是该团队对相关技术方法和研究进展的总结。该团队于2004年由冯登国研究员创建,后来由我组织。2004年底,团队开始关注基于硬件虚拟化的恶意软件分析;2005年底,组织开发了第一个基于开源系统QEMU的恶意软件分析系统,当时命名为WooKon(取音“悟空”);2010年,面向恶意软件检测需求,在WooKon系统的基础上推出了基于硬件虚拟化的APT(Advanced Persistent Threat)攻击检测引擎,并在多个部门和机构成功应用,2017年我们根据新的需求与新的形势又推出了金刚恶意软件智能分析系统;从2006年起,开始关注将动态污点分析应用于恶意软件分析和漏洞分析的相关研究,〖1〗软件安全分析与应用前言[3]〖3〗经过多年研发和逐步完善,2010年研制了第一套基于硬件虚拟化的动态污点分析系统——AOTA系统(ApplicationOriented Analysis System),并成功应用于漏洞利用自动生成研究;2013年构建了一个多样性漏洞利用自动生成系统——PolyAEG系统。
我们的工作也得到了一系列国家科技项目的支持。团队在最初建立的很长时间内没有得到相关项目的支持,在此要感谢时任信息安全国家重点实验室主任冯登国研究员的大力支持,保证了团队研究工作的持续发展。2006年团队的工作获得了第一个国家863计划项目“恶意代码机理分析与特征提取技术研究”,此后得到了国家自然科学基金、国家科技支撑计划、国家信息安全产业化专项等一系列项目的支持,也在相关项目的支持下完成了从基础方法、关键技术、原型系统到成果转化的科研过程。
软件分析理论博大精深,软件安全问题错综复杂,因作者能力和精力所限,难于对相关技术和方法进行全面、系统的总结。因此,本书主要对使用较多的程序切片、污点分析、模糊测试、符号执行等方法进行了介绍,并对恶意软件分析、协议逆向分析、软件漏洞分析、Android应用安全性分析等方法和技术进行了总结。
团队多位同事和同学参与了本书的写作或给予了支持和帮助。第1章黄桦烽提供了一系列案例素材;第2、3章由黄桦烽主要负责编写;第4章由闫佳博士主要负责编写;第5章由王衍豪博士主要负责编写,贾相堃博士负责修改校对;第6章由聂楚江博士主要负责编写;第7章由和亮博士主要负责编写;第8章主要由应凌云博士负责编写,聂眉宁博士协助提供素材;第9章主要由杨轶博士负责编写,闫佳博士协助修改校对;第10章由闫佳博士负责编写,闫佳博士协助修改校对;第11章由应凌云博士、谷雅聪博士、路晔绵博士及婧二霞共同完成。
本书的编写得到了国家自然科学基金项目“安全协议实现的逆向分析与安全评估方法研究”(NSFC: 61572483)、“面向应用商店的移动智能终端恶意软件检测关键技术研究”(NSFC: 61502468)、“虚拟化混淆代码逆向分析方法研究”(NSFC: 61502469)等项目的支持,在此表示感谢!
本书的编写得到了冯登国研究员的指导和帮助,冯老师不仅对书稿内容的组织、编写大纲等给予了指导,还审阅了全部书稿,提出了宝贵的修改意见。同时,本书最终得以出版,与冯老师长期对我们团队发展的支持是分不开的,在此对冯老师长期的支持和帮助表示衷心感谢!
多位专家、同行的真知灼见也对本书的形成提供了重要参考,在此一并表示感谢!另外,本书初稿曾作为中国科学院大学2016年春季课程讲义,课上多位同学也对讲义提出了宝贵的修改意见,在此一并表示感谢!
由于本书涉及内容较多,编写时间仓促,书中难免存在疏漏和不足之处,恳请广大读者提出宝贵的意见和建议,以便我们不断改进和完善本书的内容。
苏璞睿于中国科学院软件研究所
2017年8月
第5章符 号 执 行符号执行技术在1976年由Jame C.King提出\[1\]。20世纪70年代,关于软件正确性测试的研究工作都基于一个原则: 选择合适的测试用例对程序运行状态进行测试,如果对于提供的输入都能产生正常的结果输出,则认为程序是可靠的。其中的方法可分为两大类。一类是以模糊测试为代表的随机性测试,虽然模糊测试等随机测试方法至今仍活跃在软件安全测试的一线,但其具有的盲目性和随机性使其无法提供完整可靠的测试结果。另一类是以模型检测为代表的形式化证明方法,通过归纳法来证明程序是否具有期望的性质,证明过程的复杂性使其在面对大规模程序的时候几乎不可用。正是在这样的背景下,James C.King提出了符号执行方法,可以将其看成是上述两类传统方法的折中。King希望在无法获取程序特性说明等信息的情况下,仍旧能够对其进行快速全面的自动化安全性检测。本章将对符号执行的基本方法进行介绍。
5.1符号执行基本模型〖*4/5〗5.1.1基本思想符号执行的基本思想是: 使用符号变量代替具体值作为程序或函数的参数,并模拟执行程序中的指令,各指令的操作都基于符号变量进行,其中操作数的值由符号和常量组成的表达式来表示。
对于任意程序,其执行流程是由指令序列的执行语义控制的,执行语义包括: 变量定义语句对数据对象的描述,声明语句对程序数据对象的修改,条件语句对程序执行流程的控制。当程序的输入参数确定时,其指令序列被固定下来,因此程序执行语义和控制流也就得到确定。如果不用具体数值,而是用符号值作为程序的输入参数,则指令序列的操作对象就从具体数值变为了符号值,程序的执行语义和控制流程也变成了和符号变量相关的符号表达式。读者可以将符号执行视为程序具体执行的自然扩展,符号变量使得程序执行语义变得不确定,这也使得符号执行技术在理想情况下可以遍历程序执行树的所有路径。也可以将程序的一次具体执行视为符号执行的一个实例,当需要对某条程序路径进行遍历分析时,只需根据符号执行方法对该路径的分析结果,就可以引导控制流遍历该路径的程序输入。
King\[1\]在提出符号执行技术的同时,也为其限定了理想的使用场景:(1) 理想模型中程序只处理有符号整数,在实际测试中这种情况不会出现。〖1〗软件安全分析与应用第5章符号执行[3]〖3〗(2) 理想模型中假定程序“执行树”的规模是有限的,在实际测试中,由于程序中存在的循环等原因,很多程序的“符号执行树”可能是无穷大的。
(3) 理想模型中符号执行技术可以处理程序内所有if条件语句中的约束表达式,在实际测试中,约束表达式中通常会出现符号执行引擎无法处理的操作和变量类型。
5.1.2程序语言定义基于符号执行技术的理想场景对程序语言做如下定义。
(1) 程序变量类型: 程序中只包括有符号整数类型。
(2) 程序语句类型: 简单的声明语句,例如,a=3。
if条件语句(包括then和else),例如if(a<0),假定程序内所有if条件语句中的表达式都可以化简为{arith.expr.}≥0的形式,例如-a-1≥0。
无条件跳转语句,例如goto语句。
变量操作语句,例如读操作(read)。变量处理操作符中只包含基本的整数运算操作,例如加、减、乘(+、-、*)。