
VirtualBox 7.2.20 - Alta - Locale - Scrittura di file - Guest Control copy-from DOTDOT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-guestctrl-copyfrom-dotdot
Classe: Scrittura di file Portata: Confused-deputy locale (guest)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
L'host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom concatena i nomi DIR_NOTIFY del guest sulla destinazione. FsList::AddDirFromGuest salta solo . e .. esatti. GuestPath::Translate usa lo stile slash più il collasso degli slash doppi. BuildDestinationPath rifiuta RTPATH_PROP_DOTDOT_REFS sulla radice di destinazione indicata dall'host, non sui nomi delle singole voci.
Un guest che risponde a una copia di directory avviata dall'host con nomi contenenti .. scrive file con l'UID di VBox al di fuori della destinazione.
| ID | nessuna CVE al momento |
| Classe | Scrittura di file (fuga dalla destinazione dell'host) |
| Portata | Confused-deputy locale (guest). L'host avvia la copia. Il guest assegna i nomi ai file. |
| CWE | CWE-22 |
| CVSS | Alto: 8.2 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Prodotto | Oracle VM VirtualBox OSS |
| Affetto | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Auth | Guest Additions (o un client HGCM sostitutivo) più una copia di directory avviata dall'host |
| Licenza | GNU Affero GPL v3.0 |
| Lab | Solo 127.0.0.1. Harness sorgente. Non avvia VirtualBox. |
Guest Control è host-to-guest per progettazione. Ciò che resta è l'inverso: l'utente host copia una directory del guest, e il guest risponde a HOST_MSG_DIR_READ con nomi GUEST_MSG_DIR_NOTIFY / GUEST_DIR_NOTIFYTYPE_READ. Main concatena quei nomi sulla destinazione e li apre.
| Metodo | Sink | Privilegio |
|---|---|---|
Host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom di una directory del guest. Nome di elenco del guest ../oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. | CopyFrom::Run esegue strDstAbs = dest + native_sep + pEntry->strPath, poi GuestPath::Translate, poi fileCopyFromGuest -> RTFileOpen(RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE). | Crea/sovrascrive un file host al di fuori della destinazione con l'UID di VBox. Destinazione del lab /work/vbox-copy. Il lab ha scritto /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. Il contenuto è scelto dal guest (notifica di lettura file). |
I nomi di directory . e .. esatti vengono saltati e non scrivono. Un file il cui nome contiene .. viene memorizzato e concatenato.
| Metodo | Sink | Privilegio |
|---|---|---|
Stessa copy-from. Il guest elenca ../../../.ssh/authorized_keys (o in stile DOS ..\..\...) mentre la destinazione dell'host è /tmp/vbox-copy / C:\Temp\vbox-copy. | Stessa concatenazione + RTFileOpen. | Crea o sovrascrive qualsiasi percorso host scrivibile da quell'UID. I nomi annidati con --recursive si spingono oltre. |
Nessuna oltre alla destinazione già scelta dall'host. Il guest non apprende percorsi host aggiuntivi da questo residuo.
Sovrascrittura di file scrivibili dall'UID di VBox. Non è un residuo di crash. CVSS A:N.
fileCopyFromGuest a file singolo: la destinazione è interamente specificata dall'host; il guest fornisce solo i byte in quel percorso.AddDirFromHost salta . / .. nell'elenco dell'host./etc come utente normale, la home di un altro utente).HOST_MSG_*. svcCall invia solo GUEST_MSG_*.guestCtrlValidateDirEntryEx. Quel controllo è UTF-8/dimensione, non ...Richiede Guest Additions (o un client HGCM sostitutivo che possiede la sessione) e una copia di directory avviata dall'host. Nessun 3D. Nessun VRDP. Non PUEL. Confused-deputy: l'utente host copia da un guest ostile.
Ho fissato VirtualBox/virtualbox v7.2.20 (f2792cf44). Caccia a Guest Control H04. Solo da guest a host. La TOCTOU della cartella condivisa (P0 1037) è una classe affine su un servizio diverso ed è chiusa su questo pin (RTPathStartsWith dopo abs lessicale). La copia da Guest Control concatena i nomi DIR_NOTIFY, non i nomi SHFL.
AddDirFromGuest costruisce strEntry dal Name del guest e salta solo . / .. esatti:
Utf8Str strEntry = strPathSub + Utf8Str(bstrName);
switch (enmObjType)
{
case FsObjType_Directory:
{
if ( bstrName.equals(".")
|| bstrName.equals(".."))
{
break;
}
vrc = AddDirFromGuest(strPath, strEntry);
break;
}
case FsObjType_File:
vrc = AddEntryFromGuest(strEntry, fsObjInfo->i_getData());
break;
}
CopyFrom::Run concatena quindi il percorso memorizzato su dest e solo Traduce:
strDstAbs += PATH_STYLE_SEP_STR(PATH_STYLE_NATIVE);
strDstAbs += pEntry->strPath;
vrc = GuestPath::Translate(strDstAbs, mSession->i_getGuestPathStyle(), PATH_STYLE_NATIVE);
/* directoryCreateOnHost / fileCopyFromGuest -> RTFileOpen WRITE|OPEN_CREATE */
GuestPath::BuildDestinationPath documenta "Dotdot directories are forbidden for security reasons" e rifiuta RTPATH_PROP_DOTDOT_REFS. Quella chiamata avviene solo sulla radice di destinazione (GuestSessionImplTasks.cpp:1685-1686). I nomi delle singole voci non passano mai da lì. Translate (GuestCtrlPrivate.cpp:2129-2208) cambia lo stile delle barre e collassa //. Non rifiuta ...
Vicoli ciechi già registrati: trattare il salto esatto di . / .. come un sanitizzatore di percorsi; presumere che Translate canonicalizzi; applicare il controllo della radice di destinazione a ogni voce; avviare una VM invece di un harness sul sorgente; affermare che si tratta di un'evasione dal kernel host; considerare la copia da singolo file dalla destinazione o la copia verso il guest come il residuo. Teatro: una reverse shell. L'oracolo è un file testimone esterno alla destinazione.
cd lab
./run.sh
Comporre il progetto vbox-guestctrl-copyfrom-dotdot. Loopback 127.0.0.1:19220. Harness sorgente del pin v7.2.20 peel f2792cf44: skip di esatto . / .., GuestPath::Translate (solo stile slash), CopyFrom::Run join dest+sep+entry poi write/create, dest-root BuildDestinationPath rifiuto DOTDOT. Non avvia VirtualBox o Guest Additions. Collegarlo al loopback.
SUCCESS vbox-guestctrl-copyfrom-dotdot skip-dot=yes translate-keeps-dotdot=yes escaped-write=yes dest-root-check-unused-per-entry=yes VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS