Rust, Хакинг на Rust

Курс — Хакинг на Rust. #21 Инструменты хакера на Rust. Фаззинг и тестирование на устойчивость. Инструменты: cargo-fuzz, afl.rs

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

Фаззинг — метод тестирования, при котором программа подвергается потоку случайных, непредсказуемых входных данных (фазз-данных). Цель: вызвать краши, утечки памяти или некорректное поведение, чтобы обнаружить уязвимости. В Rust фаззинг особенно эффективен для:

  • Обнаружения use-after-free и переполнений буфера в unsafe-коде.
  • Проверки обработки ввода (парсеры, сетевые протоколы).

Cargo-fuzz: фаззинг в экосистеме Rust

cargo-fuzz — официальный инструмент на основе LLVM LibFuzzer, интегрированный в Cargo.

Установка и настройка

  1. Добавьте cargo-fuzz в зависимости:

2. Инициализируйте проект:

  1. Это создаст директорию fuzz с примером таргета.

Пример: фаззинг парсера JSON

Пусть есть функция parse_json(input: &str) -> Result<(), &str>. Создадим фазз-таргет:

Запуск фаззинга

cargo-fuzz генерирует входные данные, пока не найдёт краш или не превысит лимиты.

Анализ результатов

При краше создаётся тест-кейс в fuzz/artifacts. Пример вывода:

AFL.rs: American Fuzzy Lop для Rust

AFL — легендарный фаззер, использующий генетические алгоритмы для мутации входных данных. В Rust его можно использовать через afl.rs.

Установка и настройка

  1. Установите AFL:

2. Настройте Cargo.toml для инструментария AFL:

Пример: фаззинг обработчика CSV

Запуск AFL

AFL проанализирует входные данные из in_dir и сохранит результаты в out_dir.


Сравнение cargo-fuzz и afl.rs

КРИТЕРИЙCARGO-FUZZAFL.RS
ИнтеграцияВстроен в CargoТребует отдельной настройки
СкоростьБыстрый (LLVM)Медленнее, но умные мутации
КастомизацияОграниченнаяГибкая (например, persistent mode)
ПоддержкаОфициальнаяСообщество

Лучшие практики

  1. Минимизация тест-кейсов:
    Используйте cargo fuzz cmin для уменьшения размера краш-образцов.
  2. Покрытие кода:
    Включите сбор метрик покрытия:
  1. Обработка паник:
    Добавьте panic = "abort" в Cargo.toml, чтобы фаззер фиксировал паники.

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

Фаззинг может быть использован как для защиты, так и для атак. Правила:

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

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

  1. Настройте фаззинг для собственной функции, обрабатывающей бинарные данные.
  2. Сравните скорость cargo-fuzz и afl.rs на одном и том же коде.
  3. Используйте afl.rs в persistent mode для ускорения тестирования.

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

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

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

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