VirtualBox Slirp NAT Packet Heap Exploitation
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
TL;DR
- VirtualBox ships a heavily modified fork of Slirp whose packet buffers (mbufs) live in a custom zone allocator with inline metadata and function-pointer callbacks (
pfFini,pfDtor). - 来宾(guest)可以用攻击者控制的 IP 报头长度重写受信任的
m->m_len,这会破坏之后的所有边界检查,并产生 infoleak 和 overwrite primitives。 - 通过滥用校验和为
0且过大的ip_len的 UDP 包,guest 可以将 mbuf 尾部和相邻 chunk 的元数据 exfiltrate 出来,以便获取 heap 和 zone 地址。 - 通过提供精心构造的 IP 选项,迫使
ip_stripoptions()对数据就地memcpy()过多数据,从而攻击者可以覆盖下一个 mbuf 的struct item头并将其zone字段指向完全受控的数据。 - 释放被破坏的 mbuf 会触发
zone->pfFini()并带有攻击者提供的参数;将其指向memcpy@plt可以得到任意的 copy/write primitive,进而可以定向写入 GOT 条目或非-PIE VirtualBox 二进制内的其他控制数据。
Packet allocator anatomy
VirtualBox allocates every ingress Ethernet frame from a per-interface zone named zone_clust. Each 0x800-byte data chunk is preceded by an inline header:
struct item {
uint32_t magic; // 0xdead0001
void *zone; // uma_zone_t pointer with callbacks
uint32_t ref_count;
LIST_ENTRY(item) list; // freelist / used list links
};
当一个 mbuf 被释放时,调用栈 m_freem -> ... -> slirp_uma_free() 信任内联头:
uma_zfree_arg()重新计算item = (struct item *)mem - 1并且 should 验证item->zone,但Assert()在发布版本中被编译移除。slirp_uma_free()加载zone = item->zone并且无条件地执行zone->pfFini(zone->pData, data_ptr, zone->size),随后执行zone->pfDtor(...)。
因此,任何对 mbuf 头部的 write-what-where 都会在 free() 期间转化为受控的间接调用。
Infoleak 通过 m->m_len 覆盖
在 ip_input() 的顶部,VirtualBox 添加了:
if (m->m_len != RT_N2H_U16(ip->ip_len))
m->m_len = RT_N2H_U16(ip->ip_len);
Because the assignment happens 在验证 IP 头之前, 来宾可以宣告任意长度到 0xffff。栈的其余部分(ICMP、UDP、fragmentation handlers 等)假定 m->m_len 是可信的,并用它来决定从 mbuf 拷贝多少字节。
使用 checksum 为 0 的 UDP 包(表示“no checksum”)。NAT fast-path 会转发 m->m_len 字节而不检查 payload 完整性,因此膨胀 ip_len 会导致 Slirp 读取超出真实缓冲区并将 heap 残留返回给 guest 或 NAT 之外的配合外部 helper。因为 chunk 大小为 2048 字节,the leak can include:
- 下一个 mbuf 的 inline
struct item,泄露 freelist 顺序和真实的zone指针。 - 堆 cookie(例如
magic字段),在之后执行破坏时帮助构造看起来合法的头。
Overwriting neighbouring chunk headers with IP options
相同的伪造长度可以通过强制数据包通过 ip_stripoptions()(当 IP 头有 options 且 payload 为 UDP/TCP 时触发)变成覆盖原语。helper 从 m->m_len 计算一个拷贝长度,然后调用 memcpy() 将 transport header 向前移动以覆盖被剥离的 options:
- 提供一个很长的
ip_len,使得计算出的移动长度延伸过当前 mbuf。 - 包含少量 IP options,让 Slirp 进入 stripping 路径。
- 当
memcpy()运行时,它会从后续 mbuf 读取并写入当前 mbuf 的 payload 和 inline header,破坏magic、zone、ref_count等。
因为 allocator 保持来自同一接口的包在 freelist 上是连续的,这个 overflow 在经过适度的堆 groom 后会确定性命中下一个 chunk。
Forging uma_zone_t to hijack pfFini
一旦相邻的 struct item 可被破坏,利用流程如下:
- 使用泄露的堆地址在一个完全由 guest 控制的 mbuf 内构建假
uma_zone结构。填充:pfFini为memcpy()的 PLT 条目。pData为目标指针(例如 GOT 条目、vtable 槽、函数指针数组)。size为要拷贝的字节数。- 可选:将
pfDtor作为第二阶段调用(例如调用新写入的函数指针)。
- 将目标 mbuf 的
zone字段覆盖为指向假结构的指针;调整list指针以使 freelist 记账保持足够一致以避免崩溃。 - free 该 mbuf。现在
slirp_uma_free()会执行memcpy(dest=pData, src=item_data, n=size),而当时 mbuf 仍包含 guest 可控数据,从而实现任意写。
因为 Linux VirtualBox 二进制为 non-PIE,memcpy 和 system 的 PLT 地址是固定的,可直接使用。guest 也可以把如 /bin/sh 的字符串藏在另一个在被劫持调用执行时仍被引用的 mbuf 中。
Heap grooming via fragmentation
Slirp 的 per-interface zone 深度为 3072 个 chunk,最初作为连续数组分配,其 freelist 从高地址向下遍历。可通过以下方法实现确定性相邻:
- 向 NAT 洪泛许多大小恒定的
IP_MFfragments,使重组代码分配可预测的 mbuf 序列。 - 通过发送超时的碎片回收特定 chunk,迫使 frees 以 LIFO 顺序返回 freelist。
- 利用对 freelist 遍历的了解,将将来的受害者 mbuf 放在将承载 IP options overflow 的 mbuf 之后。
这种 grooming 确保 overflow 命中目标 struct item,并且假 uma_zone 保持在 leak 原语的可泄露范围内。
From arbitrary write to host code execution
利用 memcpy-on-free 原语:
- 将攻击者控制的
/bin/sh字符串和命令缓冲区拷贝到一个稳定的 mbuf 中。 - 使用原语覆盖 GOT 条目或间接调用点(例如 NAT 设备状态内的函数指针)为
system()的 PLT 条目。 - 触发被覆盖的调用。因为 VirtualBox 在主机进程内运行 NAT 设备,payload 将以运行 VirtualBox 的用户权限在主机上执行,从而实现 guest 到 host 的逃逸。
可选 payload 包括在堆内种植一个小型 ROP 链并将其地址拷贝到频繁调用的回调中,或将 pfFini/pfDtor 本身指向串联的 gadget 以实现重复写入。
References
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
HackTricks

