Rust, Хакинг на Rust

Курс — Хакинг на Rust. #22 Инструменты хакера на Rust. Фаззинг и тестирование на устойчивость. Генерация тестовых данных для обнаружения уязвимостей

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

Зачем генерировать тестовые данные?

Генерация тестовых данных — основа фаззинга и стресс-тестирования. Она позволяет:

  • Найти краши из-за некорректной обработки ввода (переполнение буфера, use-after-free).
  • Выявить логические ошибки в парсерах, сериализаторах, сетевых протоколах.
  • Проверить устойчивость к нечеловеческим сценариям (например, гигантские пакеты, невалидные UTF-8 строки).

В Rust это особенно важно для unsafe-кода, где защита языка отключена.

Стратегии генерации данных

1. Случайные мутации

Генерация данных на основе мутаций исходных шаблонов.
Пример:

2. Генерация на основе грамматик

Для структурированных данных (JSON, HTTP-запросы) используют грамматики.
Пример с arbitrary:

3. Словари

Использование известных паттернов для мутации (например, ключевые слова SQL для инъекций).
Пример словаря для SQLi:

Инструменты для генерации

Cargo-fuzz: Умные мутации с LibFuzzer

cargo-fuzz использует LLVM LibFuzzer, который комбинирует мутации с анализом покрытия кода.

Пример фазз-таргета для парсера CSV:

Запуск:

AFL.rs: Генетический фаззинг

AFL использует генетические алгоритмы для эволюции тестовых данных.

Пример интеграции:

Запуск:

Обработка нестандартных данных

Бинарные протоколы

Для бинарных данных (например, DNS-пакеты) используйте arbitrary или ручную генерацию.

Пример DNS-пакета:

Невалидные UTF-8 строки

Проверка обработки некорректных символов:

Анализ крашей

При падении фаззера сохраняется тест-кейс , вызвавший ошибку. Пример анализа:

Действия:

  1. Проверьте, связан ли краш с unsafe-кодом.
  2. Используйте gdb для отладки:
  3. Воспроизведите ошибку вручную.

Этические аспекты

  • Только разрешенные цели: Тестирование на чужих системах без согласия — нарушение закона.
  • Ответственное раскрытие: Сообщайте о найденных уязвимостях разработчикам.

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

  1. Напишите генератор HTTP-запросов с мутациями методов и заголовков.
  2. Проверьте парсер XML на устойчивость к внешним сущностям (XXE).
  3. Проанализируйте краш-лог из cargo-fuzz и найдите уязвимый код.

Итог:
Генерация тестовых данных — ключевой этап поиска уязвимостей. Rust-инструменты вроде cargo-fuzz и afl.rs делают этот процесс эффективным, но успех зависит от понимания структуры данных и креативности в их мутациях. Тестируйте без устали — и пусть ваши программы сломаются раньше, чем их сломают злоумышленники.

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

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

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