
VirtualBox 7.2.20 - Alta - Local - Escritura de archivos - Guest Control copy-from DOTDOT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-guestctrl-copyfrom-dotdot
Clase: Escritura de archivos Alcance: Confused-deputy local (invitado)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
El host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom concatena los nombres de DIR_NOTIFY del invitado sobre el destino. FsList::AddDirFromGuest omite únicamente . y .. exactos. GuestPath::Translate usa estilo de barras y colapsa las barras dobles. BuildDestinationPath rechaza RTPATH_PROP_DOTDOT_REFS en la raíz de destino que nombró el host, no en los nombres de cada entrada.
Un invitado que responde a una copia de directorio desde el host con nombres que contienen .. escribe archivos como el UID de VBox fuera del destino.
| ID | aún sin CVE |
| Clase | Escritura de archivos (escape del destino del host) |
| Alcance | Confused-deputy local (invitado). El host inicia la copia. El invitado nombra los archivos. |
| CWE | CWE-22 |
| CVSS | Alta: 8.2 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Producto | Oracle VM VirtualBox OSS |
| Afectado | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Autenticación | Guest Additions (o un cliente HGCM de reemplazo) más una copia de directorio desde el host iniciada por el host |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | Solo 127.0.0.1. Arnés de código fuente. No arranca VirtualBox. |
Guest Control es de host a invitado por diseño. Lo que queda es lo inverso: el usuario del host copia un directorio del invitado, y el invitado responde a HOST_MSG_DIR_READ con nombres GUEST_MSG_DIR_NOTIFY / GUEST_DIR_NOTIFYTYPE_READ. Main concatena esos nombres sobre el destino y los abre.
| Método | Sumidero | Privilegio |
|---|---|---|
Host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom de un directorio del invitado. Nombre de listado del invitado ../oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. | CopyFrom::Run hace strDstAbs = dest + native_sep + pEntry->strPath, luego GuestPath::Translate, luego fileCopyFromGuest -> RTFileOpen(RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE). | Crear/sobrescribir un archivo del host fuera del destino como el UID de VBox. Destino del laboratorio /work/vbox-copy. El laboratorio escribió /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. El contenido lo elige el invitado (notificación de lectura de archivo). |
Los nombres de directorio . y .. exactos se omiten y no escriben. Un archivo cuyo nombre contiene .. se almacena y se concatena.
| Método | Sumidero | Privilegio |
|---|---|---|
Misma copia desde el host. El invitado lista ../../../.ssh/authorized_keys (o DOS ..\..\...) mientras el destino del host es /tmp/vbox-copy / C:\Temp\vbox-copy. | Misma concatenación + RTFileOpen. | Crear o sobrescribir cualquier ruta del host que ese UID pueda escribir. Los nombres anidados con --recursive avanzan más lejos. |
Nada más allá del destino que el host ya eligió. El invitado no aprende rutas adicionales del host a partir de este resto.
Sobrescritura de archivos que el UID de VBox puede escribir. No es un resto de caída. CVSS A:N.
fileCopyFromGuest de un solo archivo: el destino está completamente especificado por el host; el guest solo aporta bytes en esa ruta.AddDirFromHost omite . / .. en el listado del host./etc como usuario normal, el home de otro usuario).HOST_MSG_*. svcCall solo despacha GUEST_MSG_*.guestCtrlValidateDirEntryEx. Esa comprobación es de UTF-8/tamaño, no de ...Requiere Guest Additions (o un cliente HGCM de reemplazo que posea la sesión) y una copia de directorio desde el host iniciada por el host. Sin 3D. Sin VRDP. No es PUEL. Confused-deputy: el usuario del host copia desde un guest hostil.
Fijé VirtualBox/virtualbox v7.2.20 (f2792cf44). Caza de Guest Control H04. Solo de guest a host. El TOCTOU de carpeta compartida (P0 1037) es una clase hermana en un servicio diferente y está cerrado en este pin (RTPathStartsWith tras abs léxico). La copia desde Guest Control concatena nombres de DIR_NOTIFY, no nombres de SHFL.
AddDirFromGuest construye strEntry a partir del Name del guest y omite solo . / .. exactos:
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 luego concatena la ruta almacenada en dest y solo Translates:
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" y rechaza RTPATH_PROP_DOTDOT_REFS. Esa llamada solo se aplica a la raíz de destino (GuestSessionImplTasks.cpp:1685-1686). Los nombres por entrada nunca pasan por ella. Translate (GuestCtrlPrivate.cpp:2129-2208) cambia el estilo de las barras y colapsa //. No rechaza ...
Falsos caminos ya registrados: tratar el salto exacto de . / .. como un saneador de rutas; asumir que Translate canonicaliza; aplicar la comprobación de la raíz de destino a cada entrada; arrancar una VM en lugar de un arnés de código fuente; afirmar que se trata de un escape del kernel anfitrión; tratar la copia desde el destino de un solo archivo o la copia al invitado como lo pendiente. Teatro: una reverse shell. El oráculo es un archivo testigo fuera del destino.
cd lab
./run.sh
Componer el proyecto vbox-guestctrl-copyfrom-dotdot. Loopback 127.0.0.1:19220. Arnés de origen del pin v7.2.20 peel f2792cf44: omisión de exactamente . / .., GuestPath::Translate (solo estilo de barra), CopyFrom::Run unión de dest+sep+entry y luego write/create, raíz de destino BuildDestinationPath rechazo de DOTDOT. No arranca VirtualBox ni Guest Additions. Vincúlalo al loopback.