В июне 2019 года исследователи ESET определили эксплойт нулевого дня, используемый для узкоспециализированных атак в Восточной Европе.
В эксплойте используется уязвимость локального повышения привилегий в Microsoft Windows, в частности разыменование нулевого указателя в компоненте win32k.sys. После того, как эксплойт был обнаружен и проанализирован, об этом сообщили в Microsoft Security Response Center, который быстро исправил уязвимость и выпустил обновление.
Уязвимость затрагивает следующие версии:
- Windows 7 for 32-bit Systems Service Pack 1
- Windows 7 for x64-based Systems Service Pack 1
- Windows Server 2008 for 32-bit Systems Service Pack 2
- Windows Server 2008 for Itanium-Based Systems Service Pack 2
- Windows Server 2008 for x64-based Systems Service Pack 2
- Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
- Windows Server 2008 R2 for x64-based Systems Service Pack 1
Данный пост в блоге посвящен техническим деталям уязвимости и ее эксплуатации. В другом посте, который выйдет завтра, мы рассмотрим образец вредоносного ПО и его последствия более детально.
Реализация
Как и в случае ряда других уязвимостей Microsoft Windows win32k.sys, обнаруженных в последние годы, этот эксплойт использует объекты всплывающего меню. Например, локальный эксплойт повышения привилегий группы Sednit, который мы проанализировали в 2017 году, использовал объекты меню и методы меню, очень похожие на данный эксплойт.
Этот эксплойт создает два окна; по одному на первый и второй этапы реализации. В первом окне он создает объекты всплывающего меню и добавляет пункты меню, используя функции CreatePopupMenu и AppendMenu. В дополнение к этому, эксплойт устанавливает фильтры WH_CALLWNDPROC и EVENT_SYSTEM_MENUPOPUPSTART.
Затем эксплойт отображает меню с помощью функции TrackPopupMenu. На этом этапе выполняется код, подключенный к EVENT_SYSTEM_MENUPOPUPSTART. Этот код пытается открыть первый доступный элемент в меню, посылая в меню последовательность сообщений MN_SELECTITEM, MN_SELECTFIRSTVALIDITEM и MN_OPENHIERARCHY.
Следующий шаг очень важен для запуска этой уязвимости. Эксплойт должен уловить тот момент времени, когда начальное меню уже создано, но подменю находится только в процессе создания. Для этого у эксплойта есть код, который обрабатывает сообщение WM_NCCREATE в фильтре WH_CALLWNDPROC. Когда код эксплойта обнаруживает, что система находится в требуемом состоянии, он отправляет сообщение MN_CANCELMENUS (0x1E6) в первое меню, которое отменяет его. Тем временем подменю еще не создано.
Теперь, если мы проверим этот объект подменю в режиме ядра, мы увидим, что tagPOPUPMENU> ppopupmenuRoot равно 0.‑ Такое положение вещей позволяет атакующему использовать этот элемент в структуре ядра для разыменования нулевого указателя. Эксплойт выделяет новую страницу по адресу 0x0, и этот адрес будет рассматриваться ядром как объект tagPOPUPMENU (см. Рисунок 1).

Рис.1 Структура ядра tagPOPUPMENU
На этом этапе злоумышленники используют второе окно. Основная цель эксплойта — инвертировать бит bServerSideWindowProc в структуре tagWND второго окна. Это приведет к исполнению процесса WndProc в режиме ядра.
Для этого злоумышленники проникли в адрес памяти ядра структуры tagWND второго окна, вызвав неэкспортированную функцию HMValidateHandle в библиотеке user32.dll. Затем эксплойт создает поддельный объект tagPOPUPMENU на странице NULL и отправляет сообщение MN_BUTTONDOWN в подменю.
В результате всех этих действий ядро,в конечном итоге,выполнит функцию win32k! XxxMNOpenHierarchy.

Рис.2 Разобранный код функции win32k! XxxMNOpenHierarchy
Эта функция передает созданный на NULL-странице объект в win32k! HMAssignmentLock. Бит bServerSideWindowProc устанавливается внутри функции win32k! HMDestroyUnlockedObject, которая расположена на несколько вызовов ниже по структуре внутри win32k! HMAssignmentLock.

Рис.3 Разобранный код функции win32k!HMDestroyUnlockedObject
Вот и все! Теперь эксплойт может отправить нужное ему сообщение во второе окно для запуска WndProc в режиме ядра.
На последнем этапе эксплойт заменяет токен текущего процесса системным токеном.
Выводы
Эксплойт работает только с более старыми версиями Windows, поскольку начиная с Windows 8 пользовательский процесс не может отображать NULL-страницу. Microsoft распространил этот процесс также на Windows 7 для 64-разрядных систем.
Пользователям, которые все еще используют Windows 7 для 32-разрядных систем с пакетом обновления 1 (SP1), следует рассмотреть возможность обновления до более новых операционных систем, поскольку расширенная поддержка Windows 7 с пакетом обновления 1 заканчивается 14 января 2020 г. Это означает, что пользователи Windows 7 не будут получать критические обновления безопасности. Таким образом, они останутся незащищенными от уязвимостей, подобных этой.
Показатели внедрения (IoCs)
| SHA-1 hash | Название обнаружения в ESET |
|---|---|
| CBC93A9DD769DEE98FFE1F43A4F5CADAF568E321 | Win32/Exploit.CVE-2019-1132.A |
Источник: Welivesecurity
Поделиться статьей