二进制漏洞分析-37.Hyperpom:适用于 64 位 ARM 二进制文件的 Apple Silicon Fuzzer
2024-1-9 09:29:37 Author: 安全狗的自我修养(查看原文) 阅读量:7 收藏

Hyperpom:适用于 64 位 ARM 二进制文件的 Apple Silicon Fuzzer

正在发布的 Hyperpom是一款用 Rust 编写的 64 位 ARM 二进制模糊测试器,基于 Apple Silicon 的虚拟机管理程序。它基于突变和覆盖指导。本文概述了其内部结构,介绍了它由不同的组件组成以及它们之间的关系。最重要的是,它还收集了入门和开始模糊测试自己的 64 位 ARM 目标所需的所有资源。

目录

  • Hyperpom 简介

  • 模糊测试目标

  • 开始

  • 结论

  • 引用

在没有源代码的情况下有效地模糊测试二进制文件并不容易。如果您以不常见的架构为目标,想要一定程度的检测以及良好的性能,那就更难了。在 Impalabs,我们通常使用独角兽或 Manticore 等工具进行模拟或符号执行。但是,在运行时从一种架构转换为另一种架构意味着您将始终失去一些宝贵的 CPU 周期。

在过去的几年里,我们一直瞄准主要在 ARM SoC 上运行的移动设备。虽然它不像其他“异国情调”的架构那么糟糕,但与 x86 及其变体相比,工具肯定是缺乏的。然而,随着 M1(现在是 M2)Apple Silicon SoC 的推出,Apple 在 ARM 二进制分析方面打开了新可能性的大门,这在一定程度上要归功于现有的 macOS 生态系统。

二进制模糊测试可以通过不同的方法解决,但在这篇博文中,我们将特别关注基于虚拟机管理程序的模糊测试。使用在 ARM 上以 EL2 运行的虚拟机管理程序,我们可以对内核和用户空间目标进行模糊测试,它们分别在 EL1 和 EL0 上运行。在 MacOS 上,有一个专用框架,用于抽象对虚拟机管理程序的访问,即 Hypervisor.framework。这篇博文的其余部分详细介绍了我们如何利用这个框架来构建 Hyperpom

Hyperpom 是一个基于 Apple Silicon 虚拟机管理程序的 64 位 ARM 二进制模糊测试器,完全用 Rust 开发。它基于突变和覆盖指导。使用虚拟机管理程序可以完全控制目标二进制文件,并允许非常容易地添加自省机制。例如,我们可以实现代码覆盖率收集、挂钩系统、添加检测等。

如介绍中所述,Hyperpom 基于 Apple 的 ,一个旨在创建和管理虚拟机的框架。它将虚拟机抽象为进程,将虚拟处理器抽象为线程。创建虚拟机后,模糊器可以像常规操作系统一样管理其物理内存和虚拟 CPU。为了从 Rust 访问,已经开发了绑定,可以在这里找到。Hypervisor.frameworkHypervisor.framework

Hyperpom 的架构非常标准。每个虚拟 CPU 都运行一个工作线程,该工作线程对自己的二进制实例进行模糊处理。然后,这些实例共享信息,例如语料库和覆盖率数据,以加快该过程。

但是,在这一点上,考虑到我们只能访问物理内存和 vCPU,我们必须从头开始构建整个模糊器。首先,我们必须处理内存管理。为每个工作线程使用唯一的虚拟地址空间可以让我们更好地控制他们可访问的内存,还可以防止在模糊测试时无意中访问彼此的内存(例如,由于访问位于分配给另一个来宾的页面上而未检测到的 OOB)。为此,我们实现了:

  • 物理内存分配器,用于管理物理内存分配;

  • 页表管理器,用于将虚拟内存区域映射到物理内存区域;

  • 虚拟内存分配器,用于抽象映射虚拟内存的过程(即创建物理内存映射和页表条目)。

然后我们实现了异常处理,这是模糊器的支柱之一。通过从客户机引发异常,我们能够将控制权交还给虚拟机管理程序,并使用它们来检测是否发生了崩溃、是否放置了钩子、是否发现了新的覆盖路径等。虚拟机管理程序处理异常后,客户机将恢复其执行并继续正常执行。此外,由于虚拟 CPU 的行为与真实 CPU 类似,我们还必须处理 ARM 实现的特殊性,例如缓存。

有了这些低级构建块,我们现在可以开始为模糊器实现实际功能,例如钩子系统,以在运行时检测和获取有关目标的信息。然后,使用钩子作为基础,我们可以提供:

  • 通过在任意地址放置钩子来调用用户定义的函数;

  • 代码覆盖率,通过挂钩改变执行流程的指令并在到达时存储其地址;

  • 通过挂钩二进制文件的每个指令进行跟踪。

模糊测试活动由主进程编排,主进程会生成模糊测试工作线程。然后,这些工作线程执行目标的实例,并从共享语料库中向它们提供突变的测试用例。然后,使用来自二进制文件检测的运行时信息,我们可以根据测试用例所覆盖的路径来决定是否应该保留测试用例。发生崩溃时,与模糊器当前状态相关的信息存储在文件中,以后可以查看。

现在我们已经大致了解了模糊器的组件以及它们之间的关系,我们可以解释一下目标实际上是如何利用的。Hyperpom 是一个框架,它提供了一个反映模糊器生命周期的 API。通过实现 Loader 特征,用户可以按照他们认为合适的方式自定义模糊器。它允许访问模糊器的核心组件,例如虚拟内存分配器或虚拟 CPU,以在启动模糊器之前加载任意二进制文件、定义钩子并初始化 CPU 的状态。

此特征定义的方法试图尽可能最好地反映二进制文件在模糊测试时所经历的所有步骤。

  • 首先使用 Loader::map 解析二进制文件以映射到模糊器的虚拟地址空间。

  • 然后可以使用 Loader::hooks 应用用户定义的钩子。

  • 我们现在已经进入了快照前阶段。方法 Loader::p re_snapshot 在获取虚拟地址空间的快照和 CPU 状态之前执行所有剩余操作。例如,在这个步骤中,我们可以从二进制文件调用初始化函数,这样我们就不必每次迭代都这样做。执行这些操作后,将创建虚拟内存和 vCPU 的快照。

  • 从此时开始,模糊测试器进入迭代循环,这意味着当迭代完成时,我们将返回此步骤,并使用快照重置模糊器的状态。对于每次迭代,第一个操作是从语料库中检索测试用例,使用 Loader::mutate 对其进行更改,并将其传递给 Loader::load_testcase 函数,在该函数中可以任意加载到地址空间中并由目标二进制文件使用。

  • 在快照之后、实际执行之前需要发生的每个操作都可以在 Loader::p re_exec 中定义。

  • 现在执行实际上发生了,这是模糊器的工作,这里无事可做。:)

  • 如果在执行测试用例后需要清理某些内容,可以使用 Loader::p ost_exec 来完成。

当发生崩溃时,我们会脱离这个生命周期,切换到崩溃验证过程。由于内部状态和全局状态可以在模糊测试器处于活动状态时演变,因此我们需要能够在重放测试用例时控制它们。如果需要重置可能影响崩溃重新运行的变量,可以通过实现 Loader::reset_state 来实现。如果是合法的崩溃,则使用 Loader::format_crash 对其进行格式化,并由模糊器写入文件。

本节中的信息只是模糊测试器的 API 的概述。您可以查看 Loader 特征的文档以获得更全面的描述。

要开始使用 Hyperpom,您可以查看 Hyperpom 的 GitHub 存储库中的 README。您应该找到安装 Hyperpom、设置开发环境和开始模糊测试所需的所有信息。

您还可以查看文档,其中解释了模糊器的内部结构,特别是 Loader 特性,以深入了解模糊器的 API。

还建议查看存储库中提供的示例,以更好地了解框架的运行方式。

  • simple_executor:展示如何使用执行器在 VM 中运行任意代码。

  • simple_tracer:在跟踪程序指令的同时运行程序。

  • simple_fuzzer:对一个简单的程序进行模糊测试。

  • upng_fuzzer:对uPNG库进行模糊处理。

在这篇博文中,我们介绍了 Hyperpom,这是一款用 Rust 编写的 64 位 ARM 二进制模糊测试器,基于 Apple Silicon 的虚拟机管理程序。Hyperpom仍处于早期阶段,需要额外的打磨才能更有效。更高版本应该实现新的覆盖策略,通过提供额外的特征方法等,允许对模糊器进行更多控制。

关于表演,主要限制之一是在主持人和客人之间进行上下文切换所需的时间。最好对模糊器的某些部分进行改造,以尽可能减少它们的数量。事后看来,编写一个操作系统并在其中实现所有内容可能是一个更好的主意(也许对于 v2.0,谁知道呢)。

归根结底,虽然还有工作要做,但 Hyperpom 已经可以对 AArch64 目标进行模糊处理,并以不错的速度在专有二进制文件中查找错误。即使它在当前状态下不足以满足您的用例,您也希望重新调整代码的某些部分的用途,以构建更适合您需求的模糊器。无论如何,如果您遇到无法解决的问题或有改进项目的建议,欢迎您在我们的 GitHub 存储库上提出问题进行讨论。

  • 超载:基于 Apple Silicon 虚拟机管理程序的 AArch64 模糊测试器。

    • GitHub 存储库:https://github.com/impalabs/hyperpom

    • 板条箱 - https://crates.io/crates/hyperpom

    • 文档 - https://docs.rs/hyperpom

  • Applevisor:Apple Silicon Hypervisor.framework 的 Rust 绑定。

    • GitHub 存储库 - https://github.com/impalabs/applevisor

    • 板条箱 - https://crates.io/crates/applevisor

    • 文档 - https://docs.rs/applevisor

  • 洞课程()

  • windows

  • windows()

  • USB()

  • ()

  • ios

  • windbg

  • ()


文章来源: http://mp.weixin.qq.com/s?__biz=MzkwOTE5MDY5NA==&mid=2247491129&idx=1&sn=36f1535c328be0e51a3f704df27f741f&chksm=c0c5a572f05e52d821235ef1b10f13c3eb91f6301ccb960e3a030709ac839fbdb127b7c7e3c2&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh