【论文分享】Unleashing MAYHEM on Binary Code

论文题目:Unleashing MAYHEM on Binary Code

简介:

提出了mayhem系统,能够自动化地在二进制程序中找到可利用的漏洞。mayhem报告出的漏洞都会附带一个获取shell的exp。Mayhem工作在二进制程序上,而不需要debug信息。为了能够在二进制级别实现自动化利用,mayhem解决了两个挑战:一是,管理执行路径而不需要耗尽内存,二是推断符号化内存标记。为了解决这两个问题,提出了两种方法:混合符号执行,基于索引的内存建模。结果:使用mayhem找到了29可利用的漏洞,其中两个还是未被记录的。

背景

研究意义

bug数量很多,但能被攻击者利用的bug才是重要的,并且需要马上修复。因此,核心问题不是一个程序是否有bug,而是其bug是否可利用。mayhem通过为符号执行添加约束条件,在潜在的漏洞点找到一条可利用的路径。约束条件包括以下细节:

  • 指令指针是否可以被重定向
  • 是否可以在内存中放置攻击代码
  • 是否能够执行攻击代码
挑战

挑战1:探索应用的搜索空间来找到一条可利用的路径。

解决方法基于以下四个设计原则:

  • 系统需要一直运行
  • 最大化性能的话,系统不能重复工作
  • 系统不应该丢弃任何工作,先前的分析结果应该在下一次运行时复用
  • 系统应该考虑符号化内存(load或store地址取决于用户输入)

现有的符号执行方法有CUTE,BitBlaze,KLEE,SAGE,McVeto,AEG,S2E等等,并不满足上面的设计需求。理论上现在的符号执行可以被分为两类,一类是离线执行,精准地执行一条路径并且符号化地执行它。一类是在线执行,试图在一次运行系统时,探索所有的路径。

混合符号执行就像OS里的内存管理器,不同的区别是其是为了高效切换符号执行引擎而设计的。当内存处于压力时,混合引擎选择一个正在运行的执行器,保存当前执行的状态和路径公式。通过保存公式来保存线程,然后基于前面的执行状态准确地执行程序。缓存路径公式放置了符号执行重复执行某些指令。而这里是离线符号执行的瓶颈所在。

挑战2:产生的exp由于具体的约束条件而不可行。

解决方法:引入了基于索引的内存模型来避免索引的约束。

贡献
  • 混合符号执行:在运行速度和内存要求间找到平衡。
  • 基于索引的内存模型:解决二进制中的符号化索引
  • 仅二进制的利用生成(AEG需要利用源码)

方法

在这里插入图片描述

mayhem的框架如上图所示。首先把目标二进制和潜在的符号资源作为CEC的输入,然后CEC开始和SES通信。SES符号化地执行CEC送过来的功能块,输出测试样例,导致崩溃的输入和利用。

  • CEC:在CPU上准确执行代码
  • SEC:在任何平台上执行,并且等待来自CEC的连接。

用户使用mayhem可以通过运行以下代码来开始:

mayhem -sym-net 80 400 ./orzhttpd

mayhem发现漏洞代码并且产生利用的步骤有8步:

  1. -sym-net 80 400参数告诉mayhem去符号执行来自端口80的数据。这实际上是指定哪些输入源可能处于攻击者控制之下。mayhem可以操作来自环境变量,文件,网络这些地方的攻击者输入。
  2. CEC加载漏洞程序,并且连接到SES去初始化所有符号输入。初始化之后,CEC在CPU上准确地执行二进制文件。在执行过程中,CEC给代码插桩,并且做动态污点分析。
  3. 当CEC遇到污点标记的分支条件或者跳转目标时,它会挂起当前的具体执行。一个污点的跳转意味着目标可能和攻击者输入有关。CEC将指令发送给SES,然后SES确定这个分支是否可行。CEC接下来会收到由SES确定的下一个分支目标。
  4. SES和CEC并行运行,主要是接受来自CEC的污点指令流。SES编译这些指令为中间语言,然后符号化地执行这些中间语言。当需要时(比如,当一个指令的操作数既有符号操作数也有一个具体的操作数),CEC会提供任何具体的值。SES保存两种公式:
    • 路径公式:路径公式表示到达特定代码行数的约束条件。每个条件跳转都会为输入添加一个新的约束。
    • 可利用性公式:可利用性公式主要是确定(1)攻击者是否能控制指令指针,(2)攻击者是否能执行payload。
  5. 当mayhem遇见一个污点分支点,SES通过查询SMT求解器来确定是否需要fork执行。如果我们需要弄一个分支来执行,所有的新分支都会被送到路径选择器去做排序。当要选择路径时,SES会告诉CEC变化了,并且存储相应的执行状态。如果到达了系统资源的cap,然后检查点管理器开始产生检查点而不是分出一个新的执行器。在过程的结束,会产生测试样例给终止的执行器,然后SES通知CEC从哪个检查点开始执行。
  6. 在执行过程中,SES在执行器间进行切换,CEC检测/存储SES提供的执行状态,然后继续执行。为了实现这点,CEC保留一个虚拟层来操作程序的内部动作,并且检查/存储多个程序的执行状态。
  7. 当mayhem检测出污点跳转指令,他就开始建立可利用性公式,并且查询SMT求解器去看是否满足条件。一个满足条件的输入就是一个利用。如果没有在污点分支指令处找到利用,SES继续探索执行路径。
  8. 前面的步骤都是在每个分支处进行的,直到找到一个可利用的bug。mayhem停止取决于用户设置的最大时间,或者所有路径都执行过了。

实现

  • 代码量:27000行的C/C++和OCaml
  • 二进制插桩框架:Pin
  • 所有钩子和API调用都是C/C++实现的
  • 符号执行引擎都是用Ocaml语言写的,包括10000行代码
  • 汇编指令转化为中间语言:BAP
  • 求解器:Z3
  • 通信机制:跨平台,轻量级RPC协议

结果

有效性

29个程序,主要是栈溢出和格式化字符串漏洞。都找到利用了。强…

在这里插入图片描述

可扩展性

从内存使用和速度来评估扩展性。

内存使用上比在线符号执行要使用得少。

a

速度上比离线符号执行要快得多。

在这里插入图片描述

也就是混合符号执行就是在线符号执行和离线符号执行的一个trade-off。

真实应用中的符号内存问题

table1中,40%的程序需要符号内存模型来实现利用。换句话说,mayhem经过几个小时的分析,仍然不能为这些没有基于索引的内存模型的程序生成利用。为了弄清原因,在atphttpd这个程序上评估了基于索引的内存模型优化效果。累积的加速效率有96%。但注意,mayhem无法在时间限制和有符号化数组情况下检测出exp。

覆盖率

关于覆盖率,指的是mayhem覆盖新路径的能力。这里和KLEE做了比较,两者的覆盖率差不多,都挺高的。Mayhem平均覆盖率是97.56%。需要注意的是mayhem的设计目的不是以覆盖率为导向的。

在这里插入图片描述

和AEG的比较

在这里插入图片描述

可以看到Mayhem要比AEG运行要慢3.4x。但这是由于AEG用了源码,而Mayhem是在二进制级别做的。

相关工作

先前相关的工作主要是APEG,AEG,Heelan的博士论文。

  • APEG使用补丁来定位到漏洞的位置,然后使用切片去构建从输入到漏洞处的代码路径的公式。

  • Heelan的工作是接受导致程序崩溃的输入和跳转寄存器,来自动生成利用。

  • AEG是第一个识别可利用漏洞并且生成利用的系统。AEG在源码上运行,并且引入了条件符号执行来解决搜索空间大的问题。Mayhem可以认为是AEG在二进制层面的扩展。

二进制的符号执行框架有Bouncer,BitFuzz,BitTurner,FuzzBall,McVeto,SAGE,S2E。

讨论

这篇文章的大部分工作主要是找可利用的漏洞。但这个主要技术是可以应用到别的场景中去的。文章的混合符号执行和基于索引的内存模型也可以作为符号执行发展的一个方向。mayhem重心在于告诉用户这里有个可利用的漏洞。mayhem并不能绕过ASLR,DEP这些防御机制。而先前的工作Q,可以弥补这个缺陷,将利用自动转化为可以绕过防御机制的利用。也就是说可以将mayhem产生的利用喂给Q,这篇文章并没有探索这种可能性。

缺陷:

  • 没有为所有系统调用或者库函数调用建模。要分析更复杂的程序,需要对更多的系统调用进行建模。S2E和bitblaze没有这个缺点,是因为他们可以执行用户和内核代码。然而这个优点也有缺点,就是会导致很高的状态空间存储开销和分析内核代码的高额时间开销。
  • 目前只能分析单线程的程序。并不能处理多线程的程序。
  • 污点分析所有的缺点。比如:undertainting, overtainting and implicit flows

未来工作:

  • 利用更多的漏洞,比如堆溢出,UAF和信息泄露。(利用安全属性)
  • 同样的技术如何能在更大的程序中扩展和检测这样的漏洞仍然是一个悬而未决的问题
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值