В июне 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
Поделиться статьей