En

漫谈漏洞挖掘之文件解析型漏洞

作者:dragonltx公布时间:2013-12-16阅读次数:13184评论:2

分享

[目录]

 1 - 前言

 2 - 文件Fuzz简介

 3 - 文件Fuzz风云录

 4 – 展望

 5 - 结语

 

[1] - 前言







      自2010年Google承认遭受严重黑客攻击之后,APT高级持续性威胁便成为安全圈子人尽皆知的“时髦名词”,当然对于像Google、RSA、Comodo等深受其害的公司而言,APT无疑是一场噩梦。其中,文件解析型漏洞在APT攻击中承担了重型武器的功能。

      不管是IE还是Office,它们都有一个共同点,那就是用文件作为程序的主要输入。不少程序员会存在惯性思维,即假设他们所使用的文件是严格遵守软件规定的数据格式。但是攻击者往往会挑战程序员的假定假设,尝试对软件所约定的数据格式进行稍微修改,观察软件是否在解析这种“畸形文件”时是否会发生崩溃或者溢出。

[2] – 文件Fuzz简介

      文件格式Fuzz(File Fuzz)就是这种利用“畸形文件”测试软件鲁棒性的方法。



      FileFuzz可以分为Blind Fuzz和Smart Fuzz。Blind Fuzz即通常所说的“盲测”,就是在随机位置修改数据来生成畸形文件。然而现在的文件格式越来越复杂,Blind Fuzz的代码覆盖率偏低,会产生大量的无用测试用例。针对Blind Fuzz的不足,Smart Fuzz被越来越多地提出和应用。Smart Fuzz即智能Fuzz,通过解析文件格式,然后基于样本和变异来生成畸形文件。它能够识别不同的数据类型,并且能够针目标数据的类型按照不同规则来生成畸形数据。跟Blind Fuzz相比,Smart Fuzz能大大减少无效畸形文件的数量。

[3] – 文件Fuzz风云录

      下面,笔者将根据自己的一些经验,介绍常见的文件Fuzz思想。 

[3.1] – Blind Fuzz

      Blind Fuzz的代表就是著名的iDefense lab出品的Filefuzz。

      FileFuzz的变异策略分为4种:All Bytes、Range、Depth、Math。All Bytes即对整个文件按字节进行修改,修改为我们指定的4X00或者4XFF或者3XFF。Range即针对某一个范围进行按字节进行修改,方便我们进行针对性测试,如只对某个文件头进行测试。Depth即深度测试,对某个偏移的数据进行,比如对偏移为0x2的数据修改为0x00-0xFF这个范围。Match即将符合条件的数据修改为相应的数据。

      原始版的Filefuzz略显简陋,幸好Filefuzz是开源的,我们可以根据自己定的策略来修改相应的生成策略。我们可以建立自己的“智能数据”,修改的数据可以不仅限于0x00、0xFF,可以是0x3F、0x7F、0x01、0x02、0x80、0xFE、0x10、0x20、0x40、0x60等等。如果是想测整数溢出,可以修改为一些边界数据,如0xFFFFFFFF-1、0xFFFFFFFF-2、0xFFFFFFFF-3等等。

      个人认为,FileFuzz比较适合有经验的人士,FileFuzz完全具备“快、准、狠”的能力。只要策略设置得好,文件格式脆弱点寻找的好,用FileFuzz挖洞是件很惬意的事。“简单的是最美的”,FileFuzz虽然很简单,但是只要策略够猥琐,FileFuzz就是神器。

[3.2] – File FormatBased Smart Fuzz



      本节介绍的智能文件Fuzz是基于文件格式规范的,大体的流程如上图所示。该类文件Fuzz系统中最为出名非Peach莫属。Peach采取xml格式来定义文件格式规范,称为Peach Pit文件。

      使用Peach的难度在于Peach Pit文件的编写,当遇到比较复杂的文件格式时,用xml定义文件格式会略显无力。“Peach虐我千百遍,我待Peach如初恋”。我们必须以这样的心态来使用Peach,即使被Peach虐得体无完肤,但依然钟爱Peach。

      基于Peach,我们实现了25种常见文件格式的文件格式规范,对公司产品及外部产品进行测试,效果显著,发现了公司产品的N多个漏洞。此外,也展现了不错的历史漏洞发现能力和0day发现能力。

1)已知漏洞测试结果

主要测试目标为近期exploit-db及其他漏洞库上公开的已知漏洞,均能发现:

 

2)0day发现测试结果

      主要测试目标为国内和国外大型互联网公司产品,包括苹果、360、百度、迅雷主流互联网厂商的6个高危0day。细节已经同步给相关厂商,并已修复。

      总体来说,Peach的效果还是可以,就是编写Peach Pit太麻烦,用起来太费劲。

      另:笔者比较喜欢FileFuzz+Peach的组合方式,用Peach生成测试用例,用FileFuzz在多台虚拟机里平行跑,减少Fuzz时间。

[3.3] – Smart Fuzz



      近来,更智能的文件Fuzz越来越多地被提出来,通过符号执行、路径约束求解等技术来提高代码的覆盖率。其中比较出名的为Fuzzgrind。Fuzzgrind是一款开源的文件型智能Fuzz工具,运行于Linux平台下,采用Valgrind插桩工具和STP求解器。它的执行流程如下:


      该类型文件Fuzz系统无需知道文件格式规范,只需提供样本文件即可,通过符号执行来提高代码覆盖率。目前的瓶颈在于效率问题,只要目标程序的复杂度较高,稍微大一点的程序就完全没法测试。只要能突破效率问题,该类型的文件Fuzz系统就是未来文件Fuzz的主导者。

 

[4] – 展望

[4.1]-010 Editor File Fuzz

      相对于Peach Pit模版的编写,010 Editor的文件格式解析脚本编写起来相对简单。其中,010 Editor的bt脚本只能对样本文件进行解析,不能修改,而1sc脚本可以访问bt脚本中的数据结构,然后修改数据。

      思路:编写010 Editor的变异器,通过1sc脚本访问bt脚本来实现畸形样本的构造。


[4.2]-数学之美

      “数学是科学的皇后”。我相信,我们可以通过研究漏洞成因,进行数学建模,来进行漏洞挖掘。有兴趣的同志可以试试。

 

[5]-结语

      本文主要介绍了目前常见的文件Fuzz思想,以及自己对文件Fuzz的一些想法和展望。如果你有新的想法,欢迎跟我探讨。

      “思想有多远,就能走多远”。

 

References

[1]0day安全:软件漏洞分析技术(第二版)

[2]模糊测试:强制性安全漏洞挖掘

[3]fuzzgrind.pdf




评论留言

提交评论 您输入的漏洞名称有误,请重新输入