Rust, Хакинг на Rust

Курс — Хакинг на Rust. #11 Типы данных и структуры: Обработка ошибок: Result и Option

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

В кибербезопасности ошибка — это не просто баг. Это потенциальная уязвимость. Rust заставляет обрабатывать ошибки явно, используя типы Result и Option. Это предотвращает целые классы уязвимостей, включая логические ошибки и утечки информации.

3.1 Result<T, E>: безопасность вместо исключений

В отличие от языков вроде Python или C++, где ошибки обрабатываются через исключения, Rust возвращает Result:

  • Ok(T) — успешный результат.
  • Err(E) — ошибка.

Пример: подключение к сокету

Обработка :

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

  • Невозможно «забыть» обработать ошибку — компилятор выдаст предупреждение.
  • Нет скрытых исключений, которые могут нарушить логику атаки.

3.2 Option<T>: нет null, есть предсказуемость

В Rust нет null. Вместо этого используется Option:

  • Some(T) — значение присутствует.
  • None — значение отсутствует.

Пример: поиск админа в списке пользователей

Почему это важно :

  • Нет риска разыменования null (как в C).
  • Код явно обрабатывает оба варианта.

3.3 Комбинаторы: map, and_then, unwrap_or

Для удобства работы с Result и Option Rust предоставляет комбинаторы:

map — преобразование успешного значения

and_then — цепочка операций

unwrap_or — значение по умолчанию

3.4 Опасные методы: unwrap и expect

  • unwrap() : Возвращает значение из Ok/Some, иначе паникует.
  • expect("msg") : То же, но с сообщением.

Когда использовать :

  • В прототипах или тестах.
  • Когда ошибка теоретически невозможна.

Почему это опасно :

  • Паника может быть использована для DoS-атаки.
  • Всегда обрабатывайте ошибки в боевом коде.

3.5 Пользовательские типы ошибок

Для сложных сценариев определяйте свои типы ошибок:

3.6 Паттерн-матчинг и безопасность

match гарантирует, что все варианты обработаны:

3.7 Практическое задание: парсинг пакета

Задача : Напишите функцию, которая извлекает IP-адрес из бинарных данных.

Решение :

3.8 Как это предотвращает уязвимости

  • Непроверенные ошибки :
    В C:

В Rust:

Логические ошибки :
В Python:

В Rust:

Итог
Result и Option — это не просто типы. Это:

  • Защита от человеческого фактора : компилятор заставляет обрабатывать ошибки.
  • Предсказуемость : нет скрытых null или исключений.
  • Безопасность : ошибки становятся частью контракта функции.

Для хакеров это означает инструменты, которые не ломаются на неожиданных данных, и код, который сложно эксплуатировать из-за отсутствия «дыр». В следующих главах мы увидим, как эти принципы работают в связке с низкоуровневыми операциями и эксплойтами. А пока — попробуйте написать функцию, которая читает конфигурационный файл и возвращает Result<HashMap<String, String>, io::Error>.

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

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

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