30 августа 2024 года исследователь безопасности под ником @hyprdude опубликовал подробный отчёт об уязвимости CVE-2024-20017,обнаруженной в сетевом демоне wappd. Этот демон используется в SDK от MediaTek и драйверах SoftAP для чипсетов, поддерживающих Wi-Fi 6, и часто встречается в таких устройствах, как роутеры Ubiquiti, Xiaomi и Netgear.
Уязвимость представляет собой переполнение буфера, вызванное некорректной обработкой данных, поступающих из сетевых пакетов. Эксплуатация этой ошибки позволяет злоумышленнику выполнять произвольный код на уязвимых устройствах, используя разные методы атаки. В отчёте @hyprdude описаны четыре подхода к эксплуатации этой уязвимости.
Метод 1. Захват RIP и выполнение ROP
Первый метод эксплуатации основан на простом захвате указателя возврата (RIP) с использованием ROP-цепочки. Этот метод наиболее эффективен на системах, где не применяются современные механизмы защиты, такие как ASLR (рандомизация адресного пространства) и канарейки стека (Stack Canary).
Суть метода заключается в переполнении стека до момента, когда можно перезаписать адрес возврата функции в стеке на адрес, указывающий на полезную нагрузку. В данном случае используется ROP-цепочка, которая вызывает функцию “system()” с заранее подготовленной командой для выполнения на устройстве. Это позволяет злоумышленнику получить полный контроль над устройством. Данный метод является наиболее простым, но уже устарел из-за широкого распространения защитных технологий.
Метод 2. Произвольная запись через порчу указателя
Второй метод основан на более сложной концепции и требует наличия защитных механизмов, таких как ASLR, канарейки стека и частичная защита RELRO. В этом случае злоумышленник использует возможность переполнения стека для порчи указателей (Pointer Corruption), что позволяет ему контролировать, куда будут записаны данные в памяти.
Используя этот метод, хакер может перезаписать таблицу GOT (Global Offset Table), которая содержит адреса функций, используемых программой. Подменяя адреса в таблице GOT, злоумышленник может перенаправить выполнение программы на свой код, что позволяет ему выполнить произвольные команды на устройстве. Этот метод сложнее в реализации, но значительно эффективнее на защищённых системах.
Метод 3. Возвращение к перезаписи адреса возврата и использование ROP на системах с полной защитой RELRO
Третий метод ещё более сложен в реализации, поскольку система использует полную защиту RELRO, что делает невозможным изменение таблицы GOT. Здесь злоумышленник использует комбинацию методов: сначала он добивается произвольной записи, а затем создаёт сложную ROP-цепочку, которая позволяет обойти защиту и выполнить нужную команду.
В этой ROP-цепочке используется несколько последовательных команд, которые манипулируют регистрами и стеком, чтобы обойти защитные механизмы системы. В конце выполнения цепочки система вызывает функцию “system()”, передавая ей нужную команду. Этот метод особенно сложен в реализации, так как требует глубокого понимания архитектуры и защиты операционной системы.
Метод 4. Эксплуатация на реальном устройстве с архитектурой ARM64
Четвёртый метод был разработан специально для эксплуатации уязвимости на реальном устройстве – маршрутизаторе Netgear WAX206 с архитектурой ARM64. Это устройство использует все современные методы защиты, включая ASLR, NX, полную защиту RELRO и канарейки стека. Однако, из-за особенностей архитектуры ARM64 и методов оптимизации кода, злоумышленнику удалось найти способ обхода защиты. Он использует JOP (Jump Oriented Programming) вместо ROP для перенаправления выполнения программы.
Использованный метод включает несколько этапов: сначала злоумышленник получает возможность записывать данные в произвольные места памяти, затем он перезаписывает возвращаемый адрес и другие критические структуры в памяти, чтобы подготовить выполнение команды “system()”. Эта техника наглядно демонстрирует, насколько сложной может быть эксплуатация уязвимостей на реальных устройствах, особенно с учётом особенностей архитектуры ARM64.
Бонус. Использование уязвимости ядра через вызовы IOCTL
В завершение отчёта автор представил ещё один интересный метод, который позволяет использовать эксплойт для атаки на уязвимость в ядре операционной системы. Используя цепочку JOP, злоумышленник может выполнить произвольные вызовы IOCTL, что позволяет получить доступ к критическим функциям ядра и расширить контроль над устройством. Этот метод сложен в реализации, но его использование показывает, насколько мощным может быть один эксплойт, если он нацелен на разные уровни системы.
Заключение
Этот подробный анализ уязвимости CVE-2024-20017 подчёркивает важность использования многоуровневой защиты в современных системах. Один и тот же баг может быть использован для атаки разными способами, и каждый из этих методов требует глубоких знаний и творческого подхода к разработке эксплойтов.
Данный пример очень хорошо иллюстрирует, что даже простое переполнение буфера может превратиться в серьёзную угрозу для безопасности, если злоумышленник обладает достаточными знаниями и ресурсами для его эксплуатации.