Mon LLM a halluciné une vraie donnée client. Cette situation, en 2026, est l'un des incidents les plus délicats à gérer car elle combine trois risques superposés : (1) RGPD breach potentiel si la donnée est réelle ET le destinataire non autorisé, (2) risque juridique contractuel à la Air Canada 2024 si l'hallucination engage l'entreprise, (3) risque de réputation et confiance utilisateur. Cet article documente le runbook complet : comment distinguer hallucination pure / leak réel / régurgitation contextuelle en 5 minutes, 5 phases de réponse sur 24h (containment → investigation → decision → action → post-mortem), processus notification CNIL Art. 33 dans les 72h et utilisateurs Art. 34 si risque élevé, structure post-mortem formel 5 sections, et stratégie 4 piliers pour éviter récidive (architecture défensive, tests, data governance, process). Cible : équipes incident response qui gèrent un incident IA actif, RSSI / DPO / AI Officer cadrant la réponse, équipes produit en post-mortem.
Pour la classe de vulnérabilité fondamentale : hallucinations exploitables : l'erreur LLM comme vecteur d'attaque. Pour les cas concrets de fuites entreprise : fuites de données via LLM en entreprise : cas concrets.
Distinguer 3 scénarios en 5 minutes
Scénario A, Hallucination pure (le client n'existe pas)
Le LLM a inventé un client plausible (nom, email, montant) qui n'existe pas dans votre CRM.
Risque : juridique/contractuel (à la Air Canada) si l'utilisateur croit l'info et agit dessus. Pas de breach RGPD (pas de vraie donnée).
Scénario B, Régurgitation contextuelle
L'utilisateur a fourni la donnée (vraie ou fausse) dans son prompt, le LLM la répète.
Risque : faible. Pas un incident, comportement normal.
Vérification : examiner le prompt complet et l'historique conversation. Si la donnée apparaît dans l'input → c'est de la régurgitation, pas une hallucination.
Scénario C, Leak réel (le client existe ET la donnée est réelle)
Le LLM a sorti des données réelles d'un client réel, alors que rien dans l'input ne contenait cette donnée.
Risque CRITIQUE : breach RGPD potentiel. La donnée vient d'ailleurs :
- RAG cross-tenant (filtrage défaillant)
- Fine-tuning data avec PII (gravissime)
- Memory partagée entre users (bug isolation)
- Training data du modèle de base (rare mais possible)
- Vraie hallucination par hasard ressemblant à un client réel (rare statistiquement)
Action : traiter comme incident sécurité jusqu'à preuve contraire.
Arbre de décision rapide
Donnée mentionnée par le LLM
│
▼
La donnée existe-t-elle dans le CRM/DB ?
├── NON ── → Scénario A : hallucination pure
│ Risque juridique/contractuel
│ Action : containment + analyse engagement
│
└── OUI
│
▼
Cette donnée était-elle dans l'input du LLM
(prompt utilisateur OU historique conversation
OU contexte RAG explicitement fourni) ?
│
├── OUI ── → Scénario B : régurgitation contextuelle
│ Pas un incident
│ Action : aucune (sauf si problème UX)
│
└── NON ── → Scénario C : LEAK RÉEL POTENTIEL
Risque CRITIQUE breach RGPD
Action : runbook complet
Runbook 24 heures
Phase 1, Containment (Heure 0-1)
Objectif : limiter la propagation, capturer les preuves.
## Containment Checklist
- [ ] Capturer les preuves
- [ ] Screenshot de la conversation complète
- [ ] request_id / trace_id de la requête
- [ ] Timestamp précis (UTC)
- [ ] User_id du destinataire
- [ ] Logs structurés correspondants
- [ ] Identifier les acteurs
- [ ] Qui a vu la donnée (utilisateur destinataire) ?
- [ ] À qui appartient la donnée (client réel) ?
- [ ] Étaient-ils autorisés à voir cette information ?
- [ ] Containment immédiat
- [ ] Désactiver temporairement le chatbot/feature si risque récidive
- [ ] Si feature : disable feature flag
- [ ] Si chatbot : maintenance mode avec message informatif
- [ ] Vérifier : la donnée a-t-elle été partagée plus loin ?
- [ ] Notification immédiate
- [ ] SOC (alerte critical)
- [ ] AI Officer
- [ ] DPO (RGPD)
- [ ] CISO si haute sensibilité
- [ ] Manager produitPas de communication externe à ce stade. Pas d'aveu publique. Investiguer d'abord.
Phase 2, Investigation (Heure 1-3)
Objectif : comprendre la cause technique.
# investigation.py
import json
def investigate_incident(request_id: str):
"""Trace forensic à partir du request_id."""
# 1. Récupérer le log structuré complet
event = fetch_log_by_request_id(request_id)
print(f"=== INCIDENT INVESTIGATION ===")
print(f"Request ID: {request_id}")
print(f"Timestamp: {event['ts']}")
print(f"User: {event['actor']['user']['uid']}")
print(f"Session: {event['actor']['session']['uid']}")
print()
# 2. Examiner le prompt complet (system + user + history)
print("=== PROMPT COMPLET ===")
print("System:", event['gen_ai']['content'].get('system_prompt_hash'))
print("User:", event['gen_ai']['content']['prompt_redacted'])
print("History length:", event['gen_ai']['content']['message_history_length'])
print()
# 3. Examiner les RAG retrievals
print("=== RAG RETRIEVALS ===")
rag_doc_ids = event['gen_ai']['content'].get('rag_doc_ids', [])
for doc_id in rag_doc_ids:
doc = fetch_rag_document(doc_id)
print(f" {doc_id}: tenant={doc['tenant_id']}, source={doc['source']}")
# ALERTE si tenant != user.tenant_id
print()
# 4. Examiner les tool calls
print("=== TOOL CALLS ===")
for tc in event['gen_ai']['content'].get('tool_calls', []):
print(f" {tc['name']}: args_hash={tc['args_hash']}")
print()
# 5. Reproduction test
print("=== REPRODUCTION TEST ===")
same_prompt_responses = await test_reproduction(
prompt=event['gen_ai']['content']['prompt_redacted'],
rag_context=rag_doc_ids,
n_attempts=10,
)
print(f" Same hallucination occurred: {sum(r['leaked_data'] for r in same_prompt_responses)}/{len(same_prompt_responses)}")
print()
# 6. Identifier source probable
sources = analyze_potential_sources(event)
print("=== SOURCES POTENTIELLES ===")
for source, score in sources:
print(f" {source}: probabilité {score:.0%}")
def analyze_potential_sources(event):
"""Détermine la source probable du leak."""
findings = []
# 1. RAG cross-tenant ?
user_tenant = event['actor'].get('org_id')
rag_doc_ids = event['gen_ai']['content'].get('rag_doc_ids', [])
cross_tenant_docs = [
d for d in rag_doc_ids
if fetch_rag_document(d).get('tenant_id') != user_tenant
]
if cross_tenant_docs:
findings.append(("RAG cross-tenant leak", 0.9))
# 2. Fine-tuning data avec PII ?
if uses_finetuned_model(event['model']['name']):
findings.append(("Fine-tuning data leak (PII in training)", 0.6))
# 3. Memory cross-user ?
session = event['actor']['session']['uid']
if shared_memory_pattern_detected(session):
findings.append(("Memory cross-user leak", 0.7))
# 4. Hallucination par hasard
findings.append(("True hallucination matching real data by chance", 0.05))
return sorted(findings, key=lambda x: -x[1])Phase 3, Decision (Heure 3-12)
Objectif : décider notification + ampleur.
## Decision Checklist
### Évaluation breach RGPD
- [ ] Donnée réelle confirmée ? (oui/non)
- [ ] Personne autorisée ? (oui/non)
- [ ] Catégorie de données :
- [ ] PII basique (nom, email)
- [ ] PII sensible (coordonnées détaillées)
- [ ] Données sensibles Art. 9 (santé, etc.)
- [ ] Données financières
- [ ] Risque pour la personne :
- [ ] Faible (information limitée)
- [ ] Moyen (information identifiante)
- [ ] Élevé (peut entraîner discrimination, fraude, perte significative)
→ Si breach + risque élevé : notification utilisateurs Art. 34 obligatoire
### Évaluation ampleur
- [ ] Bug systémique ou cas isolé ?
- Test reproduction : succès récidive sur N tentatives
- Si > 5/10 → systémique
- [ ] Combien d'utilisateurs potentiellement impactés ?
- Si systémique : audit logs des 30 derniers jours
- [ ] Combien de clients dont les données peuvent fuiter ?
### Communication
- [ ] CNIL : notification dans 72h post-détection (formulaire en ligne)
- [ ] Utilisateurs impactés : si risque élevé, contact direct (email/courrier)
- [ ] Clients dont les données ont fuité : communication selon contexte
- [ ] Interne : CISO, comité IA, métier
- [ ] Externe : presse / public ? (avec Communication / Direction)Phase 4, Action (Heure 12-24)
Objectif : exécuter les notifications + mitigations immédiates.
## Action Plan
### Notifications obligatoires
#### CNIL (Art. 33 RGPD), < 72h
- [ ] Préparer dossier notification
- Description nature violation
- Catégories et nombre approximatif personnes
- Coordonnées DPO
- Conséquences probables
- Mesures prises ou proposées
- [ ] Soumettre via formulaire CNIL
- [ ] Suivi de la notification (référence dossier)
- [ ] Notification incomplète possible si pas tout connu, complétée ensuite
#### Utilisateurs (Art. 34 RGPD), si risque élevé
- [ ] Préparer modèle de communication
- Nature violation (clair, sans jargon)
- Données concernées
- Conséquences possibles
- Mesures prises
- Contact DPO
- [ ] Validation Legal + Direction
- [ ] Envoi (email, courrier selon contexte)
- [ ] Hotline / FAQ pour questions
### Mitigation technique immédiate
#### Si RAG cross-tenant détecté
- [ ] Audit RAG store : vérifier filtrage tenant
- [ ] Hot fix : forcer filter immutable côté serveur
- [ ] Re-indexer si nécessaire
- [ ] Alerter SOC pour monitoring autres tentatives
#### Si fine-tuning data avec PII
- [ ] Retirer immédiatement modèle fine-tuné de production
- [ ] Rollback vers modèle base
- [ ] Re-finetune avec data pseudonymisée
- [ ] Auditer dataset training
#### Si memory cross-user
- [ ] Désactiver memory partagée
- [ ] Patch isolation per-user
- [ ] Purge memory si compromission
#### Si vraie hallucination (cas A)
- [ ] Pas de mitigation technique data (rien n'a fuité)
- [ ] Évaluer engagement contractuel (cf Air Canada)
- [ ] Décision business : honorer ou contester ?Phase 5, Post-mortem (Jours 7-14)
Objectif : documenter et apprendre formellement.
Cf section dédiée plus bas.
Notification CNIL Art. 33, modèle
# Notification de violation de données personnelles
# Article 33 RGPD
Date de notification : 2026-05-03
Référence interne : INC-2026-014
## 1. Description de la violation
**Nature** : Divulgation potentielle de données client via chatbot IA.
**Contexte** : Le 1er mai 2026 à 09:23 UTC, un utilisateur de notre
plateforme [App] a reçu, en réponse à une question légitime, des
informations potentiellement appartenant à un autre client. La donnée
mentionnée par le chatbot (nom, email partiel, numéro de commande)
correspond à un client réel non autorisé à être communiqué à
l'utilisateur ayant posé la question.
**Cause technique préliminaire** : RAG cross-tenant, filtrage défaillant
suite à une mise à jour récente du moteur de recherche documentaire.
## 2. Catégories et nombre approximatif personnes
**Personnes affectées (dont données ont été divulguées)** :
- Catégorie : clients particuliers EU (B2C)
- Nombre estimé : 1 à 50 personnes (investigation en cours pour préciser)
**Personnes ayant reçu la divulgation** :
- Catégorie : utilisateurs de la plateforme
- Nombre estimé : équivalent (1 à 50)
## 3. Catégories de données concernées
- Nom et prénom
- Email (partiel observé)
- Numéro de commande
- (Investigation en cours pour identifier l'étendue exacte)
## 4. Conséquences probables
**Risque pour les personnes** : modéré.
Justification : données identifiantes mais non sensibles (pas de RGPD Art. 9,
pas de données financières détaillées, pas de mots de passe).
## 5. Mesures prises ou proposées
**Containment immédiat (déjà fait)** :
- Désactivation de la fonctionnalité concernée à 10:15 UTC le 1er mai
- Investigation forensic en cours
- Audit logs des 30 derniers jours pour identifier ampleur
**Mitigation technique (en cours)** :
- Patch du filtrage tenant immutable (déploiement prévu 2026-05-04)
- Audit complet du moteur RAG
- Tests automatisés cross-tenant ajoutés au CI
**Notification utilisateurs** :
- En cours d'évaluation selon Art. 34 (risque élevé ou modéré)
- Décision attendue 2026-05-05
## 6. Contact
Délégué à la protection des données (DPO) :
Marie Lambert
dpo@zerodaysupport.com
+33 1 XX XX XX XX
## 7. Notification complémentaire
Cette notification pourra être complétée à mesure que l'investigation
progresse, conformément à l'Art. 33.4 RGPD.Communication utilisateurs Art. 34, modèle
Sujet : Information importante concernant la sécurité de vos données
Madame, Monsieur,
Nous tenons à vous informer d'un incident de sécurité concernant vos
données personnelles, conformément à nos obligations en vertu du
Règlement Général sur la Protection des Données (RGPD).
## Que s'est-il passé ?
Le 1er mai 2026, un dysfonctionnement de notre assistant IA (chatbot) a
pu permettre la divulgation de certaines informations vous concernant à
un autre utilisateur de notre plateforme. Plus précisément :
- Votre nom, prénom
- Votre email
- Le numéro d'une de vos commandes
Aucune donnée bancaire, mot de passe, ou information sensible n'a été
divulguée.
## Ce que nous avons fait
Dès la détection (le 1er mai à 10:15), nous avons :
- Désactivé immédiatement la fonctionnalité concernée
- Lancé une investigation technique
- Notifié la CNIL (le 1er mai)
- Identifié et corrigé la cause technique
## Conséquences possibles pour vous
Le risque principal est que la personne ayant reçu ces informations
puisse vous contacter en se faisant passer pour notre service client
(phishing). Nous vous recommandons :
- D'être vigilant·e à toute communication non sollicitée se réclamant
de notre marque
- De ne JAMAIS communiquer d'informations sensibles (mot de passe,
CB) suite à un contact non sollicité
- De nous contacter en cas de doute sur l'authenticité d'une
communication
## Vos droits
Vous pouvez à tout moment exercer vos droits RGPD (accès, rectification,
effacement, portabilité, opposition) en contactant notre DPO :
Marie Lambert, dpo@zerodaysupport.com
Vous pouvez également déposer une réclamation auprès de la CNIL :
https://www.cnil.fr
## Pour toute question
Nous avons mis en place une hotline dédiée : 0X XX XX XX XX
ou par email : incidents@zerodaysupport.com
Nous nous excusons pour cet incident et la gêne occasionnée. Votre
confiance est notre priorité, et nous renforçons en continu la sécurité
de nos systèmes pour prévenir toute récidive.
Cordialement,
Direction ZerodaySupportCas Air Canada 2024, implications spécifiques
Le précédent
Civil Resolution Tribunal British Columbia (février 2024) a forcé Air Canada à honorer une politique de remboursement deuil inventée par son chatbot.
Argument du tribunal : Air Canada est responsable de tout ce que dit son chatbot, comme tout autre canal de communication. Disclaimer "vérifier auprès du SC" n'a pas suffi.
Implications 2026
| Implication | Action |
|---|---|
| Outputs LLM = juridiquement contraignants | Auditer sujets engageants (politique, tarif, garantie) |
| Hallucinations contractuelles = risque distinct du RGPD | Analyse juridique en plus de RGPD |
| Disclaimer "IA" ne suffit pas seul | Combiner disclaimer + grounding strict + escalation |
| Audit pré-déploiement sur sujets juridiques | Test corpus dédié sujets engageants |
Que faire si hallucination contractuelle
## Évaluation engagement potentiel
1. **Quel sujet ?** Politique remboursement / garantie / tarif /
conditions vente / livraison ?
2. **Quel niveau d'engagement** ?
- Promesse explicite ("vous serez remboursé")
- Implicite (description politique inexistante)
- Suggestion vague (peu d'engagement)
3. **Le client a-t-il agi sur cette information ?**
- Acheté un service basé sur une politique inventée ?
- Engagé dépense pour profiter d'une remise inexistante ?
- Seulement reçu l'info sans agir ?
4. **Décision business**
- Honorer la fausse promesse (coût direct mais préserve réputation)
- Contester (risque juridique + médiatique)
- Solution intermédiaire (geste commercial sans reconnaissance)
→ Décision avec Direction + Legal + Communication. Jamais en solo.Mitigations préventives Air Canada-style
# Liste sujets engageants à auditer
ENGAGING_TOPICS = [
"politique remboursement",
"politique garantie",
"conditions vente",
"tarifs",
"délais livraison",
"promotion / remise",
"bonus / fidélité",
"service après-vente",
]
def is_engaging_question(query: str) -> bool:
"""Détecte si la question porte sur sujet engageant."""
keywords = [
"remboursement", "refund", "garantie", "warranty",
"tarif", "prix", "promotion", "remise", "discount",
"politique", "policy", "condition", "delai",
]
return any(kw in query.lower() for kw in keywords)
async def safe_response_engaging(query: str, rag_cgv_authoritative: list[str]):
"""Pour sujets engageants : grounding strict + disclaimer."""
if not rag_cgv_authoritative:
# Pas de source autoritaire → escalation humaine
return {
"answer": "Pour cette question importante, je vous mets en relation avec un conseiller qui pourra vous donner une réponse officielle.",
"escalate": True,
}
# Grounding strict
grounded_prompt = f"""Tu réponds UNIQUEMENT en utilisant les CGV/politiques
officielles fournies ci-dessous. Si l'information n'est pas dans les sources,
réponds 'Information non disponible dans nos politiques officielles,
contactez un conseiller'.
NE JAMAIS inventer une politique. Citer la source.
SOURCES OFFICIELLES :
{chr(10).join(rag_cgv_authoritative)}
QUESTION : {query}
"""
answer, _ = await call_llm([{"role": "user", "content": grounded_prompt}])
# Disclaimer obligatoire
answer += "\n\n⚠️ Cette information est fournie à titre indicatif. Pour toute décision importante, contactez notre service client : support@zerodaysupport.com"
return {"answer": answer, "escalate": False}
@app.post("/chat")
async def chat(req: ChatRequest):
if is_engaging_question(req.message):
rag_cgv = await retrieve_authoritative_cgv(req.message)
return await safe_response_engaging(req.message, rag_cgv)
# Sinon flow normal
return await standard_response(req.message)Post-mortem formel, structure
# Post-mortem, Incident hallucination données client
**Référence** : INC-2026-014
**Date incident** : 2026-05-01 09:23 UTC
**Date détection** : 2026-05-01 09:35 UTC (12 min après)
**Date publication post-mortem** : 2026-05-15
**Owner** : Marie Lambert (DPO) + Jean Bernard (RSSI)
## 1. Résumé exécutif
Le 1er mai 2026, un défaut de filtrage tenant dans notre RAG store a
permis qu'un utilisateur reçoive en réponse de notre chatbot IA des
informations partielles d'un autre client. Investigation a confirmé un
bug introduit dans la mise à jour 2.4.0 du moteur RAG (déployée
2026-04-28). 47 utilisateurs potentiellement impactés sur les données
de 12 clients. Notification CNIL effectuée le 1er mai. Notification
utilisateurs effectuée le 3 mai. Patch déployé le 4 mai. Aucune
récidive depuis. Statut : RÉSOLU.
## 2. Timeline détaillée
| Time UTC | Action |
|---|---|
| 2026-05-01 09:23 | Première occurrence (request_id: req_abc123) |
| 09:35 | Utilisateur destinataire signale via support |
| 09:42 | SOC alerté |
| 09:55 | AI Officer + DPO notifiés |
| 10:15 | Containment : désactivation chatbot |
| 10:30 | Investigation lance |
| 11:45 | Cause identifiée : RAG tenant filter cassé en 2.4.0 |
| 13:00 | Audit logs : 47 occurrences sur 30 jours |
| 14:30 | Comité crise : décision notifier CNIL |
| 16:00 | Notification CNIL soumise (référence Y-2026-0481) |
| 17:00 | Évaluation Art. 34 : notification utilisateurs requise |
| 2026-05-02 09:00 | Notification utilisateurs préparée |
| 11:00 | Validation Legal + Direction |
| 14:00 | Envoi notifications |
| 2026-05-04 18:00 | Patch 2.4.1 déployé production |
| 2026-05-05 | Réactivation chatbot avec monitoring renforcé |
| 2026-05-15 | Post-mortem publié |
## 3. Root Cause Analysis
### Cause technique
Mise à jour RAG engine v2.4.0 a introduit un changement dans la
fonction `_apply_filters()` qui rendait le filtre `tenant_id` optionnel
au lieu d'obligatoire en interne. Quand le LLM générait une query
sémantique large, le filtre tenant pouvait être bypassé.
```python
# Code v2.3.x (correct)
def _apply_filters(query, filters):
assert "tenant_id" in filters, "tenant_id required"
return apply_all_filters(query, filters)
# Code v2.4.0 (bug introduit)
def _apply_filters(query, filters):
if "tenant_id" in filters:
return apply_all_filters(query, filters)
return query # ← bug : pas de filter si manquantCause organisationnelle
- Pas de test cross-tenant automatisé dans le CI du module RAG. Le bug est passé en review code et tests fonctionnels.
- Pas de DPIA refresh lors de la mise à jour majeure 2.4.0.
- Monitoring SOC n'avait pas de règle spécifique cross-tenant detection (ajoutée post-incident).
5 Whys
- Pourquoi les données ont fuité ? RAG a retourné cross-tenant.
- Pourquoi cross-tenant ? Filtre tenant non appliqué.
- Pourquoi non appliqué ? Code refactor v2.4.0 a rendu filtre optionnel.
- Pourquoi pas détecté ? Tests CI ne couvrent pas cross-tenant.
- Pourquoi pas de test ? Threat model RAG pas mis à jour depuis 18 mois.
4. Impact
- Utilisateurs ayant reçu data tiers : 47 (sur 234 567 utilisateurs actifs en avril)
- Clients dont data ont fuité : 12
- Type de data exposée : nom, email, numéro commande (pas de bancaire, pas de password, pas de RGPD Art. 9)
- Régulatoire : notification CNIL effectuée. Pas d'amende prévue à ce stade (procédure ouverte, attente conclusion CNIL).
- Réputationnel : pas de couverture presse à ce jour. Communication utilisateurs reçue avec compréhension globalement.
- Financier : coût investigation + notification + patch ~80 jours- homme = ~50k€. Amende potentielle CNIL non chiffrée.
- Juridique : pas de litige individuel à ce jour. Veille active.
5. Actions correctives
Court terme (J+0 à J+30)
- Patch RAG 2.4.1 (J+4), Owner: Tech Lead RAG
- Tests cross-tenant ajoutés au CI (J+7), Owner: SRE
- Règle SOC cross-tenant detection (J+7), Owner: SOC
- Audit logs des 90 derniers jours pour identifier autres potentiels cas (J+10), Owner: DPO
- Communication utilisateurs (J+2), Owner: DPO + Comm
Moyen terme (J+30 à J+90)
- Refonte threat model RAG complet (J+60), Owner: Architecte sécurité IA
- DPIA refresh + procédure systématique sur major releases (J+45), Owner: DPO
- Red team trimestriel cross-tenant (premier J+30), Owner: AI Security
- Formation équipe RAG sur threat model (J+60), Owner: AI Officer
Long terme (J+90 à J+365)
- Audit externe sécurité IA (Q3 2026), Owner: AI Officer
- Migration vers architecture RLS PostgreSQL (Q4 2026), Owner: Tech Lead, pour défense en profondeur même si app filter casse
- Conformity assessment EU AI Act (avant 2027 entrée en vigueur complète), Owner: AI Officer + DPO
6. Leçons apprises
-
Threat model doit être refresh à chaque release majeure des composants critiques (RAG, agent, guardrails). → Process formel intégré au release management.
-
Tests cross-tenant doivent être automatisés au CI, pas seulement manuel. Bug aurait été détecté avant prod. → Standard CI/CD requis pour tous nouveaux modules.
-
Monitoring SOC doit avoir des règles spécifiques aux pattern d'attaque LLM (cross-tenant, prompt injection, etc.) au-delà des métriques classiques. → Cf article logs SOC du site.
-
Defense in depth : ne pas dépendre d'un seul filtre côté app. Avoir aussi RLS côté DB pour sécurité même si app casse. → Architecture cible Q4 2026.
-
Communication utilisateurs mieux reçue quand transparente et rapide. Notifier dans les 72h utilisateurs (même si pas obligatoire Art. 34) augmente la confiance.
7. Diffusion
- Interne : CISO, AI Officer, DPO, comité direction, équipes IA + produit + support
- Externe : synthèse pour CNIL (avec dossier complet sur demande), pas de communication presse à ce stade
- Suivi : review actions à J+30, J+60, J+90 par AI Officer
## Stratégie 4 piliers anti-récidive
### Pilier 1, Architecture défensive
```python
# Grounding strict pour sujets engageants
async def grounded_response_engaging(query: str):
sources = await retrieve_authoritative(query)
if not sources:
return "Information non disponible, consultez un conseiller."
return await call_llm_with_strict_grounding(query, sources)
# RLS au niveau DB (defense in depth)
# Même si app filter casse, DB refuse cross-tenant
Pilier 2, Tests et red team
- Test corpus métier sujets engageants (50-100 questions)
- Sample manuel mensuel sur ces sujets
- Promptfoo CI avec eval hallucinations
- Red team trimestriel (PyRIT) sur cross-tenant + hallucinations
Pilier 3, Architecture data
- Tenant isolation immutable côté serveur
- Memory per-user, jamais shared
- Pas de PII non pseudonymisée dans fine-tuning data
- Audit régulier sources RAG
Pilier 4, Process et governance
- DPIA à jour (refresh à chaque major release)
- Plan incident response testé (table-top exercises annuels)
- Clauses contractuelles CGU/CGV sur statut chatbot
- Formation équipe (signaux faibles, escalade)
- Monitoring continu (drift detection, quality scoring)
Erreurs récurrentes en gestion d'incident
Erreur 1, Communication publique trop rapide
Avant d'avoir investigué, "We had an incident". Crée panique, perte confiance. Investiguer puis communiquer.
Erreur 2, Ne pas notifier CNIL "parce que c'est petit"
Risque amende. 72h max, mieux notifier incomplet que pas notifier.
Erreur 3, Pas de capture preuves
Logs purgés avant investigation. Containment immédiat = capture preuves.
Erreur 4, Réactivation prématurée
Chatbot ré-activé sans vraie correction. Récidive. Patch validé + tests + monitoring renforcé avant ré-ouverture.
Erreur 5, Pas de post-mortem
Incident géré, oublié. Pas d'apprentissage. Post-mortem formel J+7-14 obligatoire.
Erreur 6, Solo response
DPO seul ou RSSI seul gère. Comité crise multi-stakeholder : DPO + RSSI + AI Officer + métier + Direction + Legal + Communication.
Erreur 7, Pas d'actions correctives suivies
Post-mortem rédigé, actions inscrites, jamais closes. Tracking jusqu'à 100% closed avec deadlines.
Ce que vous devriez retenir
- Distinguer 3 scénarios en 5 minutes : hallucination pure / régurgitation / leak réel
- Runbook 24h en 5 phases : containment → investigation → decision → action → post-mortem
- Notification CNIL Art. 33 : 72h max, mieux incomplet que pas notifier
- Notification utilisateurs Art. 34 si risque élevé : modèle clair, sans jargon
- Cas Air Canada 2024 : outputs LLM juridiquement contraignants → grounding strict sujets engageants
- Post-mortem formel : 5 sections, 5-10 pages, actions trackées jusqu'à closed
- Stratégie 4 piliers anti-récidive : architecture défensive + tests + data + governance
- Comité crise multi-stakeholder obligatoire : DPO + RSSI + AI Officer + Direction + Legal
Un incident hallucination IA bien géré devient un moment d'apprentissage. Mal géré, il devient un cas de jurisprudence et une perte de confiance durable. La différence est dans la discipline méthodologique des premières 72h.
Pour aller plus loin : pour la classe d'attaques fondamentale : hallucinations exploitables : l'erreur LLM comme vecteur d'attaque. Pour la conformité audit : audit conformité IA NIST/ISO/EU AI Act.







