Gollum: 解释器中堆溢出的模块化灰盒漏洞利用生成
在即将举行的ACM计算机与通信安全会议(CCS)上,我将发表一篇关于自动漏洞利用生成(AEG)的论文,标题与本博客文章相同。论文可在此处找到。在论文中,我讨论了一个系统,用于自动发现原语并利用解释器中的堆溢出来构建漏洞利用。论文采用的方法与大多数其他AEG解决方案略有不同,因为它完全是灰盒的,依赖于轻量级插桩和各种类似模糊测试的输入生成。下图显示了系统的各个阶段,每个阶段在论文中都有详细解释。
在评估方面,我使用了PHP和Python解释器中的10个漏洞作为测试,并将这些作为输入提供给Gollum,用于其搜索原语和构建漏洞利用。
论文中有三个主要要点值得强调(详见论文!):
-
AEG是一个多阶段过程,通过将问题分解为不同的阶段,可以使用轻量级插桩和相对简单的输入生成的模糊测试组合来攻击多个阶段。传统上,AEG系统使用符号执行作为主要驱动,虽然这有一些优点,但也遇到了符号执行预期的所有可扩展性问题。在去年USENIX Security的一篇论文中,我展示了如何通过轻量级插桩使用应用程序的现有测试,结合模糊测试器,来发现可用于执行堆布局操作的语言片段,以及分配有趣的对象来破坏。在即将发表的CCS论文中,我展示了如何使用类似的方法来发现利用原语,并在某些情况下甚至构建漏洞利用。值得注意的是,在Wu等人的FUZE论文中,他们采用了类似的方法,你应该查看他们的论文以了解另一个示例系统。我的猜测是,在接下来的几年中,模糊测试驱动的漏洞利用生成可能会成为主流,而符号执行将在需要其位精确推理且状态空间爆炸可以受限的场景中发挥作用。
-
当自动构建堆溢出漏洞利用时,需要一个解决方案来实现所需的堆布局,然后另一个解决方案来构建漏洞利用的其余部分。在CCS论文中,我引入了漏洞利用生成中任务延迟解析的想法。本质上,这是一种以相反顺序解决堆布局操作和漏洞利用生成其余部分问题的方法。这样做的原因很简单:在一个引擎中,实现堆布局的过程可能比创建漏洞利用其余部分的过程花费更长的时间(如Gollum中的情况),检查在假设更困难的问题可解的情况下是否可行生成漏洞利用,然后只有在它启用漏洞利用时才去解决它是有意义的。具体来说,在Gollum的情况下,我构建了一个堆分配器,允许您请求特定的布局,然后您可以在假设布局成立的情况下尝试生成漏洞利用,并且只有在知道它启用漏洞利用后才弄清楚如何实现它。
我认为这种想法可能在其他漏洞类型的漏洞利用生成中更普遍有用,例如,在竞争条件的漏洞利用生成系统中,可以有一个解决方案,允许请求特定的调度,检查该调度是否启用漏洞利用,然后才搜索提供调度所需的输入。这种方法还允许手动和自动组件的混合。例如,在我们的案例中,我们假设堆布局成立,然后从中生成漏洞利用,最后尝试自动解决堆布局问题。我们的堆布局问题解决方案有许多先决条件,但在不满足这些条件的情况下,我们仍然可以在假设布局问题已解决的情况下自动生成漏洞利用的其余部分,最终漏洞利用开发者可以手动解决它。
- 在去年的USENIX Security论文中,我讨论了一种用于堆布局操作的随机搜索算法。正如您可能预期的那样,遗传算法优化您想要彼此相邻放置的两个块之间的距离,可以更好地执行此任务,尽管代价是更复杂和耗时的实现。