漏洞本质
1、程序世界:由于程序(Web,二进制等)存在安全缺陷,导致攻击者恶意构造的数据进入程序相关处理代码时,会改变程序原定的执行流程,从而实现破坏或获取超出原有程权限的能力。
2、安全策略:由于系统(网站、软件、操作系统等)安全策略设置得不够严谨或者未作设置,导致攻击者能够在未经授权的情况下,获得对目标系统原本不应拥有的访问或控制权限。
POC和EXP(Exploit)
POC:证明漏洞存在
EXP:证明漏洞存在的同时,证明漏洞可以被利用。
常见分析工具
IDA:静态反汇编工具
OllyDbg:Windows下32位动态调试工具
Immunity Debugger:基于OD的漏洞分析专业调试器
WinDbg:微软正宗调试器
GDB:Linux调试器
JEB:Android反编译器
pdfparse:分析PDF
SWFInvestigator:分析SWF
010Editor:分析文件格式
BinDiff:二进制文件对比工具
常见漏洞分析方法
静态分析:
静态分析是指在无须运行程序的情况下,通过IDA或JEB等反汇编/反编译工具逆向分析软件,以掌握其程序执行的逻辑和功能,从而找出存在安全缺陷的代码。静态分析漏洞有时工作量比较大,特别是对于比较庞大的软件,比如IE浏览器。如果只是为了分析某个函数的功能,定向地静态分析会比较直接高效,但如果想弄清楚不同函数之间的关系,以及变量、返回值或相互传递的参数,可能就需要结合动态调试执行程序去跟踪分析。
动态调试:
动态调试就是借助调试器跟踪程序的执行过程,包含运行中函数的调用关系、传递的参数变量和返回值,以及堆栈的分配情况。通过动态调试跟踪,可以层层回溯当前程序调用到的各个函数,有利于从触发崩溃的函数往前回溯追踪,更有目标性地分析,从而提高分析效率。通常情况下,为了完整高效地分析软件漏洞,会采用动静态结合的分析方式。
源码分析:
当分析者手上拥有软件源码的时候,就可以通过阅读源码或者源码调试来分析软件。对于自己开发的软件或者开源软件(比如Firefox,Chrome等),采用源码分析的方式可能会更便于理解程序功能,但通常情况下,我们要分析的软件都是闭源的,此时就得采用其他分析方式了。
补丁比较:
在发布的补丁中,可能会修复许多未公开的ODay漏洞。为了发现其中的ODay,一些安全人员可能会对发布的补丁(修复程序)与被修复的原文件(漏洞程序)进行比对,找到其中被修改的地方,然后从差异之处发现被修复的漏洞,这种方法就叫补丁比较,属于静态分析的一种方法,使用BinDiff进行补丁比较。
污点追踪:
污点追踪是指将外部输入数据标记为污点,然后在程序动态执行过程中追踪污点的传播过程,当污点被传播到控制执行流程或者执行代码中时,就可能导致安全漏洞的发生。污点追踪犹如“七伤拳”一般,“先伤己,再伤人”,开发污点追踪工具,不仅费时费力,而且开发完成后,运行比较大的工具往往需要运行很长时间,比如IE、Adobe等软件,有时甚至需要整整一天的时间。一般是在漏洞位置比较隐蔽,其他分析方法无效或可能耗费过长时间的时候才使用,主要针对文件格式漏洞。另外,读者也可利用pin等动态插桩框架开发出动态分析工具,针对特定函数挂钩,比如堆分配与释放函数,根据不同的漏洞场景制作相应的动态追踪工具,可能效果更佳。
学习站点:
Exploit-DB
http://www.exploit-db.com
法国著名“漏洞军火商”Vupen安全公司(现已更名为Zerodium)的博客,博客中有很多软件漏洞的分析,以及高级的漏洞利用技术,可能不太适合初学者,但如果读者能够把博客中所有的漏洞都自己动手调试一遍,那么无论是在漏洞分析还是漏洞利用上,读者的水平都会有很大的提升。在个别博文中,有些漏洞的分析可能会故意留错,或说得模糊,这些自己动手调试后才会发现。
看雪论坛
http://bbs.pediy.com
国内著名的软件安全论坛“看雪”,论坛中有很多软件漏洞分析的文章,还有很多经典的系列文章,每年的精华集都是不错的学习资源,不仅包括漏洞分析,还有软件加解密、病毒分析、编程开发、移动安全等诸多方向。
SecurityFocus
http://www.securityfocus.com
国外著名的漏洞信息库,包含很多漏洞公告信息,有些漏洞也会附上相关的分析文章和PoC代码。
Bugtraq邮件列表
http://seclists.org/bugtraq/
国外站点,专门发布漏洞公告、进行漏洞相关技术讨论的邮件列表,很多国内外的安全人员在发现漏洞后,经常会直接在上面公布,是获取漏洞信息的最佳途径。
Binvul论坛(好像G了)
http://binvul.com
国内非著名软件漏洞讨论站点,提供一些漏洞PoC和分析文章。
书籍推荐
1、 The Art of Software Security Assessment - ldentifying and Preventing SoftwareVuInerabilities。该书暂未引进国内,也无翻译版。虽然是2006年出版的,但里面的软件漏洞类型覆盖得挺完整,主要讲解Windows与UNIX平台下各种软件漏洞原理,以及规避方法,也包含部分 Web层应用漏洞的讲解。
2、《Oday安全:软件漏洞分析技术》。讲述Windows平台上的堆栈溢出、格式化字符串、内核提权等漏洞原理,分析和利用方法,适合广大软件漏洞初学者。
3、《深入理解计算机系统》。以 UNIX系统为背景,从程序员的角度,深入讲解整个计算机系统的底层原理,被誉为“阶值超过等重量黄金的无价资源宝库”。笔者从头到尾认真读了三遍,强烈推荐,这也是许多IT人士所推荐的书籍,不局限于安全领域。
4、《软件调试》。讲述Windows平台下的调试技巧和方法,借助WinDbg实践分析Windows操作系统原理,其中关于堆的内容,对于分析堆上的漏洞特别有帮助,推荐一阅。
5、《捉虫日记》。原著书名:A Bug Hunter's Diary,从实践者的角度讲解漏洞挖掘、分析与利用技术,书不足200页,但涉及较多系统平台,推荐一阅。
6、《IDA权威指南》。用IDA的人很多,但真正充分利用IDA功能的人则很少。这本书专门讲述IDA的使用方法,涵盖了IDA功能的方方面面,是当前市面上最完整讲述IDA的书籍。
7、《Exploit编写系列教程》。由笔者组织并参与翻译的教程,共11篇,详细地讲解了Windows平台上的栈溢出漏洞利用,重点讲解各种Exploit技术与编写方法,包括如何绕过GS、DEP,ASLR等诸多保护机制,以实际漏洞为例,手把手详细地讲解分析和利用思路,强烈推荐。
8、《C++反汇编与逆向技术揭秘》。通过调试器去逆向各种C++内部机制,特别推荐第9~11章内容,主要介绍类、构造与析构函数、虚函数等重要概念,以及对应的汇编指令形态和内存布局情况,从更底层的角度去理解上述概念,对于分析C++写的应用漏洞会有很大帮助。
9、《漏洞战争 软件漏洞分析精要》