Rust, Хакинг на Rust

Курс — Хакинг на Rust. #16 Инструменты хакера на Rust. Создание эксплойтов. Пример: Эксплуатация уязвимостей через unsafe

Здравствуйте, дорогие друзья.

Почему unsafe опасен?

Rust славится своей системой безопасности, которая предотвращает целый класс ошибок, таких как гонки данных, разыменование нулевых указателей и use-after-free. Однако ключевое слово unsafe позволяет обходить эти гарантии, предоставляя доступ к низкоуровневым операциям: работе с сырыми указателями, мутабельным aliasing, вызовам внешних функций (FFI). Это делает unsafe мощным инструментом, но и потенциальным источником уязвимостей.

Пример уязвимости:
Рассмотрим код, где unsafe используется для манипуляции памятью без проверки границ. Такие ошибки могут привести к переполнению буфера, перезаписи контроля потока (ROP-атаки) или утечке данных.

Здесь input.len() может превышать размер буфера (8 байт), что приведет к перезаписи соседних областей памяти.

Эксплуатация буферного переполнения

Для эксплуатации уязвимости злоумышленник может передать в input данные, которые:

  1. Перезапишут сохранённый указатель инструкций (RIP/EIP).
  2. Перехватят управление, подставив адрес shellcode или ROP-цепочки.

Пример эксплойта:
Предположим, что уязвимая функция вызывается в контексте обработки сетевого запроса. Атакующий отправляет тщательно сформированный пакет, в котором:

  • Первые 8 байт — «мусор» для заполнения буфера.
  • Следующие 8 байт — адрес возврата (например, 0x41414141).
  • Далее — shellcode (например, запуск /bin/sh).

Анализ и отладка

Для успешной эксплуатации требуется:

  1. Определить смещение до RIP/EIP:
    Используйте утилиты вроде gdb с подключённым рустовым плагином (rust-gdb).
  1. Если RIP содержит 0x41414141, смещение найдено.
  2. Обойти защиту стека (Stack Canaries, DEP, ASLR):
    • DEP (NX bit): Используйте ROP-цепочки для выполнения кода из существующих секций.
    • ASLR: Утечка адресов через уязвимости чтения за границами.
    • Stack Canaries: Переполнение до их записи или brute-force значений.

Инструменты для работы

  • cargo-fuzz: Генерация тестовых данных для обнаружения крашей.
  • pwntools-rs: Фреймворк для написания эксплойтов на Rust.
  • gdb + gef: Анализ памяти и регистров.
  • radare2/Cutter: Дизассемблирование и патчинг бинарников.

Защита от unsafe-уязвимостей

  1. Минимизация unsafe:
    Инкапсулируйте небезопасный код в безопасные обёртки. Пример:
  1. Статический анализ:
    Используйте clippy и rust-analyzer для выявления подозрительных паттернов.
  2. Фаззинг:
    Проверяйте код на устойчивость к некорректным входным данным.
  3. Формальная верификация:
    Инструменты вроде Kani помогают доказать корректность кода.

Этический контекст

Эксплуатация уязвимостей требует ответственности. Используйте эти знания только в легальных рамках (например, CTF, аудиты). Никогда не атакуйте системы без разрешения.

Задание для самостоятельной работы:

  1. Модифицируйте пример эксплойта, добавив ROP-цепочку для обхода DEP.
  2. Напишите фазз-тест для обнаружения переполнений в вашем коде.
  3. Изучите CVE-2023-1234 (пример) и определите, как unsafe мог способствовать уязвимости.

Итог:
Rust не исключает уязвимостей, но делает их явными через unsafe. Понимание низкоуровневых механизмов и осторожное использование unsafe — ключ к написанию безопасного кода и эффективных эксплойтов.

Хакинг на языке программирования Rust

На этом все. Всем хорошего дня!

Цикл статей по курсу — «Хакинг на Rust».