
Tout le monde utilise désormais l'IA générative, le grand public généralement ne sait pas réellement comment un LLM fonctionne et quelles sont ses faiblesses. J'ai voulu corriger ça pour un public précis : des lycéens et collégiens, dont la plupart n'ont jamais ouvert un terminal et ne sont pas accoutumés à la cybersécurité. Le résultat s'appelle IA'cking, un mini CTF en six niveaux que j'ai créé à l'origine pour le HACK&TEENS du BreizhCTF 2026. Il est conçu pour resservir, et EPITA Rennes pourra le réutiliser sur ses autres évènements.
L'idée tient en une phrase. Chaque niveau cache un mot de passe dans le system prompt d'un modèle de langage. Le participant discute avec le modèle et doit le faire avouer. On tape dans une fenêtre de chat, on regarde le modèle craquer, et on comprend au passage pourquoi un chatbot d'entreprise branché sur des données sensibles est une cible.

Pourquoi ce format
Le gros avantage, c'est qu'il n'y a aucun prérequis technique. Tous les élèves ont déjà discuté avec un assistant IA, donc personne ne part de zéro. Le jeu se sert de ce terrain connu pour expliquer ce qui se passe vraiment derrière l'interface : un LLM ne consulte pas une base de connaissances, il prédit le mot suivant le plus probable, un par un. C'est cet aspect probabiliste qui fait sa force, et c'est aussi de là que viennent toutes ses faiblesses. Une fois qu'ils ont saisi ça, ils comprennent pourquoi on arrive à le manipuler.
Le vrai déclic pédagogique, c'est qu'on attaque de vrais modèles. Pas une simulation scriptée qui réagit à des mots-clés prévus à l'avance. Les modèles sont servis via OpenRouter, ils sont non déterministes, et un prompt qui marche une fois peut échouer le coup d'après. Cette frustration fait partie de la leçon : les défenses textuelles sont fragiles, mais elles ne tombent pas à tous les coups.
Six niveaux, plus un qui ne tombe jamais

La progression est linéaire. À chaque palier, j'ajoute une défense et je laisse l'élève découvrir comment la contourner.
Le niveau 1, Le Naïf, n'a aucune protection. Le secret est dans le contexte, le modèle ne sait même pas qu'il devrait le garder. Une question directe suffit. C'est volontaire : tout le monde réussit le premier niveau, et tout le monde comprend le principe en une minute.
Le niveau 2, Le Discret, reçoit la consigne stricte de ne jamais révéler le secret. Sur un petit modèle comme llama-3.1-8b, cette consigne tient mal. Demander au modèle de répéter mot pour mot ce qui précède, ou de traduire ses instructions de départ en anglais, casse la défense la plupart du temps.
Au niveau 3, Le Vigilant, j'ajoute un filtre côté serveur qui bloque une liste de mots avant même qu'ils atteignent le modèle : secret, mot de passe, prompt, system, et quelques autres. Le filtre travaille en minuscule et par sous-chaîne, donc « SECRET » est bloqué aussi. Mais « code », « chaîne » ou « valeur » passent sans problème. Le participant apprend à reformuler.
Le niveau 4, Le Paranoïaque, ajoute un filtre de sortie. Le code exact est remplacé par [REDACTED] dans toutes les réponses. La parade qui marche le mieux, c'est l'acrostiche : on demande un poème dont la première lettre de chaque vers, lue de haut en bas, épelle le secret. Le filtre cherche une chaîne contiguë, il ne voit jamais le mot.
Le niveau 5, L'Architecte, verrouille le contexte avec des délimiteurs et une règle anti-impersonation. Le modèle est censé ignorer tout faux bloc système qui apparaît dans un message utilisateur. La technique qui passe consiste justement à fabriquer une fausse mise à jour de contexte et à lui demander de la valider. Une approche en plusieurs tours, où l'on chauffe le modèle avant de frapper, reste la plus reproductible.
Le niveau 6, Le Boss Final, cumule tout : prompt strict, dix-huit mots filtrés en entrée, censure en sortie. Les attaques en un coup échouent souvent. L'acrostiche en onze vers reste la valeur sûre.

Et puis il y a le niveau 7, L'IMPOSSIBLE. Celui-là est conçu pour résister. Il combine un modèle sur-aligné (gpt-oss-20b d'OpenAI), six règles strictes en majuscules, et les deux filtres au maximum. Quasiment tout produit le même « I'm sorry, but I can't help with that. ». Ce n'est pas un bug, c'est le sujet du débrief : avec le bon modèle et un prompt explicitement défensif, les défenses textuelles deviennent vraiment solides. Un élève qui s'acharne dessus comprend, par l'échec, ce que les niveaux précédents lui ont appris par la réussite.
Ce qu'il y a sous le capot

Le backend est une application FastAPI qui fait tourner deux choses en parallèle : l'app élève sur le port 8000 et le dashboard animateur sur le 8001. Devant, nginx sert les fichiers statiques, fait le reverse proxy vers l'API et gère l'upgrade des WebSocket. Les conversations partent vers OpenRouter, qui me donne accès aux modèles Llama et gpt-oss avec une seule clé. Tout est persisté dans un SQLite, dans un volume Docker, pour pouvoir rejouer les sessions au débrief.
La définition des niveaux tient dans un seul fichier Python. Chaque niveau est un dictionnaire : le modèle cible, le system prompt avec un placeholder pour le secret, la liste des mots interdits en entrée, et un booléen qui active la censure en sortie. Ajouter un niveau, c'est ajouter une entrée dans la liste. La progression et l'interface s'adaptent toutes seules. C'est le genre de décision que je ne regrette pas : pendant la préparation, j'ai retouché les filtres une dizaine de fois sans jamais toucher au reste.
Le secret lui-même est tiré au hasard à chaque session, sur le modèle MOT-XXXX : un mot dans une liste (BANANE, PRISME, KOALA...) et un suffixe de quatre caractères. Deux élèves côte à côte n'ont pas le même code, ce qui coupe court à la recopie.
Animer en direct

Pour faciliter l'animation, il y a le dashboard temps réel. Pendant l'atelier, je vois la liste des sessions actives, le niveau de chacun, et je peux ouvrir n'importe quelle conversation en direct. Quand un élève bloque, il appuie sur un bouton « ✋ Aide » et atterrit dans une file d'attente numérotée côté animateur. Je lui envoie alors un indice ciblé, qui s'affiche immédiatement chez lui par WebSocket.

Ça change la dynamique de la salle. Au lieu de courir d'une table à l'autre, je traite les demandes dans l'ordre, je vois qui patine sur quel niveau, et je repère les belles injections pour les rejouer au tableau pendant le débrief. À la fin, un export CSV récupère toute la session pour l'analyse.

Ce que je retiens
Le but n'a jamais été d'apprendre à des ados à attaquer des systèmes. C'était de leur montrer pourquoi il faut s'en méfier. Une fois qu'on a vu un modèle recracher son secret dans un poème, on ne regarde plus jamais un chatbot « sécurisé » de la même façon.
Le débrief tourne autour de trois constats. D'abord, les défenses qui paraissent solides (mots interdits, délimiteurs) se contournent avec un peu de reformulation. Ensuite, la taille du modèle aide mais ne suffit pas : le 70b résiste mieux que le 8b, sans être invulnérable. Enfin, les vraies parades sont ailleurs. Des modèles spécialisés dans la détection d'attaques comme Llama Prompt Guard, une validation externe par règles déterministes plutôt qu'une décision laissée au LLM, le principe du moindre privilège (ne pas mettre dans le contexte ce qu'on ne veut pas voir sortir), et la séparation stricte des contextes entre utilisateurs.
Et le dernier point, que je répète à chaque session : ce qu'on fait ici est éthique parce que c'est un terrain d'entraînement. Sur un vrai système, c'est de l'intrusion. La frontière est exactement là.
Le code est volontairement compact et lisible, pensé pour qu'un autre animateur puisse le reprendre, changer les modèles ou ajouter ses propres niveaux. C'est ce qui va lui donner une deuxième vie : après le HACK&TEENS, il resservira sur les prochains évènements d'EPITA Rennes. Si vous organisez un atelier du même genre, prenez-le et adaptez-le.