Архитектура 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):
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), содержащий юридическую метку авторизованного аудита:
5. Netlink NL80211: Прямое управление интерфейсом¶
Переключение физических каналов, регулировка мощности передатчика (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-сокеты ядра для жесткого перезапуска сетевого интерфейса.