NTFS + VHD = SYSTEM: как обмануть ядро Windows, если знаешь пару тонкостей про $LogFile

Механизм логирования оказался троянским конём.


7qq7m778rmc050qzijizm88dtkt3t602.jpg


Исследователь из Positive Technologies обнаружил критическую уязвимость в реализации файловой системы NTFS, которая позволяет локальному атакующему получить привилегии SYSTEM через специально подготовленный виртуальный диск (VHD). Уязвимость получила идентификатор CVE-2025-49689 и затрагивает Windows 11 версии 22H2.

Проблема связана с механизмом Log File Service (LFS), используемым NTFS для ведения журнала транзакций. Во время монтирования диска NTFS вызывает цепочку функций ntfs!NtfsMountVolumentfs!InitializeRestartStatentfs!ReadRestartTable, где происходит некорректная обработка поля ClientDataLength в структуре LFS_RECORD. При установке этого поля в значение 0xFFFFFFFF возникает переполнение при вычислении длины записи и обход критической проверки.

В результате возникает чтение данных за пределами допустимого диапазона и последующее копирование большого объема памяти с помощью memmove, что приводит к чтению за границами выделенного буфера из $LogFile. Для активации уязвимости необходимо подменить LFS-структуры в VHD и обойти механизм кеширования Lfcb->CachedRestartArea, чтобы система принудительно прочитала поддельный RESTART_AREA с фальшивой таблицей атрибутов.

Дальнейшее развитие атаки возможно за счёт подделки структуры OPEN_ATTRIBUTE_DATA, которая содержит указатель на SCB — объект управления файловыми потоками. NTFS использует эту структуру в функции NtfsCloseAttributesFromRestart, где происходит работа с AVL-деревом через вызов RtlDeleteElementGenericTableAvl.

Этот вызов позволяет перехватить выполнение в колбеке CompareRoutine и провести запись произвольных данных по произвольному адресу в памяти ядра. В качестве инструмента управления потоком исполнения исследователь использует функцию RtlpFcBufferManagerReferenceBuffers, превращая контроль над деревом в примитив write-what-where.

Для устойчивой эксплуатации задействован механизм IO_RING, позволяющий перезаписать указатель на буфер в структуре _IORING_OBJECT и получить доступ к произвольной записи в память ядра. Дополнительно применяется классический приём с pipe-based memory allocation для обхода SMEP/SMAP, а также цепочка подделок: SCB → FCB → VCB.

Полученные возможности позволяют не только читать содержимое ядра, но и исполнять произвольный код с максимальными привилегиями. В демонстрации использован классический приём — подмена токена пользователя на SYSTEM.

Эксплойт работает даже в системах с включёнными митигациями CFG и HVCI, что делает угрозу особенно значимой. Исследователь предлагает возможные направления для усиления надёжности эксплуатации: более точное управление исчерпанием памяти, обход SMAP и предотвращение ранних сбоев ядра до достижения нужного контекста.

На момент публикации обновления безопасности от Microsoft не выпущено. Рекомендуется избегать монтирования VHD-дисков из непроверенных источников и контролировать системные события, связанные с работой $LogFile.