Новости Stack Canary, PIE, ASLR — и всё зря: багхантеры показали, как обойти защиту Synology

NewsMaker

I'm just a script
Премиум
19,470
40
8 Ноя 2022
Глубоко в стеке пряталась дверь, которую просто забыли закрыть.


ij42bc5lgsl6m26jbiju5teemgh0i440.jpg


Осенью 2024 года команда багхантеров InfoSect Для просмотра ссылки Войди или Зарегистрируйся для участия в соревновании Pwn2Own Ireland, нацеленной на удалённое выполнение кода в IP-камере Synology TC500. Основой для эксплуатации стал дефект в реализации функции форматирования строк, позволяющий обойти ASLR и получить полный контроль над устройством. Несмотря на то, что в последний момент Synology успела закрыть уязвимость, разработка эксплойта стала показательной демонстрацией возможностей атакующих в условиях современных защитных механизмов.

Исследование началось с анализа прошивки камеры, доступной для загрузки. Используя эмуляцию, удалось изучить внутренние сервисы устройства: веб-интерфейс на основе civetweb и RTSP-сервер. Основной интерес вызвал процесс webd, обслуживающий HTTP-запросы. Несмотря на наличие современных защит — PIE, RELRO, ASLR и Stack Canary — в коде функции process_new_connection была выявлена критическая ошибка.

Synology добавила в webd механизм отладки, где каждый поток при обработке запроса записывает URI в глобальную таблицу через функцию set_thread_name. Проблема в том, что передаваемое значение форматируется напрямую через mg_snprintf, где URI используется как шаблон формата — без проверки, содержит ли он управляющие символы. Это создавало типичную format string уязвимость.

Хотя напрямую прочитать результат было нельзя, изучение стека выявило, что один из указателей в стеке указывал на HTTP-версию — строку, возвращаемую клиенту. Изменив эту ссылку через форматные спецификаторы вида %[len]c%[pos]$n, можно было добиться утечки адресов, обходя ASLR. Возможности ограничивались диапазоном 0x50000000–0x60000000, но этого хватало для утечек внутри исполняемого модуля.

Следующий этап — запись в произвольное место памяти. Используя стековые указатели, команда создала цепочку: p1 указывал на p2, а p2 — на p3, располагающийся в безопасной области стека. Пошагово изменяя байты этих указателей, удавалось направить p3 на произвольный адрес, а затем — записывать данные в нужное место.

На основе этого была реализована примитивная функция произвольной записи, работающая с 8-битной точностью. Это позволило не просто менять содержимое памяти, но и подготавливать атаку на функцию free() из библиотеки glibc.

Используя ранее полученную утечку и определив адрес.got, удалось вычислить расположение __free_hook и заменить его на system(). Для вызова free() с нужным аргументом атакующие использовали поведение функции GetSessionIdFromCookie, которая освобождает память, выделенную под значение заголовка Cookie. Если в Cookie передать, например, строку telnetd -p 1337 -l /bin/sh -F, то при вызове free(cookie) произойдёт запуск команды system("telnetd -p 1337 -l /bin/sh -F"), поднимая Для просмотра ссылки Войди или Зарегистрируйся .

Хотя сама атака не была продемонстрирована на Pwn2Own из-за срочной установки обновлённой прошивки от Synology, методика оказалась наглядным примером того, как одиночная ошибка форматирования в сочетании с особенностями glibc может дать атакующему полный контроль над устройством.
 
Источник новости
www.securitylab.ru

Похожие темы