
Detecção de Reverse Shell com Machine Learning
Dmitrijs Trizna · Luca Demetrio · Battista Biggio · Fabio Roli
Os reverse shells living-off-the-land (LOTL) do Linux abusam de binários legítimos (bash, python, nc, …) para estabelecer conexões de saída furtivas, tornando a detecção baseada em assinaturas não confiável contra novas variantes e tentativas de evasão. O QuasarNix aborda duas lacunas em aberto na área:
O framework sintetiza um corpus de treinamento de 1 milhão de comandos a partir de 34 templates de reverse shell e avalia 14 arquiteturas de modelos em um ponto de operação de FPR = 10⁻⁶ — refletindo as restrições reais de fadiga de alertas em SIEM.
Desempenho no conjunto de teste reservado (held-out) em heurísticas de linha de base e arquiteturas QuasarNix. O TPR é reportado como média ± desvio padrão em dez execuções de treinamento independentes com FPR = 10⁻⁶. O negrito marca o melhor resultado; o asterisco (*) destaca os modelos discutidos no artigo.
| Arquitetura | Params | TPR @ FPR=10⁻⁶ | F1 | Acurácia | AUC | Treinamento |
|---|---|---|---|---|---|---|
| Assinaturas (Sigma) | 184 | 3,37% | 6,52% | 51,68% | 51,68% | N/A |
| One-Class SVM (em legítimos) | 1K | 0,00% | 82,87% | 79,33% | 79,33% | 10s |
| One-Class SVM (em maliciosos) | 1K | 0,00% | 40,14% | 25,20% | 25,20% | 10s |
| 1D-CNN (sem aument., desbalanceado) | 1K | 0,00% | 80,29% | 77,91% | 87,44%* | 15m |
| 1D-CNN (sem aument., balanceado) | 1K | 0,06% | 82,38% | 79,33% | 88,12%* | 29m |
| SLP (sem aument.) | 1K | 0,00% | 0,00% | 50,00% | 91,58% | 1h 12m |
| Arquitetura | Params | TPR @ FPR=10⁻⁶ | F1 | Acurácia | AUC | Treinamento |
|---|---|---|---|---|---|---|
| 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 (Sem Embedding) | 264K | 54,16 ± 2,14%* | 94,00% | 94,34% | 99,80% | 18m |
| Arquitetura | Params | TPR @ FPR=10⁻⁶ | F1 | Acurácia | AUC | Treinamento |
|---|---|---|---|---|---|---|
| MLP (Com Embedding) | 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 |
Destaque: o GBDT atinge 60% de TPR com FPR = 10⁻⁶ — 18× superior ao das assinaturas (3,37%) — treinando em 14 segundos em hardware comum.
A tabela abaixo cataloga técnicas de shell escape do Linux do arsenal do atacante. A terceira coluna indica se a técnica sobrevive à normalização de telemetria do kernel auditd — apenas as quatro entradas em negrito produzem um registro EXECVE distinto e constituem a verdadeira superfície de ataque.
| Manipulação | Exemplo Funcional | Preservado pelo auditd |
|---|---|---|
' | ba's'h -i | Não |
" | ba"s"h -i | Não |
\ | ba\s\h -i | Não |
$@ | ba$@sh -i | Não |
[char] | ba[s]h -i | Não |
{form} | {bash,-i} | Não |
| Variável IFS | bash${IFS}-i | Não |
| Variável vazia | bas${u}h -i | Não |
| Comando falso | bas$(u)h -i | Não |
| Base64 | echo c2ggLWk= | base64 -d | sh | Não |
| Hex | echo \x73\x68 \x20\x2d\x69 | sh | Não |
| Adulteração de flags | bash -x -li | Sim |
| IP decimal | ping 2130706433 | Sim |
| Renomeação de binário | cp bash a; a -i | Sim |
| Código fútil | mkfifo a; id; cat a | Sim |
Apenas 4 de 15 técnicas sobrevivem à normalização em nível de kernel e são usadas como espaço de ataque adversarial.
Três famílias de ataques são avaliadas — injeção de conteúdo benigno, perturbações de shell escape e um híbrido de ambas:
Além da evasão em tempo de inferência, avaliamos ataques em tempo de treinamento:
Poluição por inversão de rótulos (0–20% dos rótulos de treinamento invertidos): os modelos se degradam gradualmente; o GBDT demonstra resistência inerente por meio da votação do ensemble, permanecendo funcional em altas taxas de poluição.
Ataque de backdoor (0,01–1% de taxa de envenenamento, 2–10 gatilhos de tokens): gatilhos curtos (2–4 tokens) não conseguem instalar backdoors confiáveis devido à sua prevalência no tráfego benigno. A instalação ideal de backdoor exige gatilhos de 6–10 tokens com taxa de envenenamento ≥0,03%.
Destaque: Ataques de envenenamento exigem injeção substancial de dados, estatisticamente detectável, para terem sucesso. O mecanismo de ensemble do GBDT oferece robustez inerente sem custo de treinamento adversarial.
Após a publicação deste trabalho, a Google lançou um sistema de produção conceitualmente alinhado na CAMLIS 2025 (arXiv:2512.08802): um pipeline de dois estágios YARA + ML implantado em dezenas de milhares de sistemas, processando até 250 bilhões de eventos por dia. Esse sistema valida de forma independente o paradigma híbrido de ML para detecção em SIEM e o ciclo de feedback de aprendizado ativo proposto aqui, demonstrando sua viabilidade em escala industrial.
| Recurso | Link | Detalhes |
|---|---|---|
| Conjunto de dados | dtrizna/QuasarNix | 1.003.122 comandos · treino 533k / teste 470k · Apache-2.0 |
| Modelos pré-treinados | dtrizna/QuasarNix | GBDT, Random Forest, MLP, 1D-CNN, … |
from datasets import load_dataset
ds = load_dataset("dtrizna/QuasarNix")
src/
augmentation.py rule-based and generative data synthesis
evasion.py white-box / black-box adversarial attacks
models.py model definitions (CNN, LSTM, Transformer, XGBoost, …)
preprocessors.py tokenisers and feature builders
scoring.py evaluation metrics at fixed FPR
experiments/
ablation_*.py ablation studies (tokenizer, vocab size, embedding)
adversarial_*.py attack and adversarial-training pipelines
train_release_models.py end-to-end training script
logs_*/ TensorBoard runs, CSV metrics, model checkpoints
data/
signatures/ Sigma rules generated by evolutionary search
nix_shell/ raw benign command corpus
powershell/ cross-platform command samples
img/ publication-ready plots
uv venv # creates .venv (add --python 3.11 for a specific interpreter)
source .venv/bin/activate
uv sync # installs dependencies from 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}
}