Firecracker VM Escape: PwnEscape Part 2 Analysis

Firecracker 逃逸概述

此漏洞演示了一种从 Firecracker microVM 内部在宿主机上实现 root 级代码执行的方法。通过利用宿主机内存原语,攻击者可以定位 Firecracker 进程,识别活动的 vCPU 线程,并修改其保存的寄存器状态,从而在从 KVM_RUN 系统调用返回时重定向执行流。

定位宿主机进程和 vCPU 线程

该漏洞利用链依赖于识别与客户机相关的宿主机端资源。首先,客户机在内存页中放置一个唯一的随机数(nonce),然后使用扩展页表(EPT)遍历在宿主机物理内存中定位该页。一旦确定了该页的宿主机物理地址(HPA),攻击者就会使用宿主机的页表执行反向映射,从而识别 Firecracker 进程及其全局页目录(PGD)。

有了宿主机 PGD 和 Firecracker 二进制文件的加载基址(通过识别 ASLR 弹性映射的 ELF 镜像确定),攻击者就可以检查进程的内存。此阶段的最后一步是找到活动 vCPU 线程的 pt_regs 结构。攻击者会搜索与预期的 KVM_RUN ioctl 状态相匹配的帧,包括特定的指令指针、栈指针以及与正在运行的 microVM 相关的文件描述符。

重定向执行与载荷投递

一旦定位到保存的寄存器帧,攻击者就会修改线程的执行上下文以注入恶意载荷。通过覆盖保存的指令指针和栈数据,攻击者强制 Firecracker 进程对其自身的 stderr 执行 write(2) 调用,从而有效地证明了控制权。

为了确保稳定性,该漏洞利用采用了面向返回的编程(ROP)方法:

  1. 线程被重定向到 write 包装器以执行选定的操作。
  2. 使用 xor eax, eax; ret 序列清除返回值,以防止原始的 KVM_RUN 逻辑因意外的返回值而失败。
  3. 线程被返回到其原始执行路径,并恢复临时的栈修改,以防止 VMM 崩溃。

安全上下文与缓解措施

该演示是在未启用 jailer 的 Firecracker v1.16.1 上进行的。需要注意的是,Firecracker 的生产级容器化方案(包括使用 jailer 工具、seccomp 过滤器和命名空间隔离)旨在显著降低此类逃逸的影响。

"一个配置正确且经过 jailer 限制的 firecracker 实例将大大减少此逃逸的爆炸半径……我希望大多数生产环境的 firecracker 部署都已经这样做了。并不是说这不严重,而且根本问题并非 Firecracker 特有,而是内核网络代码中的一个缺陷——他们只是使用了不安全的 firecracker 配置来演示它。" — Commenter @scoodah

虽然此漏洞演示了一个强大的原语,但其在生产环境中的成功取决于宿主机沙箱配置的有效性。该底层漏洞凸显了与允许客户机与宿主机进程内存交互的内存访问原语相关的风险。

Sources

相关