abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-href-dest-escape
类别: 文件写入 触达范围: 本地(主机)UI:R
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
导入恶意 OVF/OVA 的主机用户会将磁盘镜像字节写入新 VM 文件夹之外。ovf:href 即目标文件名。RTPathAbsExCxx 未采用 RTPATHABS_F_STOP_AT_BASE。唯一路径辅助函数在后缀前插入 _%i,且不剥离基名。
| ID | 暂无 CVE |
| 类别 | 文件写入(OVF/OVA 目标路径) |
| 触达范围 | 本地(主机) UI:R(受害者导入恶意设备) |
| CWE | CWE-22 |
| CVSS | 高危:7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| 产品 | Oracle VM VirtualBox OSS |
| 受影响版本 | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| 认证 | VirtualBox 上无需认证。主机用户打开 文件/导入 或执行 VBoxManage import。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1。源码测试框架。VirtualBox 未启动。 |
投递一个 OVF 目录或 OVA。在 ovf:href 中放入 ../somewhere/disk.vmdk 或绝对路径 /path/disk.iso。导入该设备的操作者会以导入者 UID 通过 CREATE_REPLACE 写入这些磁盘镜像字节,包括原本不存在的父目录。需要后缀(vmdk / iso / 其他 MediumFormat 扩展名)。这不是无后缀投放 authorized_keys。
| 权限 | 方法 + 汇聚点 | 授予的能力 | 来源 |
|---|---|---|---|
| 完整性 | IAppliance::read 复制 File/href 时不剥离基名(ovfreader.cpp)。Appliance::interpret() 设置 dest = di.strHref(ApplianceImplImport.cpp 802-851)。 | 目标文件名由攻击者选择,包括 ../ 和绝对路径。 | 实验验证(相对和绝对 href) |
| 完整性 | i_ensureUniqueImageFilePath(ApplianceImpl.cpp 1126-1160)调用 RTPathAbsExCxx(strAbsName, aMachineFolder, aName) 时未使用 RTPATHABS_F_STOP_AT_BASE。冲突时在 aName 的后缀前插入 _%i,而非基名。 | 唯一目标仍会走出机器文件夹。../oracle/WITNESS.vmdk 变为 ../oracle/WITNESS_1.vmdk。 | 实验验证(unique-keeps-dotdot=yes) |
| 完整性 | 导入时 i_importOneDiskImage 再次调用 AbsEx(ApplianceImplImport.cpp 4169-4171)。i_importCreateAndWriteDestinationFile(1043-1053)先 mkdir 父目录,再 RTFILE_O_CREATE_REPLACE。 | 磁盘镜像字节落在 VM 文件夹之外。绝对 href 忽略机器文件夹。对照 disk.vmdk 留在文件夹内。 | 实验验证(relative-escape=yes absolute-href=yes control-in-folder=yes) |
| 侦察 | 导入向导 / VBoxManage import --dry-run 显示目标路径。 | 路径可见。本身不构成秘密泄露。 | 推断 |
| 可用性 | 相对目标落在另一 VM 的磁盘上。 | 以导入者 UID 覆盖该文件。 | 推断(相同的 CREATE_REPLACE 写入) |
| 已关闭 | 无 MediumFormat 后缀的目标 | 导入抛出 has no extension。不是无后缀写入 authorized_keys / crontab。 | 已关闭 |
| 已关闭 | NVRAM 目标 | 强制为机器文件夹下的 {vmname}.nvram。 | 已关闭 |
| 已关闭 | VM 名称 .. | sanitiseMachineFilename 会对其进行处理。 | 已关闭 |
| 已关闭 | 共享文件夹 / ExtraData / 串口 RawFile | 在 vbox:Machine 路径上已净化。 | 已关闭 |
| 已关闭 | 主机内核、客户机到主机 | 不是此遗留问题。无需启动 VM。与导入者相同 UID。 | 已关闭 |
OVA 是干净的路径:tar 成员提供字节,href 提供转义后的目标路径。没有 3D,没有 Guest Additions,没有 VRDP,也不是 PUEL。
在 2026 年 9 月的 CPU 之后,我停留在标签 v7.2.20(f2792cf44)上,并阅读了 OVF 导入相关代码。ExtraData、共享文件夹、NVRAM 目标路径和串口 RawFile 都已被剥离。但磁盘目标路径没有。interpret() 将 di.strHref 直接复制到 HardDiskImage 的 VBox 值中:
Utf8Str strFilename = di.strHref;
/* ... */
i_ensureUniqueImageFilePath(strMachineFolder, devType, strFilename);
pNewDesc->i_addEntry(VirtualSystemDescriptionType_HardDiskImage,
hd.strDiskId,
di.strHref,
strFilename,
di.ulSuggestedSizeMB,
strExtraConfig);
ApplianceImpl.cpp 1126-1160 在没有 RTPATHABS_F_STOP_AT_BASE 的情况下,将该名称与机器文件夹进行拼接补全,然后就地修改 aName:
int vrc = RTPathAbsExCxx(strAbsName, aMachineFolder, aName);
/* ... */
const char *pszSuffix = RTPathSuffix(aName.c_str());
offDashNum = pszSuffix ? (size_t)(pszSuffix - aName.c_str()) : aName.length();
aName.replace(offDashNum, cchDashNum, szTmp, cchTmp);
Import 会在仍为相对路径的 dest 上重复执行 AbsEx(ApplianceImplImport.cpp 4169-4171)并进行 CREATE_REPLACE 写入。IPRT 测试记录了相同的拼接行为:绝对路径的第二个参数优先;/VirtualBox/Machines 加上 ../VirtualBox.xml 得到 /VirtualBox/VirtualBox.xml。
已记录的弯路:将无后缀的 authorized_keys 写入视为遗留问题(import 会抛出异常);NVRAM dest(强制在文件夹内);VM 名称 ..(经净化器处理);共享文件夹 / ExtraData / 串口 RawFile(已净化)。干扰项:宿主内核、guest 到 host。判定依据是机器文件夹之外的一条见证行,以及一个保持原位的对照 disk.vmdk。
python3 vbox-ovf-href-dest-escape-Abraxas-Labs.py
或
cd lab
./run.sh
解释 dest-join、unique-path 的源 harness,以及 import CREATE_REPLACE 写入。Docker compose、loopback,无 VirtualBox 二进制文件。机器文件夹 /work/Machines/ImportedVM。Oracle /work/oracle。
SUCCESS vbox-ovf-href-dest-escape relative-escape=yes unique-keeps-dotdot=yes absolute-href=yes control-in-folder=yes VBOX-OVF-HREF-DEST-ESCAPE-WITNESS
在 ovf:href 成为目标路径之前剥离其基名,或传入 RTPATHABS_F_STOP_AT_BASE(并拒绝绝对名称)。拒绝 RTPATH_PROP_DOTDOT_REFS。唯一路径应修改基名,而非相对字符串。
f2792cf44f663989818507e36d3db5f978523c5e)ApplianceImplImport.cpp 802-851、1043-1053、4169-4171ApplianceImpl.cpp 1126-1160GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。