
VirtualBox 7.2.20 - Élevé - Local - Écriture de fichier - Guest Control copy-from DOTDOT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-guestctrl-copyfrom-dotdot
Classe : Écriture de fichier Portée : Confused-deputy local (invité)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
Côté hôte, IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom concatène les noms DIR_NOTIFY de l'invité sur la destination. FsList::AddDirFromGuest ignore uniquement les . et .. exacts. GuestPath::Translate utilise le style slash avec effondrement des doubles slashs. BuildDestinationPath rejette RTPATH_PROP_DOTDOT_REFS sur la racine de destination nommée par l'hôte, pas sur les noms par entrée.
Un invité qui répond à une copie de répertoire initiée par l'hôte avec des noms contenant .. écrit des fichiers sous l'UID VBox en dehors de la destination.
| ID | pas encore de CVE |
| Classe | Écriture de fichier (évasion de la destination hôte) |
| Portée | Confused-deputy local (invité). L'hôte lance la copie. L'invité nomme les fichiers. |
| CWE | CWE-22 |
| CVSS | Élevé : 8.2 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Produit | Oracle VM VirtualBox OSS |
| Affecté | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Auth | Guest Additions (ou un client HGCM de remplacement) plus une copie de répertoire initiée par l'hôte |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement. Harnais source. Ne démarre pas VirtualBox. |
Guest Control est conçu pour aller de l'hôte vers l'invité. Le résidu est l'inverse : l'utilisateur hôte copie un répertoire invité, et l'invité répond à HOST_MSG_DIR_READ avec des noms GUEST_MSG_DIR_NOTIFY / GUEST_DIR_NOTIFYTYPE_READ. Main concatène ces noms sur la destination et les ouvre.
| Méthode | Point de chute | Privilège |
|---|---|---|
Hôte IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom d'un répertoire invité. Nom de listing invité ../oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. | CopyFrom::Run fait strDstAbs = dest + native_sep + pEntry->strPath, puis GuestPath::Translate, puis fileCopyFromGuest -> RTFileOpen(RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE). | Créer/écraser un fichier hôte en dehors de la destination sous l'UID VBox. Destination du lab /work/vbox-copy. Le lab a écrit /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. Le contenu est choisi par l'invité (notification de lecture de fichier). |
Les noms de répertoire . et .. exacts sont ignorés et n'écrivent pas. Un fichier dont le nom contient .. est stocké et joint.
| Méthode | Point de chute | Privilège |
|---|---|---|
Même copie depuis. L'invité liste ../../../.ssh/authorized_keys (ou DOS ..\..\...) tandis que la destination hôte est /tmp/vbox-copy / C:\Temp\vbox-copy. | Même jointure + RTFileOpen. | Créer ou écraser tout chemin hôte que l'UID peut écrire. Les noms imbriqués --recursive vont plus loin. |
Aucune au-delà de la destination déjà choisie par l'hôte. L'invité n'apprend aucun chemin hôte supplémentaire de ce résidu.
Écrasement de fichiers que l'UID VBox peut écrire. Ce n'est pas un résidu de plantage. CVSS A:N.
fileCopyFromGuest à fichier unique : la destination est entièrement spécifiée par l'hôte ; l'invité ne fournit que les octets vers ce chemin.AddDirFromHost ignore . / .. dans le listing de l'hôte./etc en tant qu'utilisateur normal, le home d'un autre utilisateur).HOST_MSG_*. svcCall ne distribue que les GUEST_MSG_*.guestCtrlValidateDirEntryEx. Cette vérification porte sur l'UTF-8/la taille, pas sur ...Nécessite les Guest Additions (ou un client HGCM de remplacement qui possède la session) et une copie de répertoire depuis l'invité initiée par l'hôte. Pas de 3D. Pas de VRDP. Pas de PUEL. Confused-deputy : l'utilisateur hôte copie depuis un invité hostile.
J'ai épinglé VirtualBox/virtualbox v7.2.20 (f2792cf44). Chasse Guest Control H04. Invité-vers-hôte uniquement. La TOCTOU des dossiers partagés (P0 1037) est une classe sœur sur un service différent et est fermée sur ce pin (RTPathStartsWith après abs lexicale). La copie depuis l'invité de Guest Control concatène les noms DIR_NOTIFY, pas les noms SHFL.
AddDirFromGuest construit strEntry à partir du Name de l'invité et n'ignore que les . / .. exacts :
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 concatène ensuite le chemin stocké sur dest et effectue uniquement une traduction :
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 documente que « les répertoires dotdot sont interdits pour des raisons de sécurité » et rejette RTPATH_PROP_DOTDOT_REFS. Cet appel ne s'applique qu'à la racine de destination (GuestSessionImplTasks.cpp:1685-1686). Les noms par entrée ne passent jamais par lui. Translate (GuestCtrlPrivate.cpp:2129-2208) modifie le style des barres obliques et réduit //. Il ne rejette pas ...
Fausses pistes déjà consignées : traiter le saut exact de . / .. comme un assainisseur de chemin ; supposer que Translate canonicalise ; appliquer la vérification de la racine de destination à chaque entrée ; démarrer une VM au lieu d'un harnais source ; affirmer qu'il s'agit d'une évasion du noyau hôte ; considérer la copie depuis la destination d'un fichier unique ou la copie vers l'invité comme le résidu. Théâtre : un reverse shell. L'oracle est un fichier témoin en dehors de la destination.
cd lab
./run.sh
Compose project vbox-guestctrl-copyfrom-dotdot. Loopback 127.0.0.1:19220. Harnais source du pin v7.2.20 peel f2792cf44 : saut des . / .. exacts, GuestPath::Translate (style slash uniquement), jointure dest+sep+entry puis write/create de CopyFrom::Run, rejet DOTDOT de la racine de destination BuildDestinationPath. Ne démarre pas VirtualBox ni les Guest Additions. Le lier au loopback.