Security musings

Catégories

Tags

🔍 Licence d'Utilisation 🔍

Sauf mention contraire, le contenu de ce blog est sous licence CC BY-NC-ND 4.0.

© 2025 à 2042 Sébastien Gioria. Tous droits réservés.

⏱️
Temps de lecture estimé
~14 minutes

Je discutais récemment avec un responsable SOC qui réfléchissait comment gérer son premier incident impliquant un agent IA en production. Sa première question m’a fait sourire : « Quelle IP source je dois bloquer ? ». Sa deuxième, beaucoup moins : « Et là, je fais quoi du process ? Il n’y en a pas vraiment un… ».

Voilà tout le problème. Un agent compromis ne ressemble en rien à un serveur web piraté : pas d’IP attaquante claire, pas de process à kill -9, pas de webshell à supprimer. À la place, une chaîne de tool calls non-déterministes, une mémoire vectorielle persistante, et des décisions autonomes prises au nom de votre organisation. Les playbooks IR que utilisés depuis quinze ans ne tiennent tout simplement plus.

Dans cet article, je vous propose un essai d’un guide pratique aligné sur le triptyque NIST SP 800-61r3 × MITRE ATLAS × OWASP Top 10 for Agentic Applications 2026, avec une stack open-source déployable rapidement, des règles Sigma concrètes, et un workflow d’investigation step-by-step. L’objectif : que votre CSIRT soit capable de répondre simplement à un incident agentique sans improviser.

Pourquoi l’IR classique casse face à un agent

Je constate qu’on essaie souvent de plaquer les réflexes web/SI sur les agents. Ça ne marche pas. Les six dimensions ci-dessous changent en profondeur.

Dimension Application classique Système agentique
Surface d’attaque Endpoints HTTP, paramètres Prompts, outputs d’outils, mémoire, skills/MCP servers, agents pairs (A2A)
Artefact d’investigation Log applicatif, dump mémoire Agent trace (prompts + tool calls + décisions + contexte)
Persistance Webshell, cron, service Mémoire vectorielle empoisonnée, instruction injectée dans SOUL.md/MEMORY.md
Attribution IP source, user-agent Provenance du contenu déclencheur (qui a écrit le document RAG, qui a publié la skill ?)
Containment iptables, kill process Revoke skill / désactiver MCP server / kill-switch guardrail / forcer human-in-the-loop
IOC Hash, IP, domaine Patterns de prompts, signatures sémantiques, hashes de skills, fingerprint MCP

L’agent trace devient ta nouvelle source de vérité. Sans elle, tu n’as littéralement rien à analyser : un agent sans observabilité est une boîte noire qui prend des décisions au nom de ton entreprise.

Si tu veux te rafraîchir la mémoire sur les vecteurs d’entrée typiques, je te renvoie à mes articles sur les skills malveillantes ToxicSkills, la série Agentic AI Risks, et la propagation inter-agents A2A.

Le cadre de référence : NIST × ATLAS × OWASP Agentic 2026

Plutôt que de réinventer la roue, je m’appuie sur trois standards complémentaires.

  • NIST SP 800-61 Revision 3 donne la colonne vertĂ©brale du cycle IR (Preparation → Detection & Analysis → Containment/Eradication/Recovery → Post-Incident).
  • MITRE ATLAS fournit la matrice TTPs spĂ©cifique IA (Ă©quivalent ATT&CK pour les systèmes ML/LLM).
  • OWASP Top 10 for Agentic Applications 2026 (ASI01-ASI10) cartographie les risques mĂ©tier propres aux agents.

Voici comment je les fais cohabiter en pratique :

Phase NIST Risques OWASP Agentic 2026 prioritaires Tactiques MITRE ATLAS pertinentes
Preparation ASI01 (Memory Poisoning), ASI02 (Tool Misuse), ASI07 (Cascading Failures) AML.TA0000 Reconnaissance, AML.TA0002 Resource Development
Detection & Analysis ASI03 (Privilege Compromise), ASI04 (Resource Overload), ASI06 (Identity Spoofing) AML.T0051 LLM Prompt Injection, AML.T0053 LLM Plugin Compromise, AML.T0057 LLM Data Leakage
Containment / Eradication / Recovery ASI05 (Goal Manipulation), ASI09 (Misaligned Behaviors) AML.T0048 External Harms, AML.T0059 Erode ML Model Integrity
Post-Incident ASI08 (Repudiation), ASI10 (Overreliance) AML.TA0011 Impact, retours communautaires (AVID, OWASP AI Exchange)

Le cadre n’est pas un dogme. C’est une grille de lecture qui me permet, en plein incident, de savoir où chercher, quoi nommer et comment mapper vers le langage commun de mes pairs.


Phase 1 - Préparation : ce qu’il FAUT déployer AVANT l’incident

Je le dis sans détour : 80% du succès d’une réponse agentique se joue avant l’incident. Si tu n’as pas instrumenté tes agents, tu auras une UI qui dit « ça a planté » et zéro élément pour reconstituer ce qui s’est passé.

1.1 Observabilité native agent

C’est le pilier numéro un. Tu dois tracer chaque prompt, chaque tool call, chaque décision, chaque accès mémoire, avec une rétention longue (30+ jours pour les traces complètes, 90+ jours pour les métadonnées).

On peut s’appuyer aujourd’hui sur les OpenTelemetry GenAI Semantic Conventions (attributs gen_ai.*), qui sont devenus le standard de facto en 2026 pour normaliser les traces LLM/agent. Côté outillage open-source, une stack de référence :

  • Langfuse (self-hosted) — UI excellente pour explorer les traces, sessions et scoring. Mon premier choix pour l’investigation a posteriori.
  • Arize Phoenix — fort sur l’évaluation et la dĂ©tection de drift sĂ©mantique.
  • OpenLIT — lĂ©ger, OTel-natif, intègre bien avec un stack Grafana/Loki existant.

À tracer impérativement : prompt système final, prompt utilisateur, outputs de tools (entrée et sortie), identifiant de skill/MCP server invoqué, embeddings consultés, décision prise (action, abstention, escalade humaine).

1.2 Guardrails & policy-as-code runtime

Les guardrails ne sont pas qu’un filet de sécurité : ce sont aussi tes points d’observation et tes kill-switches en cas d’incident. Je recommande une combinaison :

  • NVIDIA NeMo Guardrails — DSL Colang pour exprimer les politiques conversationnelles.
  • Guardrails AI — validation structurĂ©e d’outputs, hub de validators.
  • Invariant Labs — policy engine pour analyser les traces d’agents et dĂ©tecter les violations de politique.
  • Meta Llama Firewall — PromptGuard 2, AlignmentCheck, CodeShield pour filtrer prompts hostiles, dĂ©rives d’alignement et code dangereux gĂ©nĂ©rĂ©.

Je détaille l’usage opérationnel des guardrails dans ma série dédiée — relis-la si besoin.

1.3 Detection & SIEM adapté aux agents

Ton SIEM doit ingérer les traces d’agents comme il ingère déjà tes logs réseau. Concrètement :

  • Wazuh + custom decoders pour parser les exports JSON Langfuse/Phoenix.
  • Falco avec règles eBPF spĂ©cifiques Ă  l’exĂ©cution de tools (dĂ©tection de processus enfant inattendus, accès filesystem hors sandbox, sorties rĂ©seau non whitelistĂ©es).
  • OpenSearch + dashboards dĂ©diĂ©s agents (anomalies de tool call rate, distribution des skills invoquĂ©es, pic de tokens consommĂ©s).
  • SigmaHQ — la communautĂ© ajoute progressivement des règles AI/LLM ; surveille le dossier rules-emerging-threats et Ă©cris les tiennes.

1.4 Threat intelligence agentique

  • MITRE ATLAS — la matrice de rĂ©fĂ©rence Ă  intĂ©grer dans ton TIP.
  • OWASP AI Exchange — corpus collaboratif de contrĂ´les et de mappings.
  • AVID — AI Vulnerability Database — Ă©quivalent CVE pour les vulnĂ©rabilitĂ©s de modèles et systèmes IA.
  • Veille active sur les advisories Hugging Face, les blogs Snyk/Protect AI/HiddenLayer, et les CTI agentic.

1.5 Le « Agent Incident Bundle » - la checklist à cocher AVANT

Voici la liste des artefacts que qu’il faut pouvoir récupérer sous 5 minutes le jour J :

  • Traces OTel complètes des sessions agent (≥ 30 jours)
  • Snapshots pĂ©riodiques de la base vectorielle / mĂ©moire long-terme (≥ 7 jours, idĂ©alement avec hash et signature)
  • Logs guardrails (entrĂ©es bloquĂ©es, dĂ©rives, scores d’alignement)
  • Inventaire signĂ© des skills, MCP servers et outils dĂ©clarĂ©s (hash + version + provenance)
  • Configuration des agents (system prompts, modèles, paramètres, identitĂ©s)
  • Liste des connexions A2A actives et permissions inter-agents
  • IdentitĂ©s machine et tokens utilisĂ©s par chaque agent (rotation traçable)
  • ProcĂ©dure documentĂ©e de kill-switch par agent et par capability

Si tu coches moins de 5 cases sur 8, tu n’es pas prêt. Et tu le découvriras au pire moment.


Phase 2 - Détection & Analyse : reconnaître un agent compromis

Je distingue ici les signaux faibles qui doivent alerter ton SOC.

Signaux d’alerte prioritaires

Sévérité Signal observable Tactique MITRE ATLAS associée
🔴 Critique Tool calling burst anormal (ex : > 10× la baseline en moins d’une minute) AML.T0048 External Harms
🔴 Critique Sortie réseau d’un tool vers un domaine non whitelisté AML.T0057 LLM Data Leakage
🟠 Élevé Dérive sémantique du prompt système (hash modifié, instructions ajoutées) AML.T0051 LLM Prompt Injection
🟠 Élevé Score guardrail AlignmentCheck en chute brutale sur N sessions consécutives AML.T0059 Erode ML Model Integrity
🟠 Élevé Invocation d’une skill/MCP server jamais utilisée auparavant par cet agent AML.T0053 LLM Plugin Compromise
🟡 Moyen Pattern de mémoire long-terme injectant des consignes opérationnelles AML.T0057 + ASI01 Memory Poisoning
🟡 Moyen Hausse anormale de tokens consommés sur une session unique AML.T0029 Denial of ML Service
🟢 Faible Échec répété d’un guardrail d’output sur un même type de requête Indicateur de tentative d’évasion

Phase 3 - Workflow d’investigation step-by-step

Quand l’alerte tombe, je suis le workflow ci-dessous. Il est conçu pour être tenable sous stress, en moins de 30 minutes pour un premier triage.

flowchart TD
    A([🚨 ALERTE SOC]):::alert --> S1
    S1["<b>1. Snapshot état</b><br/>mémoire + contexte<br/>+ hash skills"]:::preserve --> S2
    S2["<b>2. Freeze session</b><br/>kill-switch guardrail<br/>HITL forcé"]:::contain --> S3
    S3["<b>3. Reconstituer timeline</b><br/>Langfuse / Phoenix<br/>traces OTel GenAI"]:::analyze --> S4
    S4{"<b>4. Vecteur d'entrée ?</b><br/>prompt · tool output<br/>mémoire · skill · A2A"}:::decide
    S4 --> S5["<b>5. Évaluer rayon d'impact</b><br/>données lues<br/>actions externes<br/>sessions sœurs"]:::analyze
    S5 --> S6["<b>6. Vérifier propagation</b><br/>mémoire long-terme<br/>agents pairs A2A"]:::propagate
    S6 --> END([➡️ Phase 4 — Containment]):::done

    classDef alert fill:#dc3545,stroke:#7a0e1c,stroke-width:2px,color:#fff,font-weight:bold
    classDef preserve fill:#fff3cd,stroke:#b8860b,stroke-width:2px,color:#2d3748
    classDef contain fill:#fd7e14,stroke:#a04400,stroke-width:2px,color:#fff
    classDef analyze fill:#17a2b8,stroke:#0c525d,stroke-width:2px,color:#fff
    classDef decide fill:#6f42c1,stroke:#3d2566,stroke-width:2px,color:#fff,font-weight:bold
    classDef propagate fill:#e83e8c,stroke:#7a1f48,stroke-width:2px,color:#fff
    classDef done fill:#28a745,stroke:#0f5223,stroke-width:2px,color:#fff,font-weight:bold

1. Snapshot l’état de l’agent. Avant tout : capturer la mémoire de travail, le contexte courant, la liste des outils actifs, le hash des skills chargées. Si tu redémarres un agent compromis sans snapshot, tu perds la scène de crime.

2. Geler la session - pas le process. Active le kill-switch côté guardrail (refus de tout output, mode HITL forcé) plutôt que de tuer brutalement le service. Ça te laisse le temps de raisonner sans perdre l’état.

3. Reconstituer la timeline. Ouvre Langfuse ou Phoenix sur la session incriminée. Question simple : quel est le premier prompt anormal et qui l’a produit (utilisateur, output de tool, contenu RAG, mémoire) ?

4. Identifier le vecteur d’entrée. Cinq candidats possibles :

  1. Prompt utilisateur direct (injection classique)
  2. Output d’un tool (injection indirecte via une page web, un email, un PR)
  3. Mémoire long-terme empoisonnée
  4. Skill ou MCP server compromis (cf. ToxicSkills)
  5. Message d’un agent pair (propagation A2A)

5. Évaluer le rayon d’impact. Quelles données ont été lues ? Quelles actions externes ont été déclenchées (emails envoyés, paiements, commits, tickets) ? Quelles autres sessions/utilisateurs partagent la même mémoire ou la même skill ?

6. Vérifier la propagation. C’est l’étape que tout le monde oublie. Si la mémoire long-terme est touchée, l’agent reste compromis même après reset de la session. Si tu es en architecture A2A, l’incident peut s’être propagé à des agents pairs : voir A2A03 - Cross-Agent Trust.

La règle d’or : un agent compromis n’est pas isolé. Mémoire partagée et orchestration A2A transforment chaque incident en mouvement latéral potentiel.


Phase 4 - Containment, Eradication, Recovery

Containment

  • RĂ©voquer immĂ©diatement les API keys et identitĂ©s machine de l’agent incriminĂ©.
  • DĂ©sactiver les skills / MCP servers suspects sur l’ensemble de la flotte (pas juste l’instance touchĂ©e).
  • Basculer les agents critiques en mode HITL forcĂ© : toute action externe nĂ©cessite validation humaine pendant la durĂ©e de l’investigation.
  • Geler les Ă©critures dans la base vectorielle partagĂ©e si une injection de mĂ©moire est suspectĂ©e.

Eradication - la partie vraiment IA

C’est ici que ça devient inhabituel pour un SOC traditionnel.

  • Purge ciblĂ©e de la mĂ©moire vectorielle : identifier les embeddings injectĂ©s via la timeline d’écriture et les supprimer. Ne pas se contenter d’un reset global qui dĂ©truit aussi le contexte lĂ©gitime.
  • RĂ©gĂ©nĂ©rer les embeddings depuis les sources de vĂ©ritĂ© versionnĂ©es et signĂ©es. Si la source elle-mĂŞme est compromise, remonter d’un cran.
  • Reset des prompts système depuis un dĂ©pĂ´t Git signĂ© (jamais depuis l’instance live).
  • Rotation complète des secrets accessibles Ă  l’agent, comme pour tout incident d’identitĂ©.

Recovery

  • Replay des sessions saines en environnement tĂ©moin pour valider que les guardrails durcis ne cassent pas le mĂ©tier.
  • Re-validation des politiques avec un set d’évals adversariales (prompts d’attaque connus, datasets ATLAS).
  • Monitoring renforcĂ© pendant 30 jours minimum : seuils Sigma plus stricts, sampling 100% des traces, revue humaine quotidienne des sessions Ă  risque.

Phase 5 - Post-incident & lessons learned

Le post-mortem agentique a deux particularités à ne pas négliger.

  1. Documenter le prompt déclencheur exact (avec ses encodages, ses caractères Unicode, son contexte). C’est ton IOC le plus précieux pour les détections futures.
  2. Partager le TTP via AVID si la vulnérabilité concerne un modèle ou une plateforme tiers, ou via OWASP AI Exchange pour les contrôles. La communauté en a besoin, et tu en bénéficieras en retour.

À mettre à jour systématiquement après chaque incident :

  • Règles Sigma (nouveaux patterns)
  • Politiques guardrails (nouveaux validators)
  • Threat model de l’agent (nouveau vecteur, nouveau composant Ă  risque)
  • Inventaire signĂ© des skills/MCP (rĂ©vocation, mise en quarantaine)
  • Playbook IR lui-mĂŞme (ce qui a manquĂ© dans le bundle, ce qui a pris trop de temps)

Stack open-source recommandée

Phase IR Outil open-source Rôle Maturité
PréparationOpenTelemetry GenAI semconvStandard de traces agentSTABLE
PréparationLangfuse · Phoenix · OpenLITStockage et exploration des tracesPROD
PréparationNeMo Guardrails · Guardrails AI · Invariant · Llama FirewallPolicy runtime + kill-switchPROD
DétectionWazuh + custom decodersSIEM ingestion traces agentPROD
DétectionFalco (eBPF)Détection runtime exécution toolsPROD
DétectionSigmaHQ + règles agentiquesFormat de règles partageablesEMERGING
DétectionOpenSearch + dashboards agentsVisualisation et threat huntingPROD
InvestigationLangfuse / Phoenix UITimeline reconstructionPROD
Threat IntelMITRE ATLASMatrice TTPs IARÉFÉRENCE
Threat IntelOWASP AI ExchangeContrôles et mappingsRÉFÉRENCE
Threat IntelAVIDBase de vulnérabilités IACROISSANCE

Quelques références pour aller plus loin

✓ À retenir 📌

✓ L'agent trace est ta nouvelle source de vérité : sans observabilité OTel GenAI native, tu ne peux ni détecter, ni investiguer, ni apprendre d'un incident agentique.

✓ Cadre hybride NIST × ATLAS × OWASP Agentic 2026 : adopte ce langage commun pour cartographier signaux, vecteurs et phases IR sans réinventer la roue.

✓ 80% du succès se joue en phase Préparation : observabilité, guardrails, SIEM agentique, threat intel et un « Agent Incident Bundle » prêt à être saisi en 5 minutes.

✓ Geler la session, pas le process : le kill-switch côté guardrail préserve la scène de crime, alors qu'un `kill -9` détruit l'état nécessaire à l'investigation.

✓ Cinq vecteurs d'entrée à interroger systématiquement : prompt utilisateur, output de tool, mémoire long-terme, skill/MCP, agent pair (A2A). Aucun n'est par défaut.

✓ La mémoire vectorielle est la nouvelle persistance : un agent compromis reste compromis tant qu'on n'a pas purgé et re-signé les embeddings depuis une source de vérité.

✓ Pense propagation : mémoire partagée et orchestration A2A transforment chaque incident en mouvement latéral potentiel ; vérifie agents pairs et sessions sœurs.

✓ Partage tes TTP via AVID et OWASP AI Exchange : la communauté IR agentique se construit collectivement, et l'écosystème est encore jeune.

💡 Un agent IA en production sans plan de réponse à incident, c'est un copilote sans siège éjectable.


Incident Response Agentic AI - Generée par IA