В июне 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