Анализ и использование уязвимости 0day в системе Microsoft Windows
Недавно в обновлении безопасности, выпущенном Microsoft, был исправлен эксплуатируемый уязвимость повышения привилегий win32k. Эта уязвимость присутствует только в ранних версиях операционной системы Windows и не может быть активирована в Windows 11. В данной статье будет проанализировано, как злоумышленники продолжают использовать подобные уязвимости на фоне постоянного совершенствования современных средств защиты.
Фон уязвимости
Уязвимость 0day относится к нераскрытым и неустраненным уязвимостям в безопасности, аналогичным концепции T+0 торговли на финансовых рынках. Как только такие уязвимости будут обнаружены, они могут быть использованы злоумышленниками незаметно, что может привести к огромному ущербу.
Обнаруженная уязвимость 0day в системе Windows позволяет злоумышленникам получить полный контроль над системой. Это может привести к утечке личной информации, сбоям системы, потере данных, материальным убыткам и другим серьезным последствиям. С точки зрения Web3 это может привести к краже приватных ключей, перемещению цифровых активов, а также повлиять на всю экосистему Web3, основанную на инфраструктуре Web2.
Анализ патчей
Анализ кода патча показал, что проблема заключается в многократной обработке подсчета ссылок на объекты. Изучив комментарии в раннем исходном коде, можно понять, что ранее код блокировал только объект окна, не блокируя объект меню в окне, что могло привести к ошибочной ссылке на объект меню.
Воспроизведение уязвимости
Анализируя контекст уязвимой функции, было обнаружено, что переданное xxxEnableMenuItem() меню обычно было заблокировано в верхнем уровне функции. Дальнейший анализ показал, что меню, возвращаемое функцией MenuItemState, может быть как основным меню окна, так и подменю или подподменю.
Чтобы вызвать уязвимость, была создана специальная четырехуровневая структура меню с установленными следующими характеристиками:
ID нижнего уровня меню D должен быть типом системного меню
Верхнее меню A также должно быть системным меню, но необходимо удалить соответствующий тип системного меню.
Удалить ссылку меню C в меню B
Наличие меню B, похоже, способствует выпуску меню C
При возврате пользовательского уровня из xxxRedrawTitle удалите ссылочные отношения меню C и B и освободите меню C. Таким образом, когда функция xxxEnableMenuItem возвращается, объект меню C, на который ссылаются, уже недействителен.
Эксплуатация уязвимостей
Эксплуатация уязвимостей в основном рассматривает два направления:
Выполнение кода shellcode: см. ранние уязвимости, такие как CVE-2017-0263, однако в более поздних версиях Windows могут возникнуть проблемы с точкой входа и безопасностью SMEP.
Использование операций чтения и записи для изменения адреса токена: в последние годы было несколько публичных примеров, на которые можно сослаться, которые обладают универсальностью в отношении раскладки памяти на настольных ПК и операций чтения и записи. Ключевым моментом является анализ того, как впервые контролировать cbwndextra как очень большое значение при повторном использовании памяти UAF.
В этом случае используется второй вариант, который разделяет весь процесс на два этапа:
Использование уязвимости UAF для контроля значения cbwndextra
Управление cbwndextra для реализации стабильных операций чтения и записи
Первичная запись данных
После срабатывания уязвимости система может неправильно использовать данные управляемого объекта окна в MNGetPopupFromMenu() и xxxMNUpdateShownMenu(). Мы используем объект названия окна в классе окна WNDClass, занимающий освобожденный объект меню.
Ключевым моментом является найти место в структуре адреса, который мы можем построить, где можно записывать данные произвольным образом, даже если это всего лишь один байт. В конечном итоге был выбран вариант в функции xxxRedrawWindow, который контролирует данные памяти предыдущего объекта через разметку памяти для определения объекта по флагам в функции.
стабильная память
Создайте как минимум три последовательных объекта HWND по 0x250 байт, освободите один из них и используйте объект HWNDClass. Данные в конце предыдущего объекта HWND используются для проверки по флагам в xxxRedrawWindow, меню объекта последнего HWND и объект HWNDClass используются в качестве конечного средства записи и чтения.
Точно определить, расположены ли запрашиваемые объекты окон в ожидаемом порядке, можно с помощью утечки адреса ядровой дескриптора, находящегося в оперативной памяти.
Чтение и запись примитивов
Для произвольного чтения используйте GetMenuBarInfo(), для произвольной записи используйте SetClassLongPtr(). За исключением записи, заменяющей TOKEN, все остальные записи выполняются с использованием смещения на объекте класса первого объекта окна.
Резюме
Уязвимость win32k имеет долгую историю, но Microsoft пытается переписать соответствующий код на Rust, и в будущем в новых системах такие уязвимости могут быть устранены.
Процесс эксплуатации этого уязвимости относительно прост, основная сложность заключается в том, как контролировать первую запись. Это сильно зависит от утечки адреса дескриптора кучи на настольной системе, что по-прежнему является проблемой безопасности старых систем.
Обнаружение этого уязвимости, возможно, стало результатом более совершенного контроля покрытия кода.
Для обнаружения уязвимостей, помимо внимания к ключевым точкам триггерных функций, также следует обратить внимание на аномальные схемы памяти и смещения чтения/записи данных окон.
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
6 Лайков
Награда
6
5
Поделиться
комментарий
0/400
FarmToRiches
· 8ч назад
Хорошо, 11 не пострадает.
Посмотреть ОригиналОтветить0
ChainSauceMaster
· 08-05 20:25
Что снова с старым вином? Каждый день есть уязвимости.
Посмотреть ОригиналОтветить0
FloorPriceWatcher
· 08-05 20:23
win11 избежал беды
Посмотреть ОригиналОтветить0
MEVSandwichVictim
· 08-05 20:21
Уязвимости пакета, много спектаклей. Кто торгует, тот разыгрывайте людей как лохов.
Анализ уязвимости 0day в ранних версиях Microsoft Windows: от повышения привилегий до полного использования
Анализ и использование уязвимости 0day в системе Microsoft Windows
Недавно в обновлении безопасности, выпущенном Microsoft, был исправлен эксплуатируемый уязвимость повышения привилегий win32k. Эта уязвимость присутствует только в ранних версиях операционной системы Windows и не может быть активирована в Windows 11. В данной статье будет проанализировано, как злоумышленники продолжают использовать подобные уязвимости на фоне постоянного совершенствования современных средств защиты.
Фон уязвимости
Уязвимость 0day относится к нераскрытым и неустраненным уязвимостям в безопасности, аналогичным концепции T+0 торговли на финансовых рынках. Как только такие уязвимости будут обнаружены, они могут быть использованы злоумышленниками незаметно, что может привести к огромному ущербу.
Обнаруженная уязвимость 0day в системе Windows позволяет злоумышленникам получить полный контроль над системой. Это может привести к утечке личной информации, сбоям системы, потере данных, материальным убыткам и другим серьезным последствиям. С точки зрения Web3 это может привести к краже приватных ключей, перемещению цифровых активов, а также повлиять на всю экосистему Web3, основанную на инфраструктуре Web2.
Анализ патчей
Анализ кода патча показал, что проблема заключается в многократной обработке подсчета ссылок на объекты. Изучив комментарии в раннем исходном коде, можно понять, что ранее код блокировал только объект окна, не блокируя объект меню в окне, что могло привести к ошибочной ссылке на объект меню.
Воспроизведение уязвимости
Анализируя контекст уязвимой функции, было обнаружено, что переданное xxxEnableMenuItem() меню обычно было заблокировано в верхнем уровне функции. Дальнейший анализ показал, что меню, возвращаемое функцией MenuItemState, может быть как основным меню окна, так и подменю или подподменю.
Чтобы вызвать уязвимость, была создана специальная четырехуровневая структура меню с установленными следующими характеристиками:
При возврате пользовательского уровня из xxxRedrawTitle удалите ссылочные отношения меню C и B и освободите меню C. Таким образом, когда функция xxxEnableMenuItem возвращается, объект меню C, на который ссылаются, уже недействителен.
Эксплуатация уязвимостей
Эксплуатация уязвимостей в основном рассматривает два направления:
Выполнение кода shellcode: см. ранние уязвимости, такие как CVE-2017-0263, однако в более поздних версиях Windows могут возникнуть проблемы с точкой входа и безопасностью SMEP.
Использование операций чтения и записи для изменения адреса токена: в последние годы было несколько публичных примеров, на которые можно сослаться, которые обладают универсальностью в отношении раскладки памяти на настольных ПК и операций чтения и записи. Ключевым моментом является анализ того, как впервые контролировать cbwndextra как очень большое значение при повторном использовании памяти UAF.
В этом случае используется второй вариант, который разделяет весь процесс на два этапа:
Первичная запись данных
После срабатывания уязвимости система может неправильно использовать данные управляемого объекта окна в MNGetPopupFromMenu() и xxxMNUpdateShownMenu(). Мы используем объект названия окна в классе окна WNDClass, занимающий освобожденный объект меню.
Ключевым моментом является найти место в структуре адреса, который мы можем построить, где можно записывать данные произвольным образом, даже если это всего лишь один байт. В конечном итоге был выбран вариант в функции xxxRedrawWindow, который контролирует данные памяти предыдущего объекта через разметку памяти для определения объекта по флагам в функции.
стабильная память
Создайте как минимум три последовательных объекта HWND по 0x250 байт, освободите один из них и используйте объект HWNDClass. Данные в конце предыдущего объекта HWND используются для проверки по флагам в xxxRedrawWindow, меню объекта последнего HWND и объект HWNDClass используются в качестве конечного средства записи и чтения.
Точно определить, расположены ли запрашиваемые объекты окон в ожидаемом порядке, можно с помощью утечки адреса ядровой дескриптора, находящегося в оперативной памяти.
Чтение и запись примитивов
Для произвольного чтения используйте GetMenuBarInfo(), для произвольной записи используйте SetClassLongPtr(). За исключением записи, заменяющей TOKEN, все остальные записи выполняются с использованием смещения на объекте класса первого объекта окна.
Резюме
Уязвимость win32k имеет долгую историю, но Microsoft пытается переписать соответствующий код на Rust, и в будущем в новых системах такие уязвимости могут быть устранены.
Процесс эксплуатации этого уязвимости относительно прост, основная сложность заключается в том, как контролировать первую запись. Это сильно зависит от утечки адреса дескриптора кучи на настольной системе, что по-прежнему является проблемой безопасности старых систем.
Обнаружение этого уязвимости, возможно, стало результатом более совершенного контроля покрытия кода.
Для обнаружения уязвимостей, помимо внимания к ключевым точкам триггерных функций, также следует обратить внимание на аномальные схемы памяти и смещения чтения/записи данных окон.