Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
rex — Rex — это безопасный и удобный фреймворк для расширения ядра, который позволяет загружать и выполнять программы расширения ядра на Rust вместо eBPF. | Kitploit
Инструменты/GitHubGitHub/rex-rs/rex
Безопасность встроенных системДинамический анализ (песочница)Виртуализация для безопасности
GitHubrex-rs/rex

rex

Rex — это безопасный и удобный фреймворк для расширения ядра, который позволяет загружать и выполнять программы расширения ядра на Rust вместо eBPF.

Репозиторий
5542810 дней назадПроверено Kitploit

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
root@kitploit:~
 ____  _______  __  _____      _                 _
|  _ \| ____\ \/ / | ____|_  _| |_ ___ _ __  ___(_) ___  _ __  ___
| |_) |  _|  \  /  |  _| \ \/ / __/ _ \ '_ \/ __| |/ _ \| '_ \/ __|
|  _ <| |___ /  \  | |___ >  <| ||  __/ | | \__ \ | (_) | | | \__ \
|_| \_\_____/_/\_\ |_____/_/\_\\__\___|_| |_|___/_|\___/|_| |_|___/

Расширения ядра Rex

CI Gentoo

Оглавление

  • Что такое Rex
  • Пример программы
  • Сборка и запуск
  • Документация
  • Почему Rex
  • Лицензия

Что такое Rex

Rex — это безопасный и удобный фреймворк для расширений ядра, который позволяет загружать и выполнять программы расширений ядра на Rust вместо eBPF. В отличие от фреймворков на основе eBPF, таких как Aya, программы Rex не проходят через внутриядерный верификатор. Вместо этого они реализуются в безопасном подмножестве Rust, для которого компилятор Rust выполняет необходимые проверки безопасности и генерирует нативный код напрямую. Такой подход избавляет от чрезмерно строгих требований верификации (например, ограничений на сложность программ) и связанных с ними запутанных ошибок верификатора, а также потенциально предоставляет лучшие возможности для оптимизации в бэкенде нативного компилятора (т. е. LLVM), чем подход «бэкенд eBPF + JIT в ядре».

В настоящее время Rex поддерживает следующие возможности:

  • 5 типов программ eBPF: kprobe, perf_event, tracepoint, xdp и tc.
  • вызов хелпер-функций eBPF, обычно используемых этими программами
  • взаимодействие с картами eBPF
  • управление ресурсами ядра, доступными программам, в стиле RAII
  • очистку и внутриядерную обработку исключений при паниках Rust-рантайма с трассировкой стека вызовов
  • стек ядра (только когда CFG не может быть вычислен статически) и гарантию завершения работы от тонкого внутриядерного рантайма
  • привязки и абстракции типов данных ядра, обычно необходимых программам eBPF

Пример программы

Следующий пример реализует программу kprobe, которая прикрепляется к выбранному системному вызову и внедряет ошибку (заданную через errno) в системный вызов процесса (заданного через pid). Полный пример, включая программу-загрузчик, можно найти в samples/error_injector.

root@kitploit:~
#![no_std]
#![no_main]

use rex::kprobe::kprobe;
use rex::map::RexHashMap;
use rex::pt_regs::PtRegs;
use rex::rex_kprobe;
use rex::rex_map;
use rex::Result;

#[allow(non_upper_case_globals)]
#[rex_map]
static pid_to_errno: RexHashMap<i32, u64> = RexHashMap::new(1, 0);

#[rex_kprobe]
pub fn err_injector(obj: &kprobe, ctx: &mut PtRegs) -> Result {
    obj.bpf_get_current_task()
        .map(|t| t.get_pid())
        .and_then(|p| obj.bpf_map_lookup_elem(&pid_to_errno, &p).cloned())
        .map(|e| obj.bpf_override_return(ctx, e))
        .ok_or(0)
}

Другие примеры программ можно найти в samples.

Сборка и запуск

Подробное руководство можно найти здесь.

Документация

Дополнительные проектные документы можно найти в docs.

Почему Rex

Существующий механизм расширений eBPF полагается на внутриядерный верификатор eBPF для обеспечения гарантий безопасности. К сожалению, это приводит к проблемам удобства использования, когда безопасные программы отклоняются верификатором, в том числе (но не ограничиваясь):

  • программы могут превышать внутренние ограничения сложности статической верификации
  • компиляторы могут не генерировать код, удобный для верификатора
  • одну и ту же логику, возможно, придётся реализовывать определённым образом, чтобы удовлетворить верификатор

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

Мы демонстрируем это на реализации BPF Memcached Cache (BMC) — современной программы-расширения для ускорения Memcached. Будучи сложной eBPF-программой, BMC вынуждена разделяться на несколько компонентов, связанных BPF-хвостовыми вызовами, и использовать неудобные реализации циклов/ветвлений в угоду верификатору, что совершенно не требуется в её реализации на Rex.

Например, покажем код логики инвалидации кэша BPF-BMC, который ищет команду SET в полезной нагрузке пакета:

root@kitploit:~
// Searches for SET command in payload
for (unsigned int off = 0;
     off < BMC_MAX_PACKET_LENGTH &&  payload + off + 1 <= data_end;
     off++) {
    if (set_found == 0 && payload[off] == 's' &&
        payload + off + 3 <= data_end && payload[off + 1] == 'e' &&
        payload[off + 2] == 't') {
            off += 3;
            set_found = 1;
    }
    ...
}

Этот код не только вводит дополнительное ограничение в цикле (off < BMC_MAX_PACKET_LENGTH) исключительно для прохождения верификатора, но и использует повторяющийся шаблонный код для проверки границ пакета (data_end) и громоздкую логику поиска строки "set" в пакете.

Ни одно из этих обременений не требуется благодаря мощи безопасного Rust в Rex, у которого нет ограничений по сложности и который предоставляет больше свободы в реализации:

root@kitploit:~
let set_iter = payload.windows(4).enumerate().filter_map(|(i, v)| {
    if v == b"set " {
      Some(i)
    } else {
      None
    }
});

Полную реализацию BMC на Rex можно найти в samples/bmc.

Лицензия

Rex распространяется под лицензией GPLv2. Подмодули (Linux, Rust, LLVM) в этом репозитории распространяются на своих собственных условиях. Пожалуйста, обратитесь к соответствующим файлам лицензий за подробностями. Кроме того, бенчмарк memcached распространяется под лицензией MIT.

Доклады

  • Open Source Summit North America 2025: https://youtu.be/4r7ECxEaGqM
  • USENIX ATC 2025: https://youtu.be/phJ-fb5lEA8
  • Linux Plumbers Conference 2025: https://youtu.be/ivcLS4LFfKE
Скачать инструмент