LLM Security

Mon LLM a halluciné une vraie donnée client : que faire

Incident hallucination LLM avec données réelles : runbook complet, RGPD notification, root cause, communication, mitigation. Cas Air Canada 2024 et apprentissages.

Naim Aouaichia
21 min de lecture
  • incident response
  • hallucination
  • RGPD
  • communication crise
  • playbook

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 produit

Pas 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 ZerodaySupport

Cas 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

ImplicationAction
Outputs LLM = juridiquement contraignantsAuditer sujets engageants (politique, tarif, garantie)
Hallucinations contractuelles = risque distinct du RGPDAnalyse juridique en plus de RGPD
Disclaimer "IA" ne suffit pas seulCombiner disclaimer + grounding strict + escalation
Audit pré-déploiement sur sujets juridiquesTest 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 manquant

Cause organisationnelle

  1. Pas de test cross-tenant automatisé dans le CI du module RAG. Le bug est passé en review code et tests fonctionnels.
  2. Pas de DPIA refresh lors de la mise à jour majeure 2.4.0.
  3. Monitoring SOC n'avait pas de règle spécifique cross-tenant detection (ajoutée post-incident).

5 Whys

  1. Pourquoi les données ont fuité ? RAG a retourné cross-tenant.
  2. Pourquoi cross-tenant ? Filtre tenant non appliqué.
  3. Pourquoi non appliqué ? Code refactor v2.4.0 a rendu filtre optionnel.
  4. Pourquoi pas détecté ? Tests CI ne couvrent pas cross-tenant.
  5. 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

  1. Threat model doit être refresh à chaque release majeure des composants critiques (RAG, agent, guardrails). → Process formel intégré au release management.

  2. 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.

  3. 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.

  4. 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.

  5. 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

  1. Distinguer 3 scénarios en 5 minutes : hallucination pure / régurgitation / leak réel
  2. Runbook 24h en 5 phases : containment → investigation → decision → action → post-mortem
  3. Notification CNIL Art. 33 : 72h max, mieux incomplet que pas notifier
  4. Notification utilisateurs Art. 34 si risque élevé : modèle clair, sans jargon
  5. Cas Air Canada 2024 : outputs LLM juridiquement contraignants → grounding strict sujets engageants
  6. Post-mortem formel : 5 sections, 5-10 pages, actions trackées jusqu'à closed
  7. Stratégie 4 piliers anti-récidive : architecture défensive + tests + data + governance
  8. 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.

Questions fréquentes

  • Hallucination ou fuite réelle, comment distinguer dans l'urgence ?
    Trois questions pour distinguer en 5 minutes. **(1) La donnée est-elle réelle ?** Vérifier dans votre CRM / base de données : le client mentionné existe-t-il ? Avec ces caractéristiques exactes ? Si non → hallucination pure (le LLM a inventé un client plausible). Si oui → potentielle fuite réelle. **(2) Cette donnée existait-elle dans l'input du LLM ?** Si l'utilisateur a fourni la donnée (vraie ou fausse) dans son prompt → ce n'est pas une hallucination, c'est une régurgitation contextuelle. Si la donnée n'était PAS dans l'input → hallucination ET la donnée se trouve quelque part ailleurs (training data ? RAG store ? memory ?). **(3) D'où peut-elle venir ?** RAG mal scopé (cross-tenant) > training data fine-tuning avec PII (catastrophique) > memory partagée entre users (bug isolation) > leak via input précédent même session > vraie hallucination par hasard. **Décision rapide** : si donnée réelle ET pas dans input → traiter comme **incident potentiel** (RGPD breach jusqu'à preuve contraire). Notifier équipe sécurité immédiatement. Si donnée hallucinée mais ressemble fortement à un client réel (Air Canada-style) → traiter comme **risque juridique/contractuel** distinct (le client peut exiger l'application de l'info inventée).
  • Quel runbook suivre les premières 24 heures ?
    Découpage en 5 phases. **Heure 0-1 (Containment)** : (a) Capturer les preuves (screenshot, logs request_id, conversation complète, timestamp). (b) Identifier le user impacté (qui a vu cette donnée ?). (c) Désactiver temporairement le chatbot ou la fonctionnalité concernée si risque de récidive massive. (d) Informer SOC + AI Officer + DPO. **Heure 1-3 (Investigation)** : (a) Trace forensic via logs structurés : prompt complet, RAG retrievals, tool calls, system prompt, conversation history. (b) Tester reproduction : même prompt → même hallucination ? Ou variabilité ? (c) Identifier source probable (RAG cross-tenant, fine-tuning data, memory leak, training data). **Heure 3-12 (Decision)** : (a) Évaluer si breach RGPD : data réelle + utilisateur non autorisé exposé = potentiellement oui. (b) Décision communication : utilisateur impacté + client dont les données ont fuité (peut être différent personnes). (c) Estimation ampleur : 1 utilisateur ou bug systémique ? **Heure 12-24 (Action)** : (a) Si breach RGPD confirmé : notification CNIL dans 72h (Art. 33 RGPD), notification clients impactés si risque élevé (Art. 34). (b) Communication interne. (c) Mitigation immédiate (rollback prompt, désactivation feature, RAG re-scoping). (d) Lancer post-mortem formel. **Outils nécessaires** : logs structurés (cf article logs SOC), accès CRM/DB, communication channels (Slack/Teams sec), process notification CNIL (formulaire en ligne).
  • Cas Air Canada 2024 : qu'est-ce que ça change pour mon chatbot ?
    **Précédent jurisprudentiel majeur**. En février 2024, Civil Resolution Tribunal British Columbia a forcé Air Canada à honorer une politique de remboursement deuil **inventée par son chatbot** (le chatbot promettait remboursement après le voyage, alors que la vraie politique exigeait demande avant). Le tribunal a jugé qu'Air Canada est responsable de TOUT ce que dit son chatbot, comme tout autre canal de communication. Disclaimer 'vérifiez auprès du SC' n'a pas suffi. **Implications 2026** : (1) **Outputs LLM = juridiquement contraignants** envers vos clients dans la plupart des juridictions occidentales (extension probable de la jurisprudence Air Canada). (2) **Hallucinations contractuelles** = risque juridique direct, distinct du risque RGPD. Le client peut exiger application de la fausse information. (3) **Disclaimer 'IA' ne suffit pas** légalement à se dégager de responsabilité. (4) **Audit pré-déploiement** sur sujets à enjeu juridique (politique, tarif, garantie, condition vente) devient critique. **Que faire pour mon chatbot** : (a) Identifier les 'sujets à enjeu juridique' où le chatbot peut s'exprimer (souvent : remboursement, garantie, livraison, conditions, prix). (b) Forcer **grounding strict** sur ces sujets avec sources autoritaires (CGV en RAG vérifié). (c) Pour requêtes sensibles : refus systématique + escalation humaine. (d) Audit régulier des outputs sur sujets à risque (sample manuel mensuel + tests automatisés). (e) Documenter en CGU le statut chatbot et limitations (ne dégage pas totalement, mais utile).
  • Comment notifier la CNIL et les utilisateurs si breach RGPD confirmé ?
    Process RGPD spécifique. **CNIL, Art. 33 RGPD** : notification dans les **72 heures** maximum après prise de connaissance de la violation, sauf si risque limité. Format : formulaire en ligne CNIL `notifications.cnil.fr/notifications/`. Contenu requis : (a) Description de la violation (nature, type données, catégories personnes affectées, nombre approximatif). (b) Coordonnées DPO. (c) Conséquences probables. (d) Mesures prises ou proposées. **Notification incomplète possible** dans les 72h, complétée ensuite. Mieux que retarder. **Personnes concernées, Art. 34 RGPD** : si risque élevé pour droits/libertés des personnes, notifier **directement** (email, courrier). Contenu : nature violation, contact DPO, conséquences probables, mesures prises. **Pas obligatoire si** : (a) Mesures appropriées rendaient les données incompréhensibles (chiffrement). (b) Mesures ultérieures rendent risque improbable. (c) Communication exigerait effort disproportionné (alors communication publique). **Risque qualification 'élevé'** : si données sensibles, identité bancaire, données enfants, peut entraîner discrimination, fraude, atteinte réputation, perte significative. Pour hallucination LLM : selon ce qui a fuité (un nom seul = faible, données financières détaillées = élevé). **Décision** : ne pas attendre la perfection. Notifier rapidement avec ce qu'on sait, compléter ensuite. **Avec conseil DPO + Legal**, jamais en solo.
  • Comment faire un post-mortem formel de l'incident ?
    Structure type post-mortem 5 sections, 5-10 pages. **(1) Résumé exécutif** : 1 paragraphe, quoi, quand, ampleur, statut résolu/en cours, prochaines étapes. **(2) Timeline détaillée** : T0 = première occurrence détectée ou suspectée. T+X = chaque action de l'équipe (containment, investigation, mitigation, notification). Précision minute. **(3) Root cause analysis** : technique (RAG mal scopé ? fine-tuning data avec PII ? memory leak ? training data ?) + organisationnelle (manque de tests ? processus DPIA insuffisant ? formation équipe ?). Méthode 5 Whys ou Ishikawa. **(4) Impact** : (a) Utilisateurs/clients affectés (nombre, type données exposées). (b) Régulatoire (notification CNIL, autres autorités). (c) Réputationnel (couverture presse, sentiment). (d) Financier (coût remédiation + amende potentielle + perte business). (e) Juridique (litiges potentiels). **(5) Actions correctives** : (a) Court terme (corrigé en quelques jours, hot fix). (b) Moyen terme (1-3 mois, refonte architecture). (c) Long terme (process, formation, governance). Avec owner + deadline + status pour chaque action. **Diffusion** : interne (CISO, AI Officer, DPO, métier impacté), parfois externe (rapport synthèse pour clients, presse, autorités). **Cadence** : post-mortem dans les 7-14 jours post-incident. Review actions correctives à 30/60/90j. Anti-pattern : post-mortem one-shot, oublié 6 mois après. À tracker dans backlog jusqu'à 100% closed.
  • Comment éviter que ça se reproduise ?
    Stratégie en 4 piliers. **Pilier 1, Architecture défensive** : (a) **Grounding strict** sur sujets factuels engageants (legal, tarif, politique, garantie). Source = RAG vérifiée, pas la mémoire générale du modèle. (b) **System prompt durci** : 'Si question hors RAG fourni, répondre Information non disponible, consulter un conseiller'. (c) **Output validation** : pour réponses sur sujets sensibles, LLM-as-judge ou règles statiques. (d) **Disclaimer automatique** sur sujets à risque (devient minimum mais ne suffit plus seul depuis Air Canada). **Pilier 2, Tests et red team** : (a) Test corpus métier sur sujets engageants (50-100 questions sur politique, tarifs, conditions). (b) Sample manuel mensuel des conversations sur ces sujets. (c) Red team trimestriel pour pousser hallucinations contractuelles. (d) Promptfoo CI avec eval hallucinations. **Pilier 3, Architecture data** : (a) RAG avec tenant isolation immutable côté serveur. (b) Memory per-user, jamais shared. (c) Fine-tuning data **JAMAIS** avec PII réelles non pseudonymisées. (d) Audit régulier des sources RAG. **Pilier 4, Process et governance** : (a) DPIA à jour. (b) Plan incident response testé (table-top exercises). (c) Clauses contractuelles (CGU, CGV) sur statut chatbot et limitations. (d) Formation équipe : reconnaître signaux faibles, processus escalade. (e) Monitoring continu : drift detection, qualité scoring sample-based. **Cadence revue** : trimestrielle minimum, post-incident immédiate.

Écrit par

Naim Aouaichia

Cyber Security Engineer et fondateur de Zeroday Cyber Academy

Ingénieur cybersécurité avec un parcours hybride : développement, DevOps Capgemini, DevSecOps IN Groupe (sécurité des documents d'identité régaliens), audits CAC 40. Fondateur de Hash24Security et Zeroday Cyber Academy. Présence LinkedIn 43 000 abonnés, Substack Zeroday Notes 23 000 abonnés.