灰盒漏洞自动生成:解释器堆溢出漏洞的模块化利用

本文介绍Gollum系统,一种针对解释器中堆溢出漏洞的模块化灰盒自动利用生成方法。该系统通过轻量级插桩和模糊测试技术,实现了漏洞原语的自动发现和利用构造,在PHP和Python解释器的10个漏洞测试中取得了显著成果。

Gollum:解释器堆溢出的模块化灰盒利用生成

在即将举行的ACM计算机与通信安全会议(CCS)上,我将发表一篇关于自动利用生成(AEG)的论文,标题与本博客文章相同。您可以在[此处]找到该论文。

在论文中,我讨论了一个系统,用于自动发现原语并利用解释器中的堆溢出构造漏洞利用。该论文采用的方法与大多数其他AEG解决方案有所不同,它完全是灰盒的,依赖于轻量级插桩和各种类似模糊测试的输入生成。下图显示了系统的各个阶段,论文中对每个阶段进行了详细解释。

![工作流程图显示Gollum如何生成利用和原语]

在评估方面,我使用了PHP和Python解释器中的10个漏洞作为测试,并将这些作为输入提供给Gollum,用于其搜索原语和构建漏洞利用。

![利用生成和原语搜索结果]

论文中有三个主要要点值得强调(详见论文!):

1. AEG是一个多阶段过程

通过将问题分解为不同的阶段,可以使用轻量级插桩和相对简单的输入生成的模糊测试组合来攻击其中多个阶段。传统上,AEG系统使用符号执行作为主要驱动方式,虽然这有一些优点,但也遇到了符号执行预期的所有可扩展性问题。在去年USENIX Security的一篇论文中,我展示了如何通过轻量级插桩,使用应用程序的现有测试结合模糊器来发现可用于执行堆布局操作的语言片段,以及分配有趣的对象进行破坏。在即将发表的CCS论文中,我展示了如何使用类似的方法来发现利用原语,并在某些情况下甚至构建漏洞利用。值得注意的是,Wu等人在关于FUZE的论文中采用了类似的方法,您应该查看他们的论文以了解另一个示例系统。我的猜测是,在未来几年,模糊测试驱动的漏洞利用生成可能将成为主流,而符号执行将在需要其位精确推理且可以限制状态空间爆炸的场景中得到利用。

2. 延迟解析在利用生成中的应用

当自动构建堆溢出漏洞利用时,需要一种解决方案来实现所需的堆布局,然后另一种解决方案来构建利用的其余部分。在CCS论文中,我引入了在利用生成中延迟解析任务的想法。本质上,这是一种以相反顺序解决堆布局操作和其余利用生成问题的方法。这样做的原因很简单:在一个引擎中,实现堆布局的过程可能比创建利用其余部分的过程花费更长的时间(Gollum就是这种情况),因此检查在假设更困难的问题可解的情况下是否可能产生利用是有意义的,然后只有在它能够实现利用时才去解决它。具体来说,在Gollum的情况下,我构建了一个堆分配器,允许您请求特定的布局,然后您可以在假设布局成立的情况下尝试生成利用,并且只有在知道它能够实现利用后才去弄清楚如何实现它。

我认为这种想法在其他漏洞类型的利用生成中可能也更有用,例如,在用于竞争条件的利用生成系统中,可以有一个解决方案,允许请求特定的调度,检查该调度是否能够实现利用,然后才搜索提供该调度所需的输入。这种方法还允许手动和自动组件的混合。例如,在我们的案例中,我们假设堆布局成立,然后从中生成利用,最后尝试自动解决堆布局问题。我们的堆布局问题解决方案有许多先决条件,但在不满足这些条件的情况下,我们仍然可以在假设布局问题已解决的情况下自动生成利用的其余部分,最终漏洞利用开发人员可以手动自行解决。

3. 遗传算法在堆布局操作中的优势

在去年的USENIX Security论文中,我讨论了一种用于堆布局操作的随机搜索算法。正如您所料,遗传算法可以更好地执行此任务,它优化了您希望彼此相邻的两个块之间的距离,尽管代价是更复杂和耗时的实现。

![随机搜索(rand)与遗传算法(evo)解决的堆布局基准测试百分比]

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计