
Обнаружение реверс-шеллов с помощью машинного обучения
Dmitrijs Trizna · Luca Demetrio · Battista Biggio · Fabio Roli
Linux-оболочки living-off-the-land (LOTL) обратного подключения используют легитимные бинарники (bash, python, nc, …) для установления скрытых исходящих соединений, что делает сигнатурное обнаружение ненадёжным против новых вариантов и попыток обхода. QuasarNix решает две открытые проблемы в этой области:
Фреймворк синтезирует обучающий корпус из 1 миллиона команд на основе 34 шаблонов обратных оболочек и оценивает 14 архитектур моделей при рабочей точке FPR = 10⁻⁶ — что отражает реальные ограничения по усталости от срабатываний в SIEM.
Производительность на отложенном тестовом наборе среди базовых эвристик и архитектур QuasarNix. TPR указан как среднее ± стандартное отклонение по десяти независимым запускам обучения при FPR = 10⁻⁶. Жирным выделен лучший результат; звёздочка (*) отмечает модели, обсуждаемые в статье.
Вывод: GBDT достигает 60% TPR при FPR = 10⁻⁶ — в 18 раз выше, чем сигнатуры (3.37%) — при обучении за 14 секунд на стандартном оборудовании.
В таблице ниже перечислены техники shell-escape в Linux из арсенала атакующего. Третий столбец указывает, сохраняется ли техника после нормализации телеметрии ядра auditd — только четыре жирных элемента дают отдельную запись EXECVE и образуют реальную поверхность атаки.
Только 4 из 15 техник сохраняются после нормализации на уровне ядра и используются в качестве пространства состязательных атак.
Оцениваются три семейства атак — инъекция легитимного содержимого, возмущения shell-escape и гибрид обоих:
Помимо уклонения на этапе вывода, мы оцениваем атаки на этапе обучения:
Загрязнение переворотом меток (0–20% меток обучения перевёрнуто): модели деградируют плавно; GBDT проявляет внутреннюю устойчивость за счёт ансамблевого голосования, оставаясь работоспособным при высоких долях загрязнения.
Атака бэкдор (0.01–1% доли отравления, триггеры из 2–10 токенов): короткие триггеры (2–4 токена) не могут надёжно установить бэкдор из-за их распространённости в легитимном трафике. Оптимальная установка бэкдора требует триггеров из 6–10 токенов при доле отравления ≥0.03%.
Вывод: Атаки отравления требуют существенной, статистически обнаруживаемой инъекции данных для успеха. Механизм ансамбля GBDT обеспечивает внутреннюю устойчивость без затрат на состязательное обучение.
После публикации этой работы Google представил концептуально схожую производственную систему на CAMLIS 2025 (arXiv:2512.08802): двухэтапный конвейер YARA + ML, развёрнутый на десятках тысяч систем, обрабатывающий до 250 миллиардов событий в день. Эта система независимо подтверждает гибридную парадигму ML-детекции для SIEM и цикл активного обучения, предложенные здесь, демонстрируя их жизнеспособность в промышленном масштабе.
| Ресурс | Ссылка | Описание |
|---|---|---|
| Набор данных | dtrizna/QuasarNix | 1 003 122 команды · обучение 533k / тест 470k · Apache-2.0 |
| Предобученные модели | dtrizna/QuasarNix | GBDT, Random Forest, MLP, 1D-CNN, … |
from datasets import load_dataset
ds = load_dataset("dtrizna/QuasarNix")
src/
augmentation.py синтез данных на основе правил и генеративных моделей
evasion.py состязательные атаки белого / чёрного ящика
models.py определения моделей (CNN, LSTM, Transformer, XGBoost, …)
preprocessors.py токенизаторы и построители признаков
scoring.py метрики оценки при фиксированном FPR
experiments/
ablation_*.py абляционные исследования (токенизатор, размер словаря, эмбеддинги)
adversarial_*.py конвейеры атак и состязательного обучения
train_release_models.py сквозной скрипт обучения
logs_*/ запуски TensorBoard, CSV-метрики, контрольные точки моделей
data/
signatures/ Sigma-правила, сгенерированные эволюционным поиском
nix_shell/ сырой корпус легитимных команд
powershell/ кроссплатформенные образцы команд
img/ готовые к публикации графики
uv venv # создаёт .venv (добавьте --python 3.11 для конкретного интерпретатора)
source .venv/bin/activate
uv sync # устанавливает зависимости из pyproject.toml
@article{trizna2025quasarnix,
author = {Trizna, Dmitrijs and Demetrio, Luca and Biggio, Battista and Roli, Fabio},
title = {Robust Large-Scale Detection of Living-Off-the-Land Reverse Shells via Data Synthesis},
journal = {ACM Transactions on Privacy and Security},
year = {2025},
doi = {10.1145/3807450},
url = {https://dl.acm.org/doi/10.1145/3807450}
}
| Архитектура | Параметры | TPR @ FPR=10⁻⁶ | F1 | Accuracy | AUC | Обучение |
|---|
| Сигнатуры (Sigma) | 184 | 3.37% | 6.52% | 51.68% | 51.68% | N/A |
| One-Class SVM (на легитимных) | 1K | 0.00% | 82.87% | 79.33% | 79.33% | 10s |
| One-Class SVM (на вредоносных) | 1K | 0.00% | 40.14% | 25.20% | 25.20% | 10s |
| 1D-CNN (без аугментации, несбалансированный) | 1K | 0.00% | 80.29% | 77.91% | 87.44%* | 15m |
| 1D-CNN (без аугментации, сбалансированный) | 1K | 0.06% | 82.38% | 79.33% | 88.12%* | 29m |
| SLP (без аугментации) | 1K | 0.00% | 0.00% | 50.00% | 91.58% | 1h 12m |
| Архитектура | Параметры | TPR @ FPR=10⁻⁶ | F1 | Accuracy | AUC | Обучение |
|---|
| Random Forest | 1K | 42.23 ± 6.27% | 96.07% | 96.21% | 99.84% | 18s |
| GBDT (XGBoost) | 1K | 60.20 ± 8.22% | 89.92% | 90.84% | 99.89% | 14s |
| MLP (без эмбеддингов) | 264K | 54.16 ± 2.14%* | 94.00% | 94.34% | 99.80% | 18m |
| Архитектура | Параметры | TPR @ FPR=10⁻⁶ | F1 | Accuracy | AUC | Обучение |
|---|
| MLP (с эмбеддингами) | 297K | 10.76 ± 17.32% | 67.70% | 75.60% | 89.15% | 18m |
| LSTM | 318K | 21.52 ± 23.66% | 64.16% | 74.05% | 99.75% | 24m |
| 1D-CNN | 301K | 46.42 ± 32.67%* | 85.97% | 88.20% | 99.99% | 29m |
| 1D-CNN + LSTM | 316K | 20.48 ± 22.08% | 58.92% | 71.06% | 98.21% | 29m |
| 1D-CNN + LSTM + Attention | 402K | 17.19 ± 22.59% | 62.53% | 73.08% | 98.46% | 26m |
| Transformer (Mean Pooling) | 335K | 0.00 ± 0.00% | 83.39% | 86.07% | 98.78% | 1h 18m |
| Transformer (CLS Token) | 335K | 0.00 ± 0.00% | 78.55%* | 82.67% | 99.38% | 1h 30m |
| Transformer (Attn. Pooling) | 335K | 0.00 ± 0.00% | 87.82% | 89.41% | 98.85% | 1h 24m |
| Манипуляция | Функциональный пример | Сохраняется auditd |
|---|
' | ba's'h -i | Нет |
" | ba"s"h -i | Нет |
\ | ba\s\h -i | Нет |
$@ | ba$@sh -i | Нет |
[char] | ba[s]h -i | Нет |
{form} | {bash,-i} | Нет |
| IFS-переменная | bash${IFS}-i | Нет |
| Пустая переменная | bas${u}h -i | Нет |
| Фиктивная команда | bas$(u)h -i | Нет |
| Base64 | echo c2ggLWk= | base64 -d | sh | Нет |
| Hex | echo \x73\x68 \x20\x2d\x69 | sh | Нет |
| Манипуляция флагами | bash -x -li | Да |
| Десятичный IP | ping 2130706433 | Да |
| Переименование бинарника | cp bash a; a -i | Да |
| Фиктивный код | mkfifo a; id; cat a | Да |