Патч, выпущенный Microsoft в марте 2019 года, исправляет две уязвимости zero-day в дикой Windows, в котором CVE-2019-0808 был обнаружен командой анализа угроз Google и передан в Microsoft.
Согласно Microsoft, уязвимость, затрагивающая компоненты Win32k, позволяет злоумышленнику повысить уровень разрешений и выполнить произвольный код в режиме ядра. Google сказал, что уязвимость затрагивает только Windows 7 и Windows Server 2008. Windows 10 не будет затронута, потому что Microsoft ввела меры по снижению уязвимости в последней версии операционной системы. Но Windows 7 определенного процента пользователей все еще затронута , уязвимость в сочетании с Chrome RCE (CVE-2019-5786) использовалась для реальных APT-атак, поэтому весьма вероятно, что она будет использована для выполнения крупномасштабных атак и создания реальная угроза. Поэтому ядерный технологический центр безопасности 360 создал POC путем написания кода, и выполнил некоторое восстановление процесса запуска уязвимости, чтобы производитель безопасности увеличил соответствующие меры защиты.
1. Причины уязвимости
После получения объекта окна меню, возвращенного функцией оконной процедуры, функция xxxMNFindWindowFromPoint не эффективно проверит допустимость своего члена tagPOPUPMENU, в результате чего последующая функция MNGetpItemFromIndex вызывает уязвимость разыменования нулевого указателя.
- Процесс запуска уязвимости
Основной процесс объясняется ниже.
Шаг 1: Во-первых, вам нужно установить целую функцию перехвата сообщений для перехвата сообщения MN_FINDMENUWINDOWFROMPOINT, отправленного xxxMNFindWindowFromPoint.
Шаг 2: Создайте пункт меню с функцией перетаскивания и ручку hpwn специального окна для резервного копирования.
Шаг 3: Войдите в функцию NtUserMNDragOver, перетаскивая меню или непосредственно вызывая соответствующий системный вызов.
Шаг 4. Вызывающая связь покажена следующим образом: NtUserMNDragOver-> xxxMNMouseMove -> xxxMNFindWindowFromPoint, xxxMNFindWindowFromPoint отправит сообщение MN_FINDMENUWINDOWFROMPOINT в окно и получит возвращенный дескриптор окна. Поскольку вся функция ловушки сообщений установлена, поток выполнения возвращается на пользовательский слой.
Шаг 5: Так как функция оконной процедуры окна меню была заменена ранее, вся функция ловушки сообщений будет входить в функцию FakeWindowProc после выполнения и напрямую возвращать ранее использованный дескриптор окна hpwn.
Шаг 6. После получения дескриптора окна функция xxxMNFindWindowFromPoint напрямую возвращает соответствующий объект окна и передает его в функцию xxxMNUpdateDraggingInfo. Следует отметить, что даный полученный объект окна является немедленно фальсифицированным объектом окна hpwn, его внутренний член tagPOPUPMENU не установлен полностью, большинство членов равно 0!
Шаг 7: После того, как функция xxxMNUpdateDraggingInfo получит объект окна, она получит доступ к своему члену-объекту tagPOPUPMENU через функцию MNGetpItem.
Функция MNGetpItem будет продолжать обращаться к spmenu , что является членом объекта tagPOPUPMENU, вызывая уязвимость разыменования нулевого указателя.
3. Исправление уязвимости
В мартовском патче для Windows 7 Microsoft исправила путаницу с типом окна (не NULL для типа MENU) и проверила состояние объекта popupMenu. Сравнение кода покажено следующим образом.
Без патча:
После исправления патчем:
4. Заключение
На основании созданного POC было обнаружено, что причина уязвимости заключается в том, что при вызове функции NtUserMNDragOver в конкретном случае происходит разыменование нулевого указателя в win32k!MNGetpItemFromIndex. Данная уязвимость использует модуль драйвера ядра Windows win32k.sys для локальной авторизации. После того, как авторизация прошла успешно, она может преодолеть ограничения обычных прав пользователя и она может быть использована в качестве изолированной программной среды для выхода из системы и полного контроля над компьютерной системой пользователя.
Подробнее о 360 Total Security