Rust, Хакинг на Rust

Курс — Хакинг на Rust. #6 Система владения (Ownership). Правила владения и заимствования

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

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

  • Инструменты, защищенные от классических эксплойтов.
  • Возможность анализировать чужой код на предмет ошибок владения.
  • Контроль над ресурсами, сравнимый с C, но без рисков.

2.1 Правила владения: три кита безопасности

  1. Каждое значение имеет владельца.

2. Одновременно может быть только один владелец.

3. Когда владелец покидает область видимости, значение уничтожается.

Зачем хакеру :

  • В C/C++ аналогичный код мог бы привести к двойному освобождению памяти или утечке .
  • В Rust компилятор предотвращает это, анализируя поток владения.

2.2 Заимствование: ссылки и их ограничения

Чтобы избежать передачи владения каждый раз, используются ссылки (&T — неизменяемые, &mut T — изменяемые).

Правила заимствования :

  • Много неизменяемых ссылок или одна изменяемая.

Ссылки не могут переживать данные.

Пример из хакинга:
Парсинг сетевого пакета:

2.3 Владение и функции

Передача аргументов в функции перемещает или заимствует данные:

Чтобы вернуть владение, используйте кортежи:

Совет для хакеров :
Если вам нужно временно изменить данные, используйте &mut, но помните:

2.4 Срезы: безопасный доступ к данным

Срезы (&[T]) позволяют ссылаться на часть коллекции без копирования:

Защита от переполнения :
Компилятор проверяет границы срезов, предотвращая выход за пределы массива.

2.5 Владение и структуры

Структуры могут владеть данными или заимствовать их:

Важно для хакеров :

  • Владение гарантирует, что данные структуры не будут удалены до ее разрушения.
  • Используйте Box, Rc или Arc, если нужно разделять владение.

2.6 Как владение предотвращает уязвимости

  • Use-after-free :
    В C:

В Rust:

Data races:
В многопоточном коде Rust запрещает:

  • Две изменяемых ссылки на одни данные.
  • Одновременный доступ на чтение и запись.

Пример:

2.7 Владение в низкоуровневом коде: unsafe

Для работы с памятью напрямую используется unsafe:

Но даже в unsafe :

  • Нельзя нарушить правила владения (например, создать висячую ссылку).
  • Компилятор проверяет базовые инварианты.

Совет : Используйте unsafe только для коротких блоков, оберните их в безопасные абстракции.

2.8 Практическое задание: анализ уязвимости

Представьте код на C:

В Rust аналогичный код просто не скомпилируется:

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

  • Защиту от уязвимостей памяти.
  • Контроль над ресурсами, сравнимый с C.
  • Инструменты для анализа чужого кода.

В следующих главах мы увидим, как владение работает в связке с unsafe, сетевыми операциями и эксплойтами. А пока — попробуйте написать функцию, которая принимает срез байтов и возвращает его подмножество, не нарушая правила владения.

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

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

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