
VirtualBox 7.2.20 – Hoch – Lokal – Dateischreiben – OVF-href-Ziel-Escape
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-href-dest-escape
Klasse: Dateischreiben Reichweite: Lokal (Host) UI:R
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
Ein Host-Benutzer, der eine feindliche OVF/OVA importiert, schreibt Disk-Image-Bytes außerhalb des neuen VM-Ordners. ovf:href ist der Ziel-Dateiname. RTPathAbsExCxx verwendet nicht RTPATHABS_F_STOP_AT_BASE. Der Unique-Path-Helfer fügt _%i vor dem Suffix ein und entfernt nicht den Basename.
| ID | noch keine CVE |
| Klasse | Dateischreiben (OVF/OVA-Zielpfad) |
| Reichweite | Lokal (Host) UI:R (Opfer importiert eine feindliche Appliance) |
| CWE | CWE-22 |
| CVSS | Hoch: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| Produkt | Oracle VM VirtualBox OSS |
| Betroffen | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Auth | keine bei VirtualBox. Der Host-Benutzer öffnet Datei/Importieren oder VBoxManage import. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1. Source-Harness. VirtualBox wird nicht gebootet. |
Ein OVF-Verzeichnis oder eine OVA ausliefern. ../irgendwo/disk.vmdk oder einen absoluten Pfad /path/disk.iso in ovf:href setzen. Der Operator, der es importiert, schreibt diese Disk-Image-Bytes per CREATE_REPLACE als importierende UID, einschließlich übergeordneter Verzeichnisse, die nicht existierten. Suffix erforderlich (vmdk / iso / andere MediumFormat-Erweiterungen). Dies ist kein suffixfreies Ablegen von authorized_keys.
| Privileg | Methode + Sink | Was es gewährt | Provenienz |
|---|---|---|---|
| Integrität | IAppliance::read kopiert File/href ohne Basename-Strip (ovfreader.cpp). Appliance::interpret() setzt dest = di.strHref (ApplianceImplImport.cpp 802-851). | Der Ziel-Dateiname wird vom Angreifer gewählt, einschließlich ../ und absoluter Pfade. | Lab-bestätigt (relative und absolute hrefs) |
| Integrität | i_ensureUniqueImageFilePath (ApplianceImpl.cpp 1126-1160) ruft RTPathAbsExCxx(strAbsName, aMachineFolder, aName) ohne RTPATHABS_F_STOP_AT_BASE auf. Bei Kollision wird _%i vor dem Suffix von aName eingefügt, nicht als Basename. | Eindeutiges Ziel verlässt weiterhin den Maschinenordner. ../oracle/WITNESS.vmdk wird zu ../oracle/WITNESS_1.vmdk. | Lab-bestätigt (unique-keeps-dotdot=yes) |
| Integrität | Import i_importOneDiskImage AbsEx erneut (ApplianceImplImport.cpp 4169-4171). i_importCreateAndWriteDestinationFile (1043-1053) mkdir-parents dann RTFILE_O_CREATE_REPLACE. | Disk-Image-Bytes landen außerhalb des VM-Ordners. Absoluter href ignoriert den Maschinenordner. Kontrolle disk.vmdk bleibt im Ordner. | Lab-bestätigt (relative-escape=yes absolute-href=yes control-in-folder=yes) |
| Recon | Import-Assistent / VBoxManage import --dry-run zeigt das Ziel. | Pfad ist sichtbar. Kein Geheimnisleck an sich. | Abgeleitet |
| Verfügbarkeit | Relatives Ziel, das auf der Disk einer anderen VM landet. | Diese Datei als importierende UID überschreiben. | Abgeleitet (gleicher CREATE_REPLACE-Schreibvorgang) |
| Geschlossen | Ziel ohne MediumFormat-Suffix | Import wirft has no extension. Kein suffixfreies Schreiben von authorized_keys / crontab. | Geschlossen |
| Geschlossen | NVRAM-Ziel | Erzwungen zu {vmname}.nvram unter dem Maschinenordner. | Geschlossen |
| Geschlossen | VM-Name .. | sanitiseMachineFilename verfälscht ihn. | Geschlossen |
| Geschlossen | Shared Folders / ExtraData / serielle RawFile | Auf dem vbox:Machine-Pfad bereinigt. | Geschlossen |
| Geschlossen | Host-Kernel, Gast-zu-Host | Nicht dieser Überrest. Kein VM-Start erforderlich. Gleiche UID wie der Importeur. | Geschlossen |
OVA ist der saubere Weg: Das tar-Mitglied liefert die Bytes, href liefert das escapte Ziel. Kein 3D, keine Guest Additions, kein VRDP, kein PUEL.
Ich saß auf Tag v7.2.20 (f2792cf44) nach der CPU vom Sep 2026 und las den OVF-Import. ExtraData, Shared Folders, NVRAM-Ziel und serielles RawFile sind bereits entfernt. Das Disk-Ziel nicht. interpret() kopiert di.strHref direkt in den VBox-Wert von HardDiskImage:
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 vervollständigt diesen Namen gegen den Maschinenordner ohne RTPATHABS_F_STOP_AT_BASE und verändert dann aName direkt:
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 wiederholt AbsEx auf dem weiterhin relativen Ziel (ApplianceImplImport.cpp 4169-4171) und CREATE_REPLACE-Schreibvorgängen. IPRT-Tests dokumentieren dieselbe Zusammenführung: Das absolute zweite Argument gewinnt; /VirtualBox/Machines plus ../VirtualBox.xml ergibt /VirtualBox/VirtualBox.xml.
Bereits festgehaltene Fehlwege: einen suffixfreien authorized_keys-Schreibvorgang als Überbleibsel zu behandeln (Import wirft eine Ausnahme); NVRAM-Ziel (zwangsweise im Ordner); VM-Name .. (Sanitizer); Shared Folders / ExtraData / serielles RawFile (bereits bereinigt). Theater: Host-Kernel, Gast-zu-Host. Das Orakel ist eine Zeugenzeile außerhalb des Maschinenordners plus eine Kontroll-disk.vmdk, die an Ort und Stelle blieb.
python3 vbox-ovf-href-dest-escape-Abraxas-Labs.py
oder
cd lab
./run.sh
Quell-Harness für interpret dest-join, unique-path und den Import CREATE_REPLACE write. Docker compose, Loopback, keine VirtualBox-Binärdatei. Maschinenordner /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 vor der Umwandlung in ein Ziel (dest) vom Basename befreien oder RTPATHABS_F_STOP_AT_BASE übergeben (und absolute Namen ablehnen). RTPATH_PROP_DOTDOT_REFS ablehnen. Unique-Path sollte den Basename verändern, nicht den relativen String.
f2792cf44f663989818507e36d3db5f978523c5e)ApplianceImplImport.cpp 802-851, 1043-1053, 4169-4171ApplianceImpl.cpp 1126-1160