
Высокоуровневый примитив локальной записи: LiteBox v0.1.0 SNP UserPtr имеет NoValidation, поэтому буфер гостевого системного вызова может быть kernel VA
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-snp-novalidation-userptr
Класс: примитив записи (R/W из гостя в ядро SNP) Достижимость: локальная
LiteBox v0.1.0 (d8556e3) — Microsoft
SNP LinuxKernel связывает UserConstPtr / UserMutPtr с NoValidation, который возвращает указатель без изменений. Комментарий гласит: TODO: implement pointer validation to ensure the pointers are in user space. LVBS уже выполняет проверку диапазона USER_ADDR_MIN..USER_ADDR_END (0x10000 .. 0x7ffffffff000 на x86_64) и оборачивает копирования в STAC/CLAC. SNP — нет. Гостевой mmap ядерного VA отклоняется (TASK_ADDR_MAX), поэтому сохранения из CPL3 не могут попасть в кучу ядра. Путь системного вызова выполняется в режиме ядра и может. memcpy_fallible — это rep movsb в режиме супервизора.
Этот недочёт даёт R/W из гостя в ядро SNP (VMPL2 LiteBox). Это не хост VMPL0, не гипервизор и не прошивка SNP.
| ID | CVE пока нет |
| Класс | Примитив записи (R/W из гостя в ядро SNP) |
| Достижимость | Локальная (недоверенное гостевое пространство пользователя внутри litebox_runner_snp) |
| CWE | CWE-823, CWE-119 |
| CVSS | High: 8.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| Продукт | microsoft/litebox |
| Затронуто | v0.1.0 (d8556e33676e47244bfefa139c1e9ff95bd67d53) платформа ядра SNP. TODO всё ещё присутствует в origin/main по состоянию на 97001fd |
| Аутентификация | гость уже запущен внутри SNP VM |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1. Без оборудования SNP |
Кто: недоверенное гостевое пространство пользователя внутри litebox_runner_snp. Issue #505 (открытый RFC) — это тот же класс. LVBS реализовал это. SNP — нет.
Лаборатория представляет собой гаджет copy_from_slice в режиме супервизора из двух валидаторов плюс копию закреплённого файла litebox_platform_linux_kernel/src/lib.rs. Это не гостевой системный вызов на оборудовании SNP.
| Путь | Целевой VA | Результат |
|---|---|---|
SNP NoValidation (тождество) | 0x1000 (ниже USER_ADDR_MIN) и 0xffff800000000000 (GVA_OFFSET) | принимается; memcpy записывает LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS в объект с меткой ядра |
| Проверка диапазона LVBS | те же ядерные назначения | отклоняется, errno=14 EFAULT, объект ядра пуст |
| Оба | легальное пользовательское назначение 0x400000 | оба копируют свидетеля в пользовательский объект |
| Закреплённый файл в образе | н/д | комментарий TODO плюс UserConstPtr / UserMutPtr, связанные с NoValidation (LvbsValidateAccess отсутствует) |
| Метод + сток | Привилегия |
|---|---|
read / readv / pread / recv* / getcwd / uname / epoll_pwait с buf = ядерный VA -> UserMutPtr::copy_from_slice -> memcpy_fallible (rep movsb) | запись до MAX_KERNEL_BUF_SIZE (512 КиБ) за системный вызов, или страничными фрагментами iovec, в любой отображённый ядерный VA SNP. Полезная нагрузка выбирается гостем (pipe/файл, записанный гостем) |
| Метод + сток | Привилегия |
|---|---|
write / writev / send* с buf = ядерный VA -> read_at_offset | чтение отображённой памяти ядра SNP в гостевой fd |
| неотображённый ядерный VA | EFAULT через таблицу исключений (карта того, какие страницы ядра существуют) |
| Метод + сток | Привилегия |
|---|---|
| повреждение кучи ядра SNP / таблиц страниц / TLS shim | крах или перенаправление гостевого ядра SNP. Я не заявляю о надёжном гаджете RIP |
LvbsValidateAccess + STAC/CLAC)sysretq на ядерный RIP (sanitize_for_user_return отказывает при не-пользовательском RIP/RSP)mmap / mprotect ядерного VA (TASK_ADDR_MAX)NoValidation в пользовательском пространстве Linux/Windows (тот же процесс; границей там является seccomp, это родственный недочёт)litebox_platform_linux_kernel/src/lib.rs, строки 59-67 в v0.1.0. TODO всё ещё присутствует в main. В LVBS уже есть LvbsValidateAccess с USER_ADDR_MIN = 0x10000 и USER_ADDR_MAX = 0x7ffffffff000. У меня не было оборудования SNP. Лаборатория копирует закреплённый файл, реализует тождество против проверки диапазона и записывает свидетеля через NoValidation в целевые VA, которые проверка LVBS отклоняет.
cd lab
./run.sh
Loopback 127.0.0.1:19130. Проект Compose litebox-snp-novalidation-userptr. Свидетель LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS. Последняя строка:
SUCCESS litebox-snp-novalidation-userptr novalidation-kernel-write-ok lvbs-range-reject pin-TODO-present user-range-copy-ok LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS
Свяжите SNP UserPtr с той же проверкой диапазона пользовательского пространства, которая уже есть в LVBS (USER_ADDR_MIN..USER_ADDR_END), и держите копирования за таблицей исключений. Не оставляйте NoValidation на платформе ядра.
Приём сообщений от вендора — MSRC (https://msrc.microsoft.com/create-report). Не открывайте публичный issue на GitHub в microsoft/litebox.
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]