
VirtualBox 7.2.20 — высокий уровень — локальная — запись в файл — Guest Control copy-from DOTDOT
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vbox-guestctrl-copyfrom-dotdot
Класс: запись файлов Достижимость: локальный (гостевой) confused-deputy
Oracle VM VirtualBox OSS 7.2.20 (f2792cf44) — Oracle
Хост-метод IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom конкатенирует имена гостевых DIR_NOTIFY к пути назначения. FsList::AddDirFromGuest пропускает только точные . и ... GuestPath::Translate использует слэш-стиль и сворачивание двойных слэшей. BuildDestinationPath отклоняет RTPATH_PROP_DOTDOT_REFS на корне назначения, указанном хостом, а не на именах отдельных записей.
Гость, отвечающий на инициированное хостом копирование каталога именами, содержащими .., записывает файлы от имени UID VBox за пределами каталога назначения.
| ID | CVE пока нет |
| Класс | Запись файлов (выход за пределы каталога назначения на хосте) |
| Достижимость | Локальный (гостевой) confused-deputy. Хост инициирует копирование. Гость задаёт имена файлов. |
| CWE | CWE-22 |
| CVSS | Высокий: 8.2 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N |
| Продукт | Oracle VM VirtualBox OSS |
| Затронуто | 7.2.20 (f2792cf44f663989818507e36d3db5f978523c5e) |
| Аутентификация | Guest Additions (или заменяющий клиент HGCM) плюс инициированное хостом копирование каталога |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | Только 127.0.0.1. Исходный стенд. VirtualBox не загружает. |
Guest Control по своей природе работает от хоста к гостю. Остаточная уязвимость — обратная: пользователь хоста копирует гостевой каталог, а гость отвечает на HOST_MSG_DIR_READ именами GUEST_MSG_DIR_NOTIFY / GUEST_DIR_NOTIFYTYPE_READ. Main конкатенирует эти имена к пути назначения и открывает их.
| Метод | Точка срабатывания | Привилегия |
|---|---|---|
Хост-метод IGuestSession::directoryCopyFromGuest / VBoxManage guestcontrol copyfrom для гостевого каталога. Имя в листинге гостя ../oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. | CopyFrom::Run выполняет strDstAbs = dest + native_sep + pEntry->strPath, затем GuestPath::Translate, затем fileCopyFromGuest -> RTFileOpen(RTFILE_O_WRITE | RTFILE_O_OPEN_CREATE). | Создание/перезапись файла на хосте за пределами каталога назначения от имени UID VBox. Каталог назначения в лаборатории /work/vbox-copy. Лаборатория записала /work/oracle/VBOX-GUESTCTRL-COPYFROM-DOTDOT-WITNESS. Содержимое выбирает гость (уведомление о чтении файла). |
Точные имена каталогов . и .. пропускаются и не приводят к записи. Файл, имя которого содержит .., сохраняется и присоединяется.
| Метод | Точка срабатывания | Привилегия |
|---|---|---|
То же копирование. Гость перечисляет ../../../.ssh/authorized_keys (или DOS-вариант ..\..\...), при этом каталог назначения на хосте — /tmp/vbox-copy / C:\Temp\vbox-copy. | То же присоединение + RTFileOpen. | Создание или перезапись любого пути на хосте, доступного для записи этому UID. Вложенные имена с --recursive проходят дальше. |
Ничего сверх каталога назначения, уже выбранного хостом. Из этой остаточной уязвимости гость не узнаёт дополнительных путей на хосте.
Перезапись файлов, доступных для записи UID VBox. Это не краш-уязвимость. CVSS A:N.
fileCopyFromGuest: место назначения полностью задаётся хостом; гость лишь поставляет байты в этот путь.AddDirFromHost пропускает . / .. в листинге хоста./etc для обычного пользователя, домашний каталог другого пользователя).HOST_MSG_*. svcCall диспетчеризует только GUEST_MSG_*.guestCtrlValidateDirEntryEx. Эта проверка касается UTF-8/размера, а не ...Требуются Guest Additions (или заменяющий их клиент HGCM, владеющий сессией) и инициированное хостом копирование каталога из гостя. Без 3D. Без VRDP. Не PUEL. Confused-deputy: пользователь хоста копирует из враждебного гостя.
Я зафиксировал VirtualBox/virtualbox v7.2.20 (f2792cf44). Охота на Guest Control H04. Только гость-в-хост. TOCTOU общей папки (P0 1037) — родственный класс на другом сервисе, и на этой фиксации он закрыт (RTPathStartsWith после лексической абсолютизации). Копирование из гостя в Guest Control конкатенирует имена DIR_NOTIFY, а не имена SHFL.
AddDirFromGuest строит strEntry из гостевого Name и пропускает только точные . / ..:
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 затем присоединяет сохранённый путь к dest и только переводит:
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 документирует: «Каталоги с точками запрещены по соображениям безопасности» и отклоняет RTPATH_PROP_DOTDOT_REFS. Этот вызов выполняется только для корня назначения (GuestSessionImplTasks.cpp:1685-1686). Имена отдельных записей никогда через него не проходят. Translate (GuestCtrlPrivate.cpp:2129-2208) меняет стиль слэшей и сворачивает //. Он не отклоняет ...
Уже зафиксированные неверные пути: трактовка точного пропуска . / .. как санитайзера путей; предположение, что Translate выполняет канонизацию; применение проверки корня назначения к каждой записи; загрузка виртуальной машины вместо исходного стенда; утверждение, что это побег на уровне ядра хоста; трактовка копирования из назначения или копирования в гостя для одного файла как остаточной уязвимости. Театральщина: обратная оболочка. Оракул — файл-свидетель вне назначения.
cd lab
./run.sh
Соберите проект vbox-guestctrl-copyfrom-dotdot. Loopback 127.0.0.1:19220. Исходный harness пина v7.2.20 peel f2792cf44: пропуск точных . / .., GuestPath::Translate (только slash-стиль), CopyFrom::Run объединение dest+sep+entry, затем write/create, отклонение DOTDOT в dest-root BuildDestinationPath. Не загружает VirtualBox или Guest Additions. Привяжите его к loopback.