abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-nat-tftp-prefix
类别: 文件读取 触达: 在 UI:R 导入后为本地(客户机)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
vbox:Machine OVF 导入会清理 ExtraData、共享文件夹、NVRAM 路径和串口 RawFile。它从不处理 NAT 的 enable-tftp 或 TFTP 的 @prefix。libslirp 仅在 tftp_prefix 为 NULL 时禁用 TFTP。DrvNAT 的 g_strdup("") 保持非 NULL。客户机以 / 或空前缀发起 RRQ etc/passwd 会变成 /etc/passwd。客户机名称中的 ../ 仍会被拒绝。
导入的 NAT TFTP 在空前缀或 / 前缀下,允许客户机以 VBox UID 身份 RRQ 主机文件。 不是写入。不是主机内核。不是已关闭的 ../ 检查的遗留。
| ID | 暂无 CVE |
| 类别 | 文件读取(客户机 TFTP RRQ 主机路径) |
| 触达 | 在 UI:R 导入 vbox:Machine OVF 后为本地(客户机),随后启动 VM |
| CWE | CWE-22,CVE-2022-21394 前缀类问题的遗留 |
| CVSS | 高:7.7 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N |
| 产品 | Oracle VM VirtualBox OSS |
| 受影响 | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| 认证 | 客户机内无需认证;主机用户必须导入后启动 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 源码测试框架;回环 compose;未启动 VirtualBox |
提供一个 vbox:Machine OVF/OVA,其 NAT blob 包含 enable-tftp 且 TFTP 前缀为 / 或空,外加一个会向 NAT 网关(10.0.2.2:69)发起 TFTP RRQ 的客户机磁盘。主机用户导入(File / Import 或 VBoxManage import)并启动 VM。导入会清除 ExtraData、共享文件夹、串口 RawFile 和 NVRAM 路径。TFTP 字段得以保留。启动时,ConsoleImplConfigCommon 插入 EnableTFTP。空前缀会从 CFGM 中省略;随后 DrvNAT 将 TFTPPrefix 默认为 "" 并对其执行 g_strdup。libslirp 将其视为已启用。
这就是完整的权限集合。此处不涉及主机写入、VM 进程堆原语或内核逃逸。
| 方法 | 汇聚点 | 权限 |
|---|---|---|
以导入的前缀 "" 对 oracle/VBOX-OVF-NAT-TFTP-PREFIX-WITNESS 发起 TFTP RRQ | libslirp tftp_handle_rrq,随后对前缀 + / + 客户机名称执行 RTFileOpen | 实验证明。 空前缀保持非 NULL。构建的路径为 /oracle/VBOX-OVF-NAT-TFTP-PREFIX-WITNESS。只读打开返回了见证字节。 |
以导入的前缀 / 对同一名称发起 TFTP RRQ | 同上 | 实验证明。 构建的路径为 //oracle/...,在 POSIX 下等同于 /oracle/...。返回了见证字节。 |
客户机以空前缀 RRQ etc/passwd 的纯路径类比 | "" + "/" + "etc/passwd" | 实验证明的路径构建。 结果为 /etc/passwd。实验环境不会打开主机 /etc。 |
对 VBox UID 可打开的任何相对名称发起 TFTP RRQ(主目录密钥、VirtualBox.xml、主机 /etc、Windows 当前驱动器根目录) | 同一 RTFileOpen | 推断。 相同的拼接方式。进程无法打开的文件保持关闭(File not found)。 |
| 方法 | 权限 |
|---|---|
| TFTP WRQ | 已关闭。 此 TFTP 服务器仅支持 RRQ。无写入处理程序。 |
| 主机文件覆盖 / 创建 | 已关闭。 只读 RTFILE_O_READ。 |
| VM 进程堆、VBoxSVC、其他 VM、主机内核 | 已关闭。 此遗留问题是对构建路径的文件打开。 |
| TFTP DoS | 超出范围。 |
fEnableTFTP 写为 false(Settings.cpp NATEngine 构造函数)。VBoxNetSlirpNAT 总是将 tftp_path 设置为 <VirtualBox home>/TFTP。RRQ 请求保持在该前缀之下。../ 和末尾的 / 仍会触发“访问违规”。这是已关闭的 CVE-2022-21394 路径遍历。/work/tftp/boot.pxe)。导入此设备并启动虚拟机的真实主机会让客户机读取 VBox UID 能够打开的任何路径。该实验环境是此路径遍历的源码测试框架。VirtualBox 并未启动。
我固定了 VirtualBox/virtualbox v7.2.20(f2792cf44)。NAT 加 OVF 排查。7.2 将 NAT 切换为捆绑的 libslirp 4.9.3。从 .ova 中遵循共享文件夹已被视为危险并予以剥离。TFTP 不在该列表中。
Settings.cpp 在导入 vbox:Machine 时仍会读取 NAT 的 enable-tftp 和 TFTP/@prefix:
elmMode.getAttributeValue("enable-tftp", nic.nat.fEnableTFTP);
// ...
pelmTFTP->getAttributeValue("prefix", nic.nat.strTFTPPrefix);
ApplianceImplImport.cpp:6147 对它们记得的所有内容进行了清理:
config.sanitizeImportedSerialPorts();
config.sanitizeSharedFolderSettings();
config.sanitizeImportedNvramSettings();
if (!m->optListImport.contains(ImportOptions_KeepExtraData))
config.sanitizeImportedExtraData();
这四个代码块从未提及 strTFTPPrefix 或 fEnableTFTP。
启动时,ConsoleImplConfigCommon.cpp:2286-2292 仅在 TFTPPrefix 非空时插入它,并且始终插入 EnableTFTP。DrvNAT.cpp:1656-1665 对于省略该键的旧虚拟机将 EnableTFTP 默认为 true,然后:
rc = pDrvIns->pHlpR3->pfnCFGMQueryStringAllocDef(pCfg, "TFTPPrefix", &pszTmp, "");
slirpCfg.tftp_path = pszTmp;
slirp.c:698 是 g_strdup。空值保持非 NULL。tftp.c:353-357 仅在 NULL 时禁用。364-370 会前置前缀、/、客户机名称。398-407 拒绝 ../。然后对构建出的路径执行 RTFileOpen。
已记录的误区:将客户机 ../ 视为遗留问题(CVE-2022-21394,仍被拒绝);将默认新虚拟机视为受影响;将 NAT Network 的 home/TFTP 视为该遗留问题;声称存在 WRQ 写入;声称涉及宿主内核。表演性操作:打开宿主 /etc/passwd。判定依据是 /oracle 下的见证文件。
python3 vbox-ovf-nat-tftp-prefix-Abraxas-Labs.py
或
cd lab
./run.sh
pin 消毒器的源 harness、DrvNAT 空字符串默认值、g_strdup 以及 libslirp 的 tftp_handle_rrq。Docker compose 项目 vbox-ovf-nat-tftp-prefix。仅回环。VirtualBox 未启动。见证文件 VBOX-OVF-NAT-TFTP-PREFIX-WITNESS 被放置在 /oracle/...。控制 PXE 文件为 /work/tftp/boot.pxe。最后一行:
SUCCESS vbox-ovf-nat-tftp-prefix sanitize-miss=yes null-disable=yes empty-prefix-read=yes slash-prefix-read=yes dotdot-reject=yes VBOX-OVF-NAT-TFTP-PREFIX-WITNESS
在导入 vbox:Machine 时,像清除 ExtraData 和共享文件夹那样,对 nat.fEnableTFTP 和 nat.strTFTPPrefix 进行净化处理。除非前缀是一个受限目录,否则按失败关闭处理。将空字符串视为 NULL,以便 libslirp 禁用 TFTP。不要将 g_strdup("") 写入 tftp_prefix。
f2792cf44f663989818507e36d3db5f978523c5e)Settings.cpp NAT TFTP 读取(4873、4888-4894)和导入净化器(9654-9682)ApplianceImplImport.cpp i_importVBoxMachine(6147-6151)ConsoleImplConfigCommon.cpp(2286-2292)DrvNAT.cpp(1656-1665)slirp.c g_strdup(698)tftp.c(353-407)../;此遗留问题即 OVF 植入的前缀Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]