What is VM Introspection?
一种不需要在 Guest VM 中运行工具,就可以获得 Guest VM 状态信息的方法
Why VM Introspection?
Use cases
实现这样的 VMI 功能,从技术层面来说需要两种能力支持:
Hypervisor-level support
从虚拟机监视器层面,提供对 guest VM 的访问,以及各种事件回调的能力。这些功能的实现通常是和监视器如何模拟硬件强相关的,硬件架构的不同(x86 / mips),和模拟方式的不同(TCG 软件模拟 / KVM 硬件模拟)可能都需要不同的实现方式。
OS-level introspection
从操作系统层面,VMI 工具需要提供关于 guest VM 上运行的操作系统级别的语义信息,这部分的实现根据操作系统的不同(Linux / Windows)存在显著差别。
VMI 在 Guest VM 外部获取的底层状态为二进制数据,其代表的操作系统级语义是无法直接知晓的,这种语义差异被称为 VMI 的语义鸿沟 (sematic gap)。
实际上解决这个问题就是需要一些关于 Guest Kernel 的符号和结构体信息,例如实现 task_struct 链表的遍历需要 init_task 的地址和 next_task 等字段的偏移地址。
因为我们主要关注于 Linux 上的 VMI 工具,所以按照 Hypervisor-level support 层面的实现对已有工具做区分。
TCG-based
基于 TCG 的工具在底层对 qemu 的修改上都是大同小异,这些工具的区别主要在于上层应用的侧重点不同。
KVM-based
基于 KVM 的工具主要都是同一个团队持续性的工作。
以 LibAFL QEMU 为例
qemu 对 CPU 指令的模拟属于动态二进制翻译的范畴,底层实现名为 Tiny Code Generator(TCG),总共会做两层翻译。
qemu 的翻译是基于一个基本块(basic block)的,翻译后的基本块叫做 TB(Translation Block )。一个最简单的执行流程就是在 qemu TCG engine 代码中翻译一个基本块,跳转过去执行,执行完一个基本块后又回到 TCG engine 的代码翻译下一个基本块。