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

本文介绍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中,我构建了一个堆分配器,允许请求特定布局,然后假设该布局成立的情况下尝试生成利用,仅在确认布局可实现利用后才解决如何实现该布局。

我认为这种思路在其他漏洞类型的利用生成中也可能具有普遍适用性。例如,在竞态条件的利用生成系统中,可以有一种解决方案允许请求特定调度,检查该调度是否支持利用,仅在此后搜索提供该调度所需的输入。这种方法还允许手动和自动组件的混合。例如,在我们的案例中,我们假设堆布局成立,从中生成利用,最后尝试自动解决堆布局问题。我们的堆布局解决方案有一些前提条件,但在不满足这些条件的情况下,我们仍然可以在假设布局问题已解决的情况下自动生成利用的其余部分,最终由利用开发人员手动解决。

  1. 遗传算法优化堆布局:在去年的USENIX Security论文中,我讨论了一种用于堆布局操作的随机搜索算法。正如所料,优化两个需要相邻放置的块之间距离的遗传算法可以更好地完成此任务,尽管代价是实现更复杂且耗时。

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

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