
VirtualBox 7.2.20 – Hoch – Lokal – Dateischreiben – Guest Control copy-from DOTDOT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-guestctrl-copyfrom-dotdot
Klasse: Dateischreiben Reichweite: Lokal (Gast) Confused-Deputy
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
Host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom verkettet Gast-DIR_NOTIFY-Namen an das Ziel. FsList::AddDirFromGuest überspringt nur exakt . und ... GuestPath::Translate ist Slash-Stil plus Doppel-Slash-Zusammenfassung. BuildDestinationPath lehnt RTPATH_PROP_DOTDOT_REFS am vom Host benannten Ziel-Root ab, nicht an den Namen pro Eintrag.
Ein Gast, der auf ein vom Host initiiertes Verzeichnis-Copy-From mit Namen antwortet, die .. enthalten, schreibt Dateien als die VBox-UID außerhalb des Ziels.
| ID | noch keine CVE |
| Klasse | Dateischreiben (Host-Ziel-Escape) |
| Reichweite | Lokal (Gast) Confused-Deputy. Host startet die Kopie. Gast benennt die Dateien. |
| CWE | CWE-22 |
| CVSS | Hoch: 8.2 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Produkt | Oracle VM VirtualBox OSS |
| Betroffen | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Auth | Guest Additions (oder ein ersetzender HGCM-Client) plus ein vom Host initiiertes Verzeichnis-Copy-From |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | Nur 127.0.0.1. Quell-Harness. Startet VirtualBox nicht. |
Guest Control ist von Natur aus Host-zu-Gast. Der Überrest ist die Umkehrung: Der Host-Benutzer kopiert ein Gast-Verzeichnis, und der Gast antwortet auf HOST_MSG_DIR_READ mit GUEST_MSG_DIR_NOTIFY / GUEST_DIR_NOTIFYTYPE_READ-Namen. Main verkettet diese Namen an das Ziel und öffnet sie.
| Methode | Sink | Privileg |
|---|---|---|
Host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom eines Gast-Verzeichnisses. Gast-Listing-Name ../oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. | CopyFrom::Run führt strDstAbs = dest + native_sep + pEntry->strPath aus, dann GuestPath::Translate, dann fileCopyFromGuest -> RTFileOpen(RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE). | Erstellen/Überschreiben einer Host-Datei außerhalb des Ziels als die VBox-UID. Lab-Ziel /work/vbox-copy. Lab schrieb /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. Inhalt ist vom Gast gewählt (File-Read-Notify). |
Exakte .- und ..-Verzeichnisnamen werden übersprungen und schreiben nicht. Eine Datei, deren Name .. enthält, wird gespeichert und verkettet.
| Methode | Sink | Privileg |
|---|---|---|
Gleiches Copy-From. Gast listet ../../../.ssh/authorized_keys (oder DOS ..\..\...), während das Host-Ziel /tmp/vbox-copy / C:\Temp\vbox-copy ist. | Gleiche Verkettung + RTFileOpen. | Erstellen oder Überschreiben eines beliebigen Host-Pfads, den die UID schreiben kann. Verschachtelte --recursive-Namen laufen weiter. |
Nichts über das Ziel hinaus, das der Host bereits gewählt hat. Der Gast erfährt durch diesen Überrest keine zusätzlichen Host-Pfade.
Überschreiben von Dateien, die die VBox-UID schreiben kann. Kein Crash-Überrest. CVSS A:N.
fileCopyFromGuest: Das Ziel ist vollständig vom Host vorgegeben; der Gast liefert nur Bytes in diesen Pfad.AddDirFromHost überspringt . / .. im Host-Listing./etc als normaler Benutzer, das Home-Verzeichnis eines anderen Benutzers).HOST_MSG_*. svcCall dispatcht nur GUEST_MSG_*.guestCtrlValidateDirEntryEx. Diese Prüfung betrifft UTF-8/Größe, nicht ...Benötigt Guest Additions (oder einen Ersatz-HGCM-Client, der die Sitzung besitzt) und ein host-initiiertes Verzeichnis-Copy-from. Kein 3D. Kein VRDP. Kein PUEL. Confused Deputy: Der Host-Benutzer kopiert von einem feindlichen Gast.
Ich habe VirtualBox/virtualbox auf v7.2.20 (f2792cf44) gepinnt. Guest-Control-Hunt H04. Nur Gast-zu-Host. Shared-Folder-TOCTOU (P0 1037) ist eine verwandte Klasse auf einem anderen Dienst und ist bei diesem Pin geschlossen (RTPathStartsWith nach lexikalischem Abs). Guest-Control-Copy-from verkettet DIR_NOTIFY-Namen, nicht SHFL-Namen.
AddDirFromGuest baut strEntry aus dem Gast-Name und überspringt nur exakt . / ..:
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 hängt dann den gespeicherten Pfad an dest an und führt nur Translates aus:
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 dokumentiert „Dotdot directories are forbidden for security reasons" und lehnt RTPATH_PROP_DOTDOT_REFS ab. Dieser Aufruf erfolgt nur auf dem Ziel-Root (GuestSessionImplTasks.cpp:1685-1686). Pro-Eintrag-Namen durchlaufen ihn nie. Translate (GuestCtrlPrivate.cpp:2129-2208) ändert den Slash-Stil und fasst // zusammen. Es lehnt .. nicht ab.
Bereits festgehaltene Irrwege: das exakte Überspringen von . / .. als Pfad-Sanitizer zu behandeln; anzunehmen, dass Translate kanonisiert; die Ziel-Root-Prüfung auf jeden Eintrag anzuwenden; eine VM statt einer Source-Harness zu booten; zu behaupten, dies sei eine Host-Kernel-Escape; die Einzeldatei-Kopie von Ziel oder Kopie zum Gast als das Übriggebliebene zu behandeln. Theater: eine Reverse Shell. Das Orakel ist eine Witness-Datei außerhalb des Ziels.
cd lab
./run.sh
Compose-Projekt vbox-guestctrl-copyfrom-dotdot. Loopback 127.0.0.1:19220. Quell-Harness von Pin v7.2.20 Peel f2792cf44: Überspringen von exakt . / .., GuestPath::Translate (nur Slash-Stil), CopyFrom::Run Ziel+Sep+Eintrag-Zusammenfügung, dann Schreiben/Erstellen, Ziel-Root BuildDestinationPath DOTDOT-Ablehnung. Startet weder VirtualBox noch Guest Additions. Binde es an 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