
VirtualBox 7.2.20 - Alta - Locale - Scrittura di file - Fuga dalla destinazione href OVF
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-ovf-href-dest-escape
Classe: Scrittura di file Portata: Locale (host) UI:R
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
Un utente host che importa un OVF/OVA ostile scrive byte di immagini disco al di fuori della cartella della nuova VM. ovf:href è il nome file di destinazione. RTPathAbsExCxx non usa RTPATHABS_F_STOP_AT_BASE. L'helper per i percorsi univoci inserisce _%i prima del suffisso e non rimuove il basename.
| ID | nessuna CVE al momento |
| Classe | Scrittura di file (percorso di destinazione OVF/OVA) |
| Portata | Locale (host) UI:R (la vittima importa un'appliance ostile) |
| CWE | CWE-22 |
| CVSS | Alto: 7.8 CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N |
| Prodotto | Oracle VM VirtualBox OSS |
| Affetto | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Autenticazione | nessuna su VirtualBox. L'utente host apre File/Importa o VBoxManage import. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1. Harness sorgente. VirtualBox non viene avviato. |
Distribuire una directory OVF o un OVA. Inserire ../somewhere/disk.vmdk o un percorso assoluto /path/disk.iso in ovf:href. L'operatore che lo importa esegue una scrittura CREATE_REPLACE di quei byte di immagine disco con l'UID dell'importatore, incluse le directory padre che non esistevano. Suffisso obbligatorio (vmdk / iso / altre estensioni MediumFormat). Non si tratta di un rilascio senza suffisso di authorized_keys.
| Privilegio | Metodo + sink | Cosa concede | Provenienza |
|---|---|---|---|
| Integrità | IAppliance::read copia File/href senza rimozione del basename (ovfreader.cpp). Appliance::interpret() imposta dest = di.strHref (ApplianceImplImport.cpp 802-851). | Il nome file di destinazione è scelto dall'attaccante, inclusi ../ e percorsi assoluti. | Provato in lab (href relativi e assoluti) |
| Integrità | i_ensureUniqueImageFilePath (ApplianceImpl.cpp 1126-1160) chiama RTPathAbsExCxx(strAbsName, aMachineFolder, aName) senza RTPATHABS_F_STOP_AT_BASE. La collisione inserisce _%i prima del suffisso di aName, non di un basename. | La destinazione univoca esce comunque dalla cartella della macchina. ../oracle/WITNESS.vmdk diventa ../oracle/WITNESS_1.vmdk. | Provato in lab (unique-keeps-dotdot=yes) |
| Integrità | Import i_importOneDiskImage AbsEx di nuovo (ApplianceImplImport.cpp 4169-4171). i_importCreateAndWriteDestinationFile (1043-1053) crea le directory padre e poi RTFILE_O_CREATE_REPLACE. | I byte dell'immagine disco finiscono fuori dalla cartella della VM. Un href assoluto ignora la cartella della macchina. Il controllo disk.vmdk rimane nella cartella. | Provato in lab (relative-escape=yes absolute-href=yes control-in-folder=yes) |
| Ricognizione | La procedura guidata di importazione / VBoxManage import --dry-run mostra la destinazione. | Il percorso è visibile. Non è di per sé una fuga di segreti. | Dedotto |
| Disponibilità | Destinazione relativa che finisce sul disco di un'altra VM. | Sovrascrive quel file con l'UID dell'importatore. | Dedotto (stessa scrittura CREATE_REPLACE) |
| Chiuso | Destinazione senza suffisso MediumFormat | L'importazione genera has no extension. Non è una scrittura senza suffisso di authorized_keys / crontab. | Chiuso |
| Chiuso | Destinazione NVRAM | Forzata a {vmname}.nvram nella cartella della macchina. | Chiuso |
| Chiuso | Nome VM .. | sanitiseMachineFilename lo altera. | Chiuso |
| Chiuso | Cartelle condivise / ExtraData / RawFile seriale | Sanificati sul percorso vbox:Machine. | Chiuso |
| Chiuso | Kernel host, guest-to-host | Non questo residuo. Nessun avvio della VM richiesto. Stesso UID dell'importatore. | Chiuso |
OVA è il percorso pulito: il membro del tar fornisce i byte, href fornisce la destinazione con escape. Niente 3D, niente Guest Additions, niente VRDP, non PUEL.
Mi sono fermato sul tag v7.2.20 (f2792cf44) dopo la CPU di settembre 2026 e ho letto l'import OVF. ExtraData, cartelle condivise, destinazione NVRAM e seriale RawFile sono già rimossi. La destinazione del disco no. interpret() copia di.strHref direttamente nel valore VBox di 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 completa quel nome rispetto alla cartella della macchina senza RTPATHABS_F_STOP_AT_BASE, poi modifica aName sul posto:
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 ripete AbsEx sulla dest ancora relativa (ApplianceImplImport.cpp 4169-4171) e sulle scritture CREATE_REPLACE. I test IPRT documentano la stessa unione: il secondo argomento assoluto vince; /VirtualBox/Machines più ../VirtualBox.xml è /VirtualBox/VirtualBox.xml.
Vicoli ciechi già registrati: trattare una scrittura authorized_keys senza suffisso come il residuo (l'import genera un'eccezione); destinazione NVRAM (forzata nella cartella); nome VM .. (sanitizzatore); cartelle condivise / ExtraData / RawFile seriale (già sanitizzati). Teatro: kernel host, guest-to-host. L'oracolo è una riga testimone esterna alla cartella della macchina più un disk.vmdk di controllo che è rimasto al suo posto.
python3 vbox-ovf-href-dest-escape-Abraxas-Labs.py
o
cd lab
./run.sh
Harness sorgente di interpret dest-join, unique-path e della scrittura import CREATE_REPLACE. Docker compose, loopback, nessun binario VirtualBox. Cartella macchina /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
Rimuovere il basename da ovf:href prima che diventi una destinazione, oppure passare RTPATHABS_F_STOP_AT_BASE (e rifiutare i nomi assoluti). Rifiutare RTPATH_PROP_DOTDOT_REFS. Il percorso univoco dovrebbe modificare il basename, non la stringa relativa.