Aller au contenu

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.