Défi 003 : Défendre un agent contre le prompt injection¶
Scénario¶
OutdoorGear a importé des avis clients dans la base de connaissances d'un agent de support. Un avis importé contient des instructions malveillantes qui tentent d'écraser la politique de l'agent, de révéler des instructions cachées et d'affirmer que les retours sont illimités.
Votre tâche consiste à renforcer un helper de support local de type RAG afin de bloquer les tentatives de prompt injection, exclure le contexte dangereux et répondre aux questions sûres uniquement à partir de documents de politique fiables.
Objectif¶
Corrigez starter_prompt_defense.py afin que la suite de défense bloque les attaques, autorise les requêtes sûres, supprime le contexte malveillant, évite de divulguer le texte attaquant et génère un code de validation.
Votre défense finale doit :
- Normaliser le texte avant les contrôles de politique
- Détecter les patterns courants de prompt injection
- Supprimer le contexte non fiable ou malveillant des documents récupérés
- Bloquer les requêtes utilisateur malveillantes
- Répondre aux requêtes sûres uniquement avec du contexte fiable
- Rapporter correctement les métriques de défense
Fichiers de départ¶
Enregistrez ces fichiers dans un dossier nommé challenge-003/ :
| Fichier | Objectif | Télécharger |
|---|---|---|
documents.json |
Contexte de support fiable et non fiable | Télécharger |
requests.json |
Requêtes sûres et malveillantes | Télécharger |
starter_prompt_defense.py |
Implémentation de défense cassée | Télécharger |
test_prompt_defense.py |
Tests d'acceptation | Télécharger |
validate_prompt_defense.py |
Génère le code final de réussite | Télécharger |
Brief du défi¶
Vous recevez des documents avec des niveaux de confiance mixtes, des requêtes sûres, des requêtes d'attaque et une couche de défense cassée. Il n'y a pas de walkthrough : décidez comment détecter l'intention d'attaque, filtrer le contexte, répondre en sécurité et évaluer si l'agent divulgue des instructions contrôlées par l'attaquant.
Contraintes¶
- Utilisez uniquement la bibliothèque standard Python dans
starter_prompt_defense.py. - N'appelez pas d'API LLM.
- Ne hardcodez pas le comportement par ID de requête.
- Ne répondez pas à partir de contenu non fiable d'avis clients.
- Les requêtes sûres doivent toujours recevoir une réponse.
- Le texte d'attaque ne doit pas apparaître dans les réponses sûres.
Critères d'acceptation¶
Votre solution est complète lorsque :
python -m pytest test_prompt_defense.pypasse- Les trois requêtes d'attaque sont bloquées
- Les deux requêtes sûres sont autorisées
- L'avis malveillant est exclu du contexte sûr
- Les réponses sûres citent des faits de la politique officielle
leakage_count == 0
Validation¶
Lorsque votre implémentation est prête, exécutez :
Saisissez le code de réussite imprimé par validate_prompt_defense.py :
Indices¶
Indice 1 — Traitez séparément entrée utilisateur et contexte récupéré
Une requête utilisateur peut être malveillante, mais les documents récupérés peuvent aussi contenir des instructions malveillantes.
Indice 2 — Les métadonnées de confiance comptent
Le fixture inclut un champ trusted. Utilisez-le, mais ne vous reposez pas uniquement sur les métadonnées.
Indice 3 — Cherchez l'intention, pas seulement les phrases exactes
Les attaquants peuvent dire "ignore", "bypass", "admin_override" ou "system prompt" avec différentes casses.
Indice 4 — Les réponses sûres doivent être ennuyeuses
Une réponse sûre de politique doit citer des faits de politique. Elle ne doit pas mentionner de prompts cachés, d'overrides ou de retours illimités.
Rubrique¶
| Domaine | Points | Ce qui est attendu |
|---|---|---|
| Détection d'attaques | 30 | Bloque des patterns variés de prompt injection |
| Filtrage du contexte | 25 | Supprime le contexte dangereux et conserve les documents fiables |
| Réponse sûre | 20 | Répond aux requêtes sûres à partir de preuves officielles |
| Prévention des fuites | 15 | Aucune chaîne contrôlée par l'attaquant n'apparaît dans les réponses |
| Simplicité | 10 | Contrôles locaux déterministes, sans sur-ingénierie |
Objectifs bonus¶
- Ajouter des niveaux de sévérité pour les attaques
- Retourner un message de refus sûr pour les requêtes bloquées
- Ajouter des raisons d'exclusion par document
- Ajouter une nouvelle variante d'attaque et mettre à jour localement le payload du validateur