
VirtualBox 7.2.20 - Alta - Local - Gravação de arquivo - Guest Control copy-from DOTDOT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-guestctrl-copyfrom-dotdot
Classe: Escrita de arquivo Alcance: Confused-deputy local (guest)
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) - Oracle
O host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom concatena nomes de DIR_NOTIFY do guest no destino. FsList::AddDirFromGuest ignora apenas . e .. exatos. GuestPath::Translate usa estilo de barra mais colapso de barra dupla. BuildDestinationPath rejeita RTPATH_PROP_DOTDOT_REFS na raiz de destino que o host nomeou, não nos nomes por entrada.
Um guest que responde a uma cópia de diretório iniciada pelo host com nomes contendo .. grava arquivos como o UID do VBox fora do destino.
| ID | sem CVE ainda |
| Classe | Escrita de arquivo (escape do destino no host) |
| Alcance | Confused-deputy local (guest). O host inicia a cópia. O guest nomeia os arquivos. |
| 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 |
| Produto | Oracle VM VirtualBox OSS |
| Afetado | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Autenticação | Guest Additions (ou um cliente HGCM substituto) mais uma cópia de diretório iniciada pelo host |
| Licença | GNU Affero GPL v3.0 |
| Lab | Apenas 127.0.0.1. Harness de código-fonte. Não inicializa o VirtualBox. |
O Guest Control é host-para-guest por design. O resquício é o inverso: o usuário do host copia um diretório do guest, e o guest responde a HOST_MSG_DIR_READ com nomes GUEST_MSG_DIR_NOTIFY / GUEST_DIR_NOTIFYTYPE_READ. O Main concatena esses nomes no destino e os abre.
| Método | Sink | Privilégio |
|---|---|---|
Host IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom de um diretório do guest. Nome de listagem do guest ../oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. | CopyFrom::Run faz strDstAbs = dest + native_sep + pEntry->strPath, depois GuestPath::Translate, depois fileCopyFromGuest -> RTFileOpen(RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE). | Cria/sobrescreve um arquivo no host fora do destino como o UID do VBox. Destino do lab /work/vbox-copy. O lab gravou /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. O conteúdo é escolhido pelo guest (notificação de leitura de arquivo). |
Nomes de diretório . e .. exatos são ignorados e não gravam. Um arquivo cujo nome contém .. é armazenado e concatenado.
| Método | Sink | Privilégio |
|---|---|---|
Mesma cópia. O guest lista ../../../.ssh/authorized_keys (ou DOS ..\..\...) enquanto o destino do host é /tmp/vbox-copy / C:\Temp\vbox-copy. | Mesma concatenação + RTFileOpen. | Cria ou sobrescreve qualquer caminho no host que o UID possa gravar. Nomes aninhados com --recursive percorrem mais longe. |
Nada além do destino que o host já escolheu. O guest não descobre caminhos extras no host a partir deste resquício.
Sobrescrita de arquivos que o UID do VBox pode gravar. Não é um resquício de crash. CVSS A:N.
fileCopyFromGuest de ficheiro único: o destino é totalmente especificado pelo host; o guest apenas fornece os bytes para esse caminho.AddDirFromHost ignora . / .. na listagem do host./etc como utilizador normal, a home de outro utilizador).HOST_MSG_*. svcCall apenas despacha GUEST_MSG_*.guestCtrlValidateDirEntryEx. Essa verificação é de UTF-8/tamanho, não de ...Requer Guest Additions (ou um cliente HGCM substituto que detenha a sessão) e uma cópia de diretório a partir do guest iniciada pelo host. Sem 3D. Sem VRDP. Não é PUEL. Confused-deputy: o utilizador do host copia a partir de um guest hostil.
Fixe a versão VirtualBox/virtualbox v7.2.20 (f2792cf44). Caça ao Guest Control H04. Apenas guest-para-host. O TOCTOU de pastas partilhadas (P0 1037) é uma classe irmã num serviço diferente e está fechado neste pin (RTPathStartsWith após abs lexical). A cópia a partir do guest do Guest Control concatena nomes DIR_NOTIFY, não nomes SHFL.
AddDirFromGuest constrói strEntry a partir do Name do guest e ignora apenas . / .. exatos:
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 então concatena o caminho armazenado em dest e apenas Traduz:
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 rejeita RTPATH_PROP_DOTDOT_REFS. Essa chamada ocorre apenas na raiz de destino (GuestSessionImplTasks.cpp:1685-1686). Os nomes por entrada nunca passam por ela. Translate (GuestCtrlPrivate.cpp:2129-2208) altera o estilo de barra e colapsa //. Não rejeita ...
Caminhos errados já registrados: tratar o skip exato de . / .. como um sanitizador de caminho; assumir que Translate canonicaliza; aplicar a verificação da raiz de destino a cada entrada; inicializar uma VM em vez de um harness de origem; alegar que se trata de escape do kernel do host; tratar a cópia de arquivo único de destino ou cópia para o guest como o resíduo. Teatro: um reverse shell. O oráculo é um arquivo testemunha fora do destino.
cd lab
./run.sh
Compor o projeto vbox-guestctrl-copyfrom-dotdot. Loopback 127.0.0.1:19220. Harness de origem do pin v7.2.20 peel f2792cf44: skip de . / .. exatos, GuestPath::Translate (apenas estilo slash), junção dest+sep+entry de CopyFrom::Run e depois write/create, rejeição DOTDOT de dest-root BuildDestinationPath. Não inicializa o VirtualBox nem o Guest Additions. Vincule-o ao 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