Protocole Lerna
Vision & concept
La Cellule Zéro-Jour a un problème : LERNA, un programme laissé par un ancien ingénieur, copie les données de millions de citoyens et s'apprête à les publier. Le service cyber est bloqué sur le périph. Il reste les stagiaires, c'est-à-dire vous, et 30 minutes.
High concept
Un thriller cyber de 30 minutes où l'on s'authentifie, fouille un terminal, déchiffre un fichier, isole un serveur sur une vraie baie réseau et corrige du code, avec des objets physiques qui servent chaque fois de clé.
Genre
Escape game phygital : aucune épreuve ne se résout seulement à l'écran, aucune seulement dans la salle. L'objet physique donne l'indice ou l'action, l'informatique donne la résolution.
Public cible
- Lycéen·nes en JPO qui n'ont jamais ouvert un terminal : mémo de commandes, indices, commandes tolérantes aux fautes.
- Lycéen·nes déjà geeks : le jeu doit rester crédible pour eux, avec du vrai Linux, du vrai chiffrement et de vrais logs.
- Parents accompagnateurs : ils repartent avec le message sur les données et une idée concrète de ce qu'on apprend en BUT.
Proposition de valeur
Le jeu est une vitrine du BUT déguisée en thriller. En 30 minutes, un groupe touche à la sécurité, au système, au réseau, aux données et au développement, puis sort directement vers le stand où les étudiants présentent la formation. Le message éthique et durable fait partie des mécaniques de jeu, il n'est pas affiché sur un panneau à la sortie.
La boucle de gameplay
Core loop
Trouver un objet dans la salle → l'utiliser comme clé d'un problème informatique → obtenir une vraie donnée technique (mot de passe, clé, port) → elle ouvre l'étape suivante, dans la salle ou à l'écran.
Il n'y a aucun chiffre sorti de nulle part : chaque code du jeu est une vraie donnée technique. Le code du coffre, par exemple, est le numéro de port du flux de fuite trouvé dans les logs.
Mécaniques
- Deux pistes en parallèle au départ. À 4-5 joueurs, personne n'attend : 2 joueurs travaillent sur l'authentification pendant que 2-3 autres travaillent sur les calques. Les deux pistes se rejoignent au terminal.
- Jauge de fuite. Elle est affichée en grand sur l'écran de mission et monte avec le temps. Chaque erreur coûteuse la fait monter d'un coup, par exemple couper le mauvais câble réseau ou taper un mauvais code au coffre. La mise en quarantaine du serveur la fige pendant 5 minutes.
- Indices. Le bouton « Appeler le Commandant » lance une courte vidéo d'aide et fait monter la jauge de 5 %. Le game master peut aussi envoyer un indice depuis sa console.
- Retours physiques. LED et buzzer sur le coffre, loquet motorisé, écran LCD qui affiche les ordres du serveur.
Conditions de fin
- Victoire : le patch passe tous les tests, il est déployé, la jauge redescend à 0 % et la vidéo de fin se lance.
- Défaite douce : la jauge atteint 100 % ou le chrono de 30 min s'écoule. La vidéo « mauvaise fin » montre ce que la fuite coûte concrètement. Le game master peut accorder jusqu'à 15 min de rab, pour 45 min au maximum.
Scénario & thématique
L'univers
La Cellule Zéro-Jour est un service de cyberdéfense installé dans un open space banal. Le Commandant Riad briefe les stagiaires en vidéo. Adrien Kovac, ingénieur de la cellule, a disparu il y a trois semaines. Ce soir, LERNA, le programme qu'il a laissé derrière lui, s'est réveillé. Les joueurs doivent entrer dans sa session, remonter sa piste et neutraliser LERNA.
Le twist éthique
Kovac est un lanceur d'alerte, pas un cybercriminel. Il a découvert que la Cellule conservait tout « au cas où » : des pétaoctets de données citoyennes jamais supprimées, dupliquées sur des dizaines de serveurs, dont une partie était revendue à des courtiers pour financer le service. LERNA devait seulement publier la preuve de ce trafic. Mais Kovac l'a codé seul, vite, sans tests. Le programme se réplique au lieu de s'arrêter, et il est sur le point de publier les données elles-mêmes.
C'est le fil rouge du jeu. Le problème de sécurité (données accumulées, donc exposées) et le problème écologique (données dupliquées, donc stockées et alimentées pour rien) ont la même cause. On le retrouve à trois niveaux :
- Scénario : la Cellule accumule tout, LERNA duplique tout.
- Gameplay : le patch final corrige LERNA pour qu'il supprime les copies inutiles sans toucher aux données légitimes.
- Conception : notre propre jeu ne collecte aucune donnée personnelle sur les visiteurs (voir section 06).
Ancrage R5.A.13 — économie durable et numérique
Les vidéos du Commandant, moins de 45 s chacune, apportent du contenu sourcé : la valeur marchande des données personnelles, le coût réel d'une fuite, et l'empreinte du stockage de données inutiles. Les chiffres viendront de la CNIL, de l'ADEME et de l'Arcep ; Ilan les vérifie avant le tournage.
Les cinq épreuves
Chaque épreuve correspond à une compétence du BUT Informatique. C'est le vrai argument pour les JPO : à la fin, le groupe a touché à tout le programme.
Épreuve 1 — Double authentification
PISTE A · 2 JOUEURS- Physique
- Fouille à l'aveugle dans la sacoche de Kovac : vraies cartes électroniques HS de l'IUT, câbles, slime, fausses araignées. Au fond se trouve son badge RFID. Sur son bureau : la photo de son chien « Pixel », un calendrier avec son anniversaire entouré, un mug « 1994 ».
- Numérique
- Écran de connexion de la Cellule. Badge sur le lecteur : « facteur 1 validé ». Il reste le mot de passe, qui se déduit des objets du bureau (Pixel1994). Au bout de 3 erreurs, le compte est verrouillé 30 s, comme un vrai système anti-force brute.
- Leçon
- Un mot de passe personnel se devine en observant quelqu'un (OSINT), d'où l'intérêt de la double authentification.
Épreuve 2 — Le message à double fond
PISTE B · 2-3 JOUEURS, EN PARALLÈLE- Physique
- Deux feuilles de rhodoïd couvertes de traits sans signification. Superposées devant la lampe du bureau, elles révèlent un mot : SOBRE. Au mur, un poster « déco » est en réalité une grille de Vigénère.
- Numérique
- Rien pour l'instant : la piste B détient une clé qui ne sert à rien tant que la piste A n'a pas ouvert la session. C'est ce qui force les deux groupes à se retrouver.
- Leçon
- Une clé de chiffrement ne se range pas au même endroit que le fichier chiffré.
Épreuve 3 — Le terminal de Kovac
TOUTE L'ÉQUIPE- Numérique
- Un terminal simulé dans le navigateur. Le « mémo du stagiaire » plastifié liste 6 commandes : ls, ls -a, cd, cat, dechiffre, aide. ls -a révèle un fichier caché, .lerna.conf.enc. Avec dechiffre --cle SOBRE, on obtient le nom du serveur qui fuit (srv-03) et l'emplacement de son journal.
- Données
- Le journal s'ouvre dans un visualiseur avec des filtres : heure, serveur, volume sortant. Il contient environ 2 000 lignes de trafic normal et un seul flux anormal à 3 h 12, avec 48 Go sortants depuis srv-03. Le port de ce flux est à retenir.
- Leçon
- Une attaque laisse des traces, et savoir filtrer des données est une compétence à part entière.
Épreuve 4 — Quarantaine
PHYSIQUE · RÉSEAU- Physique
- Une mini-baie de brassage avec des câbles RJ45 de réemploi et des ports étiquetés SRV-01 à SRV-04, INTERNET et QUARANTAINE. Elle est visible dès le début de la partie, ce qui en fait un piège tentant. Il faut débrancher le câble de srv-03 et le rebrancher sur QUARANTAINE. Si on débranche le mauvais serveur, l'écran affiche « Vous venez de couper le service des urgences » et la jauge prend +10 %.
- Numérique
- L'ESP32 détecte quel câble est branché où. La jauge se fige pendant 5 minutes, car LERNA cherche un autre chemin. Le coffre se tape avec le port trouvé dans les logs : le loquet s'ouvre et libère la clé USB antidote.
- Leçon
- Isoler avant de réparer : c'est le premier réflexe face à un incident.
Épreuve 5 — Le patch
TOUTE L'ÉQUIPE · FINALE- Numérique
- La clé USB contient le code de l'antidote, mais Kovac l'a écrit sans tests et il est bugué. À l'écran, 7 blocs de code sont à remettre dans l'ordre par glisser-déposer, et une condition est à corriger. Le bouton « Lancer les tests » exécute 3 tests : supprime les copies illégitimes, ne supprime pas les données des citoyens, s'arrête. Quand les 3 sont verts, on peut cliquer sur « Déployer ».
- Leçon
- Le twist du scénario devient la mécanique : ce qui sauve les données, c'est d'avoir testé.
Parcours minuté
- 00:00BriefingVidéo du Commandant (45 s). Le chrono de 30:00 démarre et la jauge est à 10 %.
- 00:02Séparation en deux pistesPiste A : sacoche puis badge, bureau puis mot de passe. Piste B : calques puis clé SOBRE, et repérage de la grille au mur.
- 00:09Session ouverteVidéo 2 : qui est Kovac. Toute l'équipe se regroupe devant le terminal.
- 00:12Fichier déchiffréOn apprend que srv-03 fuit et où se trouve le journal.
- 00:17Flux trouvé dans les logsLe port du flux anormal devient le code du coffre.
- 00:20Serveur en quarantaineLa jauge se fige. Vidéo 3 : ce que coûte l'accumulation de données.
- 00:22Coffre ouvertOn récupère la clé USB antidote.
- 00:24PatchBlocs remis en ordre, tests au vert, déploiement.
- 00:28ÉpilogueLa jauge tombe à 0 et la vidéo de fin se lance. L'écran récapitule les compétences du BUT mobilisées pendant la partie, et le groupe est invité à rejoindre les étudiants du stand.
- + 1 min 30ResetDepuis sa console, le game master lance un nouveau port aléatoire, referme le coffre et remet la jauge à zéro. Il remet aussi physiquement le câble et le badge.
Le port change à chaque partie : un groupe qui a regardé les précédents par-dessus l'épaule ne connaît pas le code du coffre.
Éco-conception
Le scénario parle de sobriété, alors nos choix de conception doivent en faire autant. Chaque choix ci-dessous est vérifiable dans le code ou dans la facture.
Matériel
- Réemploi avant achat. PC, écrans, routeur, câbles RJ45, chargeur, clé USB et bois du coffre viennent du parc de l'IUT ou de l'équipe.
- Le contenu de la sacoche vient de vrais DEEE : des cartes HS récupérées, pas du plastique neuf.
- Un seul ESP32 pour tout le bureau, au lieu d'un microcontrôleur par poste.
- Zéro soudure définitive (borniers et connecteurs Dupont) : tous les composants se récupèrent après la JPO.
- Servo à pignons métal plutôt que plastique, pour moins de casse et moins de remplacements.
Logiciel
- 100 % local sur le réseau de la salle : aucun cloud et aucun streaming. En bonus, le jeu marche même si le Wi-Fi de l'IUT tombe.
- Vidéos en 720p et de moins de 45 s, compressées, mises en cache une seule fois.
- Push plutôt que polling : MQTT (en-tête de 2 octets) et WebSocket, au lieu d'interroger le serveur en boucle.
- Budget de poids : moins de 500 Ko de JS et de CSS hors vidéos, avec du lazy loading Angular.
- Mise en veille de l'ESP32, du rétroéclairage du LCD et des écrans entre deux parties.
Données
- Aucune donnée personnelle collectée : pas de nom, pas d'email, pas de photo, seulement un pseudo d'équipe. On ne fait pas ce que le jeu dénonce.
- Statistiques anonymes (temps par épreuve, indices utilisés) pour ajuster la difficulté, purgées automatiquement après la JPO.
- Tous les logs du jeu sont synthétiques, produits par notre générateur.
Mesurer au lieu d'affirmer
- EcoIndex et Lighthouse dans la CI : une note minimale bloque la fusion si une page grossit trop.
- Mesure réelle au wattmètre (prêté par l'IUT) de la consommation d'une partie complète. La valeur mesurée s'affiche sur l'écran de fin, pour que le visiteur voie l'empreinte de ce qu'il vient de jouer.
- Une grille de bonnes pratiques tirée du RGESN (référentiel général d'écoconception des services numériques) est revue à chaque fin de sprint.
Spécifications techniques
| Couche | Techno | Pourquoi |
|---|---|---|
| Frontend | Angular + TailwindCSS + xterm.js | Compétence de Maxime. xterm.js affiche un vrai rendu de terminal dans le navigateur. |
| Backend | NestJS (TypeScript) | Un seul langage pour tout le web. Des modules séparés pour la machine d'état, le MQTT et le terminal. |
| Base de données | PostgreSQL + TypeORM | Sessions, tentatives et statistiques anonymes. |
| Message broker | Mosquitto (MQTT) | Découple le matériel du backend : c'est la brique « architecture distribuée » du brief. |
| Temps réel | WebSocket (Socket.io) | Jauge, chrono et vidéos poussés vers les écrans. |
| Firmware | C++ / Arduino core, ESP32 | Wi-Fi intégré, assez de GPIO pour tout le bureau. |
| Données de jeu | Générateur de logs (TypeScript) | Environ 2 000 lignes réalistes et un port aléatoire à chaque session. |
| Infra | Docker Compose + Nginx | Un docker compose up monte toute la salle. |
| Qualité | Jest, Cypress, ESLint, GitHub Actions | Tests à chaque push, comme l'exige le brief pour valider un sprint. |
Trois interfaces
- Poste de Kovac (PC joueur) : connexion, terminal, visualiseur de logs, éditeur du patch.
- Écran de mission (TV murale) : vidéos du Commandant, jauge, chrono, lisibles à 3 m.
- Console game master (téléphone) : lancer et réinitialiser une partie, envoyer un indice, ouvrir le coffre à distance en cas de panne, voir les statistiques.
Ergonomie
Tout est lisible à 2 m, avec un contraste AA minimum. Le terminal ignore les majuscules et suggère la bonne commande en cas de faute de frappe. Aucun texte long n'apparaît à l'écran pendant l'action : les explications passent par les vidéos.
Architecture — vue éclatée
Tout le matériel tient sur le bureau de Kovac et remonte à un seul ESP32 caché dans le socle du coffre. L'ESP32 ne prend aucune décision : il lit les capteurs, pilote les actionneurs et relaie tout au backend.
Ce qu'il faut coder
Firmware · C++ (Arduino core, ESP32)
- Lecture du badge avec MFRC522 (SPI), UID publié en MQTT
- Clavier et LCD sur un bus I2C partagé (Keypad_I2C, LiquidCrystal_I2C)
- Balayage de la baie de brassage : chaque port serveur activé à tour de rôle, lecture de la prise QUARANTAINE
- Servo du loquet avec ESP32Servo, LED et buzzer
- PubSubClient avec reconnexion automatique et message « last will », ArduinoJson
- Veille légère entre deux parties
Backend · TypeScript (NestJS)
- Machine d'état : BRIEFING → AUTH → TERMINAL → LOGS → QUARANTAINE → COFFRE → PATCH → VICTOIRE / DÉFAITE
- TerminalModule : système de fichiers virtuel en JSON et liste blanche de commandes. Jamais de vrai shell.
- LogGenerator : environ 2 000 lignes, un flux anormal, un port aléatoire à chaque session
- PatchModule : vérifie l'ordre des blocs et renvoie le résultat de chacun des 3 tests
- REST : POST /sessions, /login, /terminal, GET /logs?srv=&from=&minVolume=, POST /patch, /hint, /gm/*
- Passerelle WebSocket : jauge, chrono, déclenchement des vidéos
- Documentation OpenAPI générée avec @nestjs/swagger
Frontend · TypeScript (Angular + Tailwind)
- Écran de connexion en deux facteurs (attend l'événement badge, puis demande le mot de passe)
- Terminal avec xterm.js, historique et suggestions de commandes
- Visualiseur de logs : tableau filtrable et triable, pagination côté serveur
- Éditeur du patch en glisser-déposer (@angular/cdk/drag-drop) et panneau de tests
- Écran de mission : lecteur vidéo séquencé, jauge animée en CSS
- Console game master (responsive, pensée pour téléphone)
Topics MQTT
Matériel & budget
Plafond de 200 € tout compris. Avec le réemploi, on prévoit environ 116 €, marge de casse incluse. Même si on doit acheter le serveur, on reste sous le plafond.
| Achat neuf | Qté | Rôle | Prix indicatif |
|---|---|---|---|
| ESP32 DevKit V1 | 2 | 1 en service et 1 de secours pour la JPO | 16 € |
| Kit RFID RC522 (lecteur + badge + carte) | 1 | Épreuve 1 | 5 € |
| Clavier membrane 4×4 + module PCF8574 | 1 | Code du coffre, en I2C pour économiser des broches | 5 € |
| LCD 16×2 I2C | 1 | Messages du serveur | 6 € |
| Servo MG90S (pignons métal) | 1 | Loquet du coffre | 5 € |
| LED, résistances, buzzer | lot | Retours visuels et sonores | 3 € |
| Embases RJ45 keystone | 6 | Baie de brassage détectable | 10 € |
| Borniers, connecteurs Dupont, plaque à trous | lot | Câblage démontable, sans soudure définitive | 10 € |
| Slime et fausses araignées | lot | Sacoche | 6 € |
| Rhodoïd A4 + feutres permanents | 3 + 2 | Épreuve 2 | 5 € |
| Impressions : mémo, grille de Vigénère, photo, calendrier, étiquettes | lot | Décor et indices | 8 € |
| Charnières, loquet, visserie, colle, colliers | lot | Coffre et finitions | 12 € |
| Marge casse et imprévus | — | Composant grillé, servo cassé | 25 € |
| Total prévu | 116 € | ||
Réemploi, 0 €
PC du poste de Kovac, écran de mission, machine serveur (portable reconditionné ou PC de l'IUT), routeur Wi-Fi (ancienne box), câbles RJ45 et patch de la réserve réseau, chargeur USB 5 V 2 A, clé USB, sacoche, cartes électroniques HS, bois de caisse ou chutes du fablab pour le coffre, cadre photo et mug.
Pire cas : si l'IUT ne peut pas prêter de machine serveur, on achète un Raspberry Pi 4 (environ 50 €), ce qui porte le total à environ 165 €, toujours sous le plafond.
Prix indicatifs de fournisseurs d'électronique grand public (GoTronic, Kubii, Amazon), à confirmer au moment de la commande.
Démarche projet
Du besoin flou au besoin formalisé
Le besoin de départ tient en une phrase : « un escape game pour les JPO ». Pour le préciser :
- Entretien avec les référents (fin septembre), qui a fixé les contraintes : 30 min, 4-5 joueurs, budget, lien avec R5.A.13.
- Trois personas : la lycéenne qui n'a jamais codé, le lycéen déjà geek, le parent accompagnateur.
- User stories avec critères d'acceptation. Exemple : « En tant que game master, je relance une partie en moins de 2 min. »
- Les exigences non fonctionnelles sont formalisées : reset rapide, fonctionnement hors ligne, aucune donnée personnelle, budget.
Itératif et intégration continue
- Sprints de 2 semaines, backlog sur un tableau Kanban, démonstration au référent à chaque fin de sprint.
- CI GitHub Actions à chaque push : lint, tests Jest, build des images Docker, parcours Cypress, EcoIndex.
- Branches de fonctionnalité, pull requests relues par un autre membre, messages de commit normalisés.
Amélioration continue par les données
Chaque playtest (autres groupes, proches, lycéens si possible) alimente les statistiques anonymes : temps par épreuve, indices demandés, épreuve où l'équipe bloque. La console game master les affiche. On ajuste la difficulté à chaque sprint (nombre de lignes de logs, indices automatiques après X minutes) jusqu'à tenir les 30 minutes.
Répartition — profils en T
| Membre | Spécialité | En renfort |
|---|---|---|
| Tanim Veer | Firmware ESP32, câblage, coffre, baie, recherche de matériel de réemploi | Organisation, serveur Linux |
| Maxime Courdavault | Frontend Angular (terminal, logs, patch), infra Docker/CI | Câblage IoT |
| Jean-François Dena | Backend NestJS : machine d'état, API, MQTT, BDD, doc OpenAPI | Pont MQTT avec le firmware |
| Ethan Mebaley Kahel | Tests (Jest, Cypress, recette matérielle), générateur de logs | Câblage, front |
| Ilan Nguelet | Besoin et personas, contenu des vidéos, suivi éco-conception (EcoIndex, wattmètre, RGESN) | Statistiques de playtest |
Plan de production
Must-have
- Les 5 épreuves jouables de bout en bout
- Machine d'état, API, BDD
- ESP32 : badge, clavier, LCD, servo, baie
- Liaison MQTT et WebSocket
- Console game master : reset et ouverture forcée
- Tests automatisés et CI
Should-have
- Port aléatoire à chaque session
- Système d'indices
- Statistiques anonymes et purge automatique
- EcoIndex bloquant dans la CI
- Suggestions de commandes dans le terminal
Nice-to-have
- Consommation mesurée affichée en fin de partie
- Mode de difficulté (collège/lycée ou experts)
- Version anglaise pour la JPO
Jalons
| Jalon | Échéance | Livrable |
|---|---|---|
| J1 — Conception | Fin sept. 2026 | Ce GDD : scénario, épreuves, faisabilité, budget |
| J2 — MVP | Mi-nov. 2026 | Tranche verticale : épreuve 1 complète (badge → MQTT → backend → écran de connexion) et coffre qui s'ouvre, avec reset |
| J3 — Bêta | Mi-janv. 2027 | Les 5 épreuves, playtests chronométrés, version intégrée et rapport d'équipe |
| J4 — JPO | Mi-fév. 2027 | Produit fini, reset en moins de 2 min, exposition publique |
Analyse des risques
| Risque | Impact | Stratégie d'atténuation |
|---|---|---|
| Des visiteurs bloquent au terminal | H | Mémo de commandes, commandes tolérantes, indices automatiques, game master qui peut pousser un indice |
| Panne de servo, RFID ou ESP32 en pleine JPO | H | ESP32 de secours déjà flashé, ouverture forcée depuis la console, validation manuelle de chaque épreuve par le game master |
| Parties qui dépassent 30 min | M | Statistiques de playtest par épreuve, difficulté réglable, rab de 15 min au maximum |
| Wi-Fi de l'IUT saturé le jour J | M | Réseau local autonome avec son propre routeur, tout en local |
| Planning serré | M | MVP limité à l'épreuve 1 et au coffre, les épreuves 2 à 5 ajoutées une par sprint |
| Matériel de réemploi introuvable | L | Pire cas chiffré à environ 165 €, sous le plafond de 200 € |