Rust, Хакинг на Rust

Курс — Хакинг на Rust. #32 Продвинутые темы. Интеграция с другими языками: Пример: ускорение фаззера написанного на Python

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

Фаззинг — ключевой метод в кибербезопасности для обнаружения уязвимостей через подачу случайных данных. Однако Python, несмотря на удобство, страдает от низкой скорости выполнения из-за интерпретации и GIL (Global Interpreter Lock). Например, фаззер, тестирующий функцию обработки бинарных данных, может обрабатывать лишь сотни тестов в секунду, что недостаточно для анализа сложных целей.

Цель:
Использовать Rust для ускорения критичных участков фаззера, сохранив гибкость Python.

Шаг 1: Анализ исходного кода на Python

Предположим, у нас есть простой фаззер, который генерирует случайные байты и проверяет, вызывают ли они краш в функции process_data().

Пример медленного Python-фаззера:

Проблемы:

  • Генерация данных через random.getrandbits медленная.
  • Вызов process_data() в Python-цикле создает накладные расходы.

Шаг 2: Вынос логики в Rust

Создадим Rust-библиотеку для генерации данных и их обработки.

Cargo.toml:

src/lib.rs:

Компиляция:

Шаг 3: Интеграция с Python через ctypes

fuzzer.py:

Результаты:

  • Python-фаззер: ~500 итераций/сек.
  • Rust-фаззер: ~500 000 итераций/сек.
    Ускорение: 1000 раз!

Шаг 4: Улучшение безопасности

Rust предотвращает типичные ошибки C/C++:

  • Переполнение буфера: generate_data() использует безопасные методы копирования.
  • Утечки памяти: Нет ручного управления памятью, так как данные передаются через буфер, управляемый Python.

Обработка ошибок:

Шаг 5: Гибридный подход

Используем Python для управления фаззинг-процессом (логгирование, генерация отчетов), а Rust — для обработки данных.

Пример архитектуры:

  1. Python управляет пулом процессов.
  2. Каждый процесс вызывает Rust-функции для тестирования.
  3. Результаты агрегируются в Python.

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

  • maturin: Сборка Python-модулей с Rust-кодом через pyo3.
  • cffi: Альтернатива ctypes для более сложных сценариев.
  • pytest: Тестирование гибридного кода.

Пример с maturin:

  1. Добавьте в Cargo.toml:

2. Код на Rust:

Установка в Python:

Заключение

Интеграция Rust с Python позволяет сохранить скорость разработки и гибкость скриптового языка, но при этом достичь производительности нативного кода. Для фаззинга это критично: чем больше тестов выполнено за единицу времени, тем выше шанс найти уязвимость. Даже базовая оптимизация через FFI дает тысячи процентов прироста, а использование pyo3 упрощает поддержку кода.

Советы:

  • Начните с профилирования Python-кода, чтобы найти «узкие места».
  • Используйте unsafe в Rust только при крайней необходимости.
  • Автоматизируйте сборку через setuptools или maturin.
Хакинг на языке программирования Rust

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

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