Перейти к содержанию

Архитектура SORA: Системный дизайн и IPC

Архитектурный принцип SORA строится вокруг симбиоза двух миров: 1. Rust Core (Высокоскоростное ядро): Берет на себя все критичные к задержкам низкоуровневые операции (захват пакетов, их безаллокационный парсинг, генерация и инжекция пакетов с точностью до микросекунд, работа с системными вызовами Linux и сокетами AF_PACKET). 2. Python Layer (Высокоуровневый контроллер): Обеспечивает асинхронный конечный автомат (FSM), структурированное логирование (structlog), шифрованную базу метаданных (SQLCipher), интеграцию с плагинами и интерфейсы пользователя (CLI/TUI).


🗺️ Общая схема взаимодействия

Взаимодействие между управляющим слоем (Python) и сетевым ядром (Rust) реализовано через PyO3 FFI границу на базе неблокирующих потокобезопасных каналов обмена сообщениями.

graph TD
    classDef python fill:#3572A5,stroke:#333,stroke-width:1px,color:#fff;
    classDef rust fill:#DEA584,stroke:#333,stroke-width:1px,color:#000;
    classDef ipc fill:#9A63B4,stroke:#333,stroke-width:1px,color:#fff;

    subgraph Python_Layer [Python Layer (TUI, CLI, Controller)]
        FSM[controller/fsm.py: AttackController]:::python
        DB[storage/database.py: EncryptedMetadataDB]:::python
    end

    subgraph PyO3_IPC_Layer [PyO3 IPC Layer (core/src/lib.rs)]
        IPC_Cmd[OnceLock SoraCommand]:::ipc
        Event_Recv[EventReceiver: poll_high / poll_normal]:::ipc
    end

    subgraph Rust_Core_Layer [Rust Core Layer (sora_core.so)]
        PacketEngine[packet_engine/engine.rs]:::rust
        Parsers[parsers.rs: parse_frame]:::rust
        WIDS[attack_state.rs: WidsDetector]:::rust
        TxQueue[tx_dispatch.rs: TxQueue]:::rust
        TxDispatch[tx_dispatch.rs: TxDispatch Thread]:::rust
        Stealth[stealth.rs: StealthEngine]:::rust
        PcapWriter[pcap/writer.rs: PcapWriter]:::rust
        NL80211[nl80211/neli_backend.rs]:::rust
    end

    FSM -- "cmd_*" --> IPC_Cmd
    IPC_Cmd -- "command_loop (try_recv)" --> PacketEngine
    PacketEngine -- "SoraEvent" --> Event_Recv
    Event_Recv -- "poll_*" --> FSM

    PacketEngine -- "read raw bytes" --> Parsers
    Parsers --> WIDS
    PacketEngine -- "write" --> PcapWriter
    PcapWriter --> Disk[(pcapng File)]

    PacketEngine -- "set_channel" --> NL80211

    TxQueue --> TxDispatch
    TxDispatch -- "throttle & spoof" --> Stealth
    Stealth -- "send / sendmmsg" --> Physical[Wireless Card - Monitor Mode]:::rust

⚡ Детальный разбор компонентов Rust Core

1. PacketEngine: Ядро захвата и реального времени

Запуск сетевого движка происходит в выделенном системном потоке реального времени sora-packet-engine. * Безопасный сброс привилегий (Privilege Dropping): Сокет AF_PACKET открывается до сброса привилегий (когда процесс еще имеет CAP_NET_RAW / root). Сразу после этого PacketEngine вызывает libc::setgid(65534) и libc::setuid(65534) (пользователь nobody). Если сбросить привилегии не удалось, ядро совершает panic!, предотвращая работу с некорректным уровнем доступа. * Планировщик реального времени: Для минимизации задержек и исключения пропусков кадров на высокой скорости, поток ядра пытается переключиться в режим жесткого реального времени SCHED_FIFO с приоритетом 50 (pthread_setschedparam).


2. Безаллокационный парсинг пакетов (Zero-Allocation Parsing)

В высоконагруженном hot-path захвата беспроводного эфира стандартная аллокация памяти в куче (heap) — главный враг производительности, приводящий к задержкам и потере пакетов. В SORA разбор кадров parse_frame реализован без единой аллокации: * Функции парсинга принимают срезы байт &[u8]. * Возвращаемое перечисление ParsedFrame<'a> содержит только ссылки на исходный кольцевой буфер захвата с временем жизни 'a. * Парсер Radiotap-заголовка: Динамически считывает смещения полей present_flags. Поскольку биты присутствия могут идти каскадом, парсер циклически пропускает расширенные слова и выравнивает указатель смещения по границам типов данных (2, 4 или 8 байт) без полного копирования структуры.


3. StealthEngine: Обход систем обнаружения WIDS

Любая стандартная атака (например, Deauth Flood) генерирует характерный поток кадров с равными интервалами времени, который мгновенно обнаруживается корпоративными WIDS (Cisco, Aruba). StealthEngine решает эту проблему на уровне инжекции пакетов:

Для строгого ограничения пикового количества пакетов в секунду (PPS) используется структура ведра токенов: $\(\text{tokens} = \min(\text{capacity}, \text{tokens} + \Delta t \times \text{rate\_pps})\)$ Если при отправке пакета \(\text{tokens} \ge 1.0\), токен списывается (\(\text{tokens} = \text{tokens} - 1.0\)), и пакет отправляется. В противном случае пакет немедленно отбрасывается.

В профиле скрытности High между отправками пакетов вставляется случайная микросекундная задержка (от 50 до 500 мкс). Чтобы системные вызовы генерации случайных чисел не нагружали процессор, используется сверхбыстрый генератор XORShift-64 (FastRng), работающий исключительно в пространстве пользователя (Zero-Syscall PRNG):

fn next_u64(&mut self) -> u64 {
    self.state ^= self.state << 13;
    self.state ^= self.state >> 7;
    self.state ^= self.state << 17;
    self.state
}

StealthEngine на лету подменяет первые 3 байта MAC-адреса передатчика (OUI) в инжектируемых кадрах, выбирая их из пула 20 наиболее популярных производителей оборудования (ASUS, TP-Link, Google). Это маскирует атакующую станцию под обычное бытовое устройство.


4. PCAPNG Writer: Асинхронный дисковый писатель

Запись дампов трафика изолирована в потоке sora-pcap-writer с использованием неблокирующей кольцевой очереди ArrayQueue<PcapFrame> емкостью 4096 пакетов. * Защита от переполнения: Если скорость диска падает, PacketEngine не блокирует сетевой поток, а атомарно инкрементирует счетчик overflow_count для отправки уведомления в TUI/GUI, плавно пропуская избыточные пакеты. * Graceful Shutdown: При остановке сессии писатель гарантированно вычитывает все оставшиеся пакеты из очереди на диск перед закрытием дескриптора файла. * ** RFC 7797 Legal Annotation:** В заголовке Section Header Block (SHB) каждого файла генерируется защищенный блок опций (Option Type opt_comment), содержащий юридическую метку авторизованного аудита:

Authorized Audit Only — SORA v4.4


Переключение физических каналов, регулировка мощности передатчика (tx_power) и управление режимом монитора происходят без медленных вызовов системных утилит (iw, iwconfig, ifconfig) через форматирование сырых Netlink сообщений: * Используется библиотека neli для прямого общения со стеком ядра cfg80211 через сокет NETLINK_GENERIC. * Смена каналов происходит отправкой команды NL80211_CMD_SET_CHANNEL с частотой, рассчитанной по формуле: $\(Freq = 2407 + (Channel \times 5) \text{ МГц (для 2.4 ГГц)}\)$ * В случае программного зависания Netlink, SORA использует резервный слой, отправляя ioctl-запросы флагов SIOCGIFFLAGS / SIOCSIFFLAGS через DGRAM-сокеты ядра для жесткого перезапуска сетевого интерфейса.