20199116 2019-2020-2 《网络攻防实践》期末综合大作业

20199116 2019-2020-2 《网络攻防实践》期末综合大作业

我选择的论文是AntiFuzz: Impeding Fuzzing Audits of Binary Executables

我将从论文综述、设计细节、论文复现、思考与感悟四个部分来介绍。

一 论文综述

1、文章简介

本文作者是authors:Emre Güler, Cornelius Aschermann, Ali Abbasi, and Thorsten Holz,
Ruhr-Universität Bochum。本文发表于USENIX’19, August 14–16, 2019 • Santa Clara, CA, USA

2、摘要

计算机安全的一般防御策略是在计算资源和人员时间上增加成功攻击的成本。在二进制安全领域,这通常是通过使用混淆方法来阻碍逆向工程和寻找软件漏洞来实现的。然而,最近自动发现错误的趋势改变了工作方式。现在通过各种模糊工具发现bug是很常见的。由于自动化程度的不断提高和对更好的模糊策略的研究,数百个目标的大规模、拖网式模糊变得可行。正如我们所展示的那样,当前的混淆技术旨在提高人类理解的成本,并且对减慢模糊性的作用很小。

在本文中,我们介绍了几种技术来保护二进制可执行文件免受基于模糊测试、符号/共谋执行和污点辅助模糊测试(通常称为混合模糊测试)的自动错误查找方法的分析。更具体地说,我们对错误发现工具的基本假设进行了系统的分析,并为每个假设开发了通用的对策。请注意,这些技术并不是针对fuzzing工具的特定实现而设计的,而是针对bug查找工具所必须依赖的一般假设。我们的评估表明,这些技术有效地阻止了模糊审计,同时引入了微不足道的性能开销。正如模糊化技术增加了寻找漏洞所需的人力,我们的技术也使得基于模糊化的自动化方法变得无用。

3、论文核心

本文的目标就是AntiFuzz(反模糊),阻止二进制可执行文件的模糊检查。作者首先系统分析了当前19种漏洞查找工具(或称为模糊器)的所依赖的基本假设,并将它们分为4类,分别为:(i)覆盖范围会产生相关的反馈,(ii)可以检测到崩溃,(iii)每秒可以执行许多次执行,并且(iv)使用符号执行可以解决约束。然后基于这4类假设,我们开发了模糊对策,并以可配置的,自动生成的单个C头文件的形式实施了轻量级保护方案,开发人员可以将其添加到应用程序中以阻止模糊器。此外,我们发现这种反模糊技术在SPEC基准套件中没有引入可观察到的、统计上显著的性能开销。

二、设计细节

1、模糊器(或漏洞查找工具)的基本假设分析分为:

(1)覆盖范围会产生相关反馈:覆盖引导的模糊器通常假设新的代码覆盖也与新的行为密切相关。因此,每次现代覆盖引导的模糊器生成一个遍历新代码区域的输入时,都假定程序的行为与以前的输入所导致的行为不同。(反馈机制有助于确定哪些输入将导致新的代码覆盖。)
(2)可以检测到崩溃:大多数漏洞查找工具都能够以有效且可扩展的方式区分崩溃输入和非崩溃输入。所以,它们需要一些技术来检测应用程序是否崩溃。
(3)每秒执行很多次:为了有效地生成覆盖范围广的输入文件,每秒执行的次数必须尽可能多。通常模糊器每秒执行几百次到数千次执行。
(4)约束可以用符号执行来解决:基于符号执行的混合模糊器或工具能够以符号形式表示程序的行为并求解结果公式。

2、AntiFuzz(反模糊)技术

本文提出了以下技术进行AntiFuzz(反模糊):
(1)攻击覆盖率指导
覆盖率指导的模糊器的核心假设是:新的覆盖率指示程序中的新行为。
通过添加不相关的代码区域(我们称为伪代码),这样它的覆盖信息掩盖了实际信号,干扰了模糊器中的代码覆盖跟踪机制,削弱了模糊器以任何有用的方式使用反馈机制的能力,从而消除了它们相对于盲式模糊器的优势。
在覆盖信息中引入噪声,使用了两种技术:
a)旨在为所有为几乎所有输入生成不同的“有趣的”覆盖。根据覆盖指导的假设,任何新的覆盖都以为模糊器找到了导致新行为的输入,因此,如果由于假代码程序总是显示新的覆盖率,模糊器就无法区分合法的新覆盖率和无效的假覆盖率。
b)旨在添加看起来像是属于原始应用程序的合法输入处理代码的伪造代码。同时,此代码应包含大量的简单约束以及一些十分复杂困难的约束。然而简单的约束就可以使我们向真实的覆盖范围信息中添加噪音
打破了假设:反馈机制有助于确定哪些输入将导致新的代码覆盖。

(2)防止崩溃检测
模糊器有以下三种常见方式检测是否发生崩溃:
(i)观察退出状态;(ii)通过覆盖信号处理程序来捕获崩溃的信号;以及(iii)使用操作系统(OS)级别的调试接口(例如ptrace监控进程)
技术:
为加强受保护的程序对模糊器的抵抗,通过常见的反调试措施以及优雅地退出应用程序的自定义信号处理程序来阻止上述方法。
也就是,在所有崩溃被报告给外部实体前,终止应用程序,阻止捕捉崩溃。这打破了崩溃输入可以检测到的假设。

(3)推迟执行
模糊化工具需要每秒多次执行才能有效地运行。
技术:
我们检查输入是否为格式良好的输入;当且仅当我们检测到一个不正确的输入时,我们强制应用程序人工减速。但这种减速对于用户来说,250ms几乎注意不到;这种延迟会影响模糊器。即,只有模糊器会受到此技术的影响。导致延迟的最简单方法:使用sleep()函数
但是,为了增强推迟执行这种技术对自动代码分析和修补工具的抵抗力可以向受保护的程序添加一个计算量很大的任务(例如,加密、哈希计算,甚至加密货币挖掘),从而使延迟执行能够继续执行。
这打破了应用程序每秒可以执行数百或数千次的假设,从而严重限制了有效查找新代码覆盖率的机会。

(4)使符号执行引擎超载
为防止程序分析技术提取信息来解决约束并覆盖更多代码,提出两种技术,它们都基于这样的想法:简单的任务可以用某种方式来重写,这使得人们很难对它们的行为进行推理。两种技术:
a)使用哈希比较,将所有输入数据与常量(例如,magic bytes)的比较替换为强加密散列值的比较。可使计算结果要复杂得多。结果得到的符号表达式显著增长,求解器无法为这些方程式找到令人满意的分配。于是无法找到正确的输入。
b)使用分组密码对输入进行加密然后解密
这打破了应用程序中的约束是可解(即约束课用符号执行解决)的假设。

三、论文复现

1、实验环境

Ubuntu

2、实验安装

(1)安装AFL

首先从github上下下载afl

依次运行makemake install安装AFL

进行fuzzing

在安装好afl之后,我们就可以来fuzzing程序了,但是在fuzzing程序之前,我们需要对程序进行插桩。
运行./configure CC="afl-gcc" CXX="afl-g++"

就可以完成对程序进行插桩。

以sam2p为例,我们可以运行下面的命令对程序进行插桩。

然后我们就可以fuzzing程序了,其中

-i 选项是fuzzer的初始输入。

-o 之后跟的是程序的输出结果。

@@在运行中会被输入所替换。

下图所示是fuzzing的面板。

(1)安装honggfuzz

和AFL类似,我们首先从github上下载honggfuzz。

运行make make install来安装honggfuzz

进行fuzzing

在安装好honggfuzz之后,我们就可以来fuzzing程序了,但是在fuzzing程序之前,我们需要对程序进行插桩。
运行./configure CC="hfuzz-gcc" CXX="hfuzz-g++"

就可以完成对程序进行插桩。

以tiff软件为例,我们可以运行下面的命令对程序进行插桩,然后运行make;make install命令安装tiff软件。

然后我们就可以fuzzing程序了。
其中 -f 选项是fuzzer的初始输入,tiff_seed文件夹中包含了很多tiff格式的文件。下图是fuzzing代码

其中 -f 选项后面指向程序的输入文件夹。
-w 之后跟的是程序的输出结果。

-t 选项设定timeout

–run-time 选项制定fuzzer运行的时间

-z 表示采用插桩模式,对源码进插桩
__FILE __: 相当于AFL中的@@, 在运行时被程序的输入文件替换。

下图所示是执行完上图脚本后的fuzzing的面板。

2、实验结果

论文的评估旨在回答以下五个问题

问题1:当前的混淆技术对于通过模糊进行自动漏洞查找是否有效?(无效)

软件混淆的目标之一是防止依赖传统的手动逆向工程技术的安全研究人员发现错误。
使用TIGRESS 2.2 (C语言的混淆器)混淆了一个虚拟应用程序(见下方清单2),并让不同的模糊器找到正确的崩溃输入。

在本实验中,我们使用了AFL、HONGGFUZZ、KLEE和ZZUF,它们代表了所有三种模糊器的类别。
本文用尽可能多的模糊化特性来配置TIGRESS,实验表明,尽管采用了各种模糊技术,但所有的模糊器都能找到崩溃输入。所以,当前的混淆技术对于自动的错误发现技术是无效的。

问题2:我们设计的技术在破坏目标模糊假设方面是否有效?(有效)

使用与上个实验一样的应用程序,并且一次使用一种抗模糊技术。在没有反模糊功能的情况下,8个模糊器只需要几秒钟到几分钟就可以找到崩溃的输入。
我们的反覆盖功能阻碍了所有覆盖率指导的模糊器。使用我们的防崩溃检测技术时,所有的模糊测试者都找不到崩溃。

表2:对虚拟应用程序进行评估。√ 意味着ANTIFUZZ成功地阻止了错误发现(没有发现崩溃),× 意味着至少发现了一个崩溃输入。”None”意味着ANTIFUZZ被禁用,”All”意味着所有对抗模糊器的技术(覆盖,崩溃,速度和符号执行)被打开。

Klee至少运行了24小时,然后由于内存限制而崩溃。

问题3:这些技术在防止模糊器发现漏洞方面是否有效?(有效)

使用LAVA-M数据集评估ANTIFUZZ,在LAVA-M的4个应用程序base64,uniq,who,md5sum中查找崩溃。
这些结果表明我们的反模糊功能适用于实际的二进制文件,以防止发现漏洞。

表:√表示ANTIFUZZ成功阻止了错误发现(未发现崩溃),×表示至少发现了一个崩溃输入,#号表示找到的唯一崩溃数。 None表示已禁用ANTIFUZZ,All表示已启用所有针对模糊器的技术(覆盖率,崩溃,速度和符号执行)。

问题4:这些技术是否有效减少了正在测试的代码量?(有效)

我们针对binutils集合中的八个实际二进制文件(即addr2line,ar,size,strings,objdump,readelf,nm-new,strip-new)对AFL,HONGG-FUZZ,VUZZER和QSYM进行了评估。
在“无”设置(禁用了ANTIFUZZ)中,每个模糊器和每个应用程序都在24小时内执行了3次,然后在“所有”设置(启用了所有ANTIFUZZ功能)中又执行了一次。

问题5:我们的技术是否会带来任何显著的性能开销?(不会)

使用SPEC CPU2006版本1.1 INT基准,度量在复杂程序上使用反模糊所导致的性能开销。
该实验包含所有采用输入文件的基准测试,基准测试分别进行了3次迭代,并用几何平均值对10次运行进行了平均。
实验结果表明:ANTIFUZZ对每个基准的影响微不足道,几乎无法承受甚至没有可观察到的开销

四、思考与感悟

对于《网络攻防实践》这门课程,最大的问题就是基础知识薄弱,学习这门课的过程中有点吃力。平时写作业总是需要请教同学或者百度。虽然第一次接触虚拟机,但确实通过这门课学到了一些东西。

这次的综合实践中,我选的这篇论文有点难理解,看了好多遍,想要把论文里的细节搞懂。关于论文的复现,觉得自己动手能力、学习能力有待提高,特别是在代码、程序方面需加强,所以想要在假期好好学习一下。

参考文献

以下是在学习过程中部分参考文献

posted on 2020-07-05 07:31  20199116xjq  阅读(1074)  评论(0编辑  收藏  举报