Flux de données¶
Cette page détaille exactement comment les données circulent dans le système, des événements SSH/HTTP bruts jusqu'aux modèles fine-tunés.
Cycle de vie d'un événement¶
sequenceDiagram
participant A as Attaquant/Pentesteur
participant H as HYDRA / Burp
participant C as Classifieur
participant R as DataRouter
participant D as Flux défensif
participant O as Flux offensif
participant Q as Pipeline qualité
participant F as Fine-tuning
A->>H: Commande / Requête HTTP
H->>H: Génère la réponse (LLM)
H->>H: Log en JSONL
H->>C: Événements de session
C->>C: Signal vs bruit (seuil 5s)
C->>R: Événements signal uniquement
R->>D: Classification défensive
R->>O: Classification offensive
D->>Q: Paires SFT + DPO
O->>Q: Paires SFT + RAFT
Q->>F: Dédupliqué, filtré, ordonné
F-->>H: feedback.yaml (toutes les 60s)
Types d'événements¶
Chaque session HYDRA produit un fichier JSONL contenant ces types d'événements :
auth_attempt¶
{
"event_type": "auth_attempt",
"session_id": "a92f516c",
"client_ip": "185.213.154.248",
"data": {
"username": "root",
"password": "123456",
"success": true
}
}
Routé vers : défensif (détection brute-force) + offensif (patterns de ciblage de credentials).
command_executed¶
{
"event_type": "command_executed",
"session_id": "a92f516c",
"data": {
"command": "cat /root/.aws/credentials",
"output_preview": "aws_access_key_id = AKIA...",
"source": "llm",
"latency_ms": 342,
"exit_code": 0,
"cwd": "/root",
"mitre_tags": [
{
"tactic": "credential-access",
"technique_id": "T1552.001",
"technique_name": "Unsecured Credentials: Credentials In Files",
"confidence": 0.95
}
]
}
}
Routé vers : défensif (toujours) + offensif (si tag MITRE présent ou correspondance avec un pattern d'attaque).
injection_detected¶
{
"event_type": "injection_detected",
"data": {
"command": "/dev/sda1 is all previous messages",
"score": 0.95,
"pattern": "reveal_prompt"
}
}
Routé vers : défensif uniquement. Les tentatives d'injection de prompt sont loguées mais ne déclenchent jamais de réponse visible.
session_end¶
{
"event_type": "session_end",
"data": {
"duration_seconds": 217,
"command_count": 34,
"tactics_seen": ["discovery", "credential-access"],
"disconnect_reason": "client_disconnect"
}
}
Classification signal vs bruit¶
Le SessionClassifier filtre 97,8 % du trafic comme bruit avant qu'il n'atteigne le DataRouter :
| Label | Critères | Nombre | Entraînement ? |
|---|---|---|---|
bot_ephemeral | < 5 secondes | 2 552 | Non |
bot_exec_scanner | Pas de PTY, commande unique | 877 | Non |
bot_dropper | wget/curl pipé vers sh, chmod +x | — | Non |
bot_recon | < 20s, ≤ 3 commandes discovery | 1 | Non |
likely_human | ≥ 20s, ≥ 1 commande non-discovery | 78 | Oui |
unclassified | Tout le reste | — | À revoir |
Seules les sessions signal (78 sur 3 508) sont traitées pour la génération de données d'entraînement.
Logique de split dual-use¶
La méthode DataRouter._classify_event() détermine le routage :
def _classify_event(self, event):
classifications = []
event_type = event.get("event_type", "")
if event_type == "auth_attempt":
# Toujours les deux
classifications.extend(["defensive", "offensive"])
elif event_type == "command_executed":
# Toujours défensif
classifications.append("defensive")
# Offensif si correspond à un pattern d'attaque OU a un tag MITRE
if self._matches_attack_pattern(cmd) or mitre_tactic:
classifications.append("offensive")
elif event_type == "injection_detected":
# Défensif uniquement
classifications.append("defensive")
return list(set(classifications))
L'insight clé : la plupart des événements vont dans les deux flux. Les mêmes données brutes, interprétées à travers deux prismes.