Aller au contenu

Session 7 — Revue de code finale, corrections bugs & Conception Chaos Sécurité

Durée : ~3 heures (2 conversations Claude) Objectif initial : Revue de code finale avant de passer au Chaos Sécurité Objectif final : 6 bugs corrigés (4 fonctionnels + 2 monitoring), conception complète du Chaos Sécurité


🎯 Réalisations

1. Revue de code complète — 4 bugs fonctionnels corrigés

Temps : ~1h30 Difficulté : ⭐⭐⭐⭐ (trouver les bugs, pas les corriger)

B1 — A1 TVA : applyTva() jamais appelée

Fichier : OrderService.java

getTvaRate() était loguée et incrémentait le compteur A1, mais le résultat n'était jamais utilisé : order.setTotalAmount(totalHT) ignorait la TVA.

Correction : les deux paths (createOrder via CartService et createOrderFromItems) appellent désormais businessChaosService.applyTva(totalHT, email) avant setTotalAmount().

Impact : A1 désormais visible dans l'UI — le montant de la commande est réellement différent en niveau 1+. Avant la correction, l'anomalie était loguée mais invisible pour l'étudiant.

B2 — A3 Stock : décrémentation jamais exécutée (path CartService)

Fichier : OrderService.java

Dans createOrder() (path CartService), le bloc if (decrement) ne faisait qu'un log.debug sans appel à product.setStock() ni productRepository.save().

Correction : ajout de product.setStock(Math.max(0, stock - qty)) + productRepository.save(product) dans le if (decrement).

Impact : A3 opérationnel au niveau 0 (décrémentation réelle) et désactivé proprement en niveau 1+.

B3 — A11 Périmètre trop étroit : bundle scripting toujours invalidé

Fichier : AuthController.java

chaosScriptingService.invalidateBundle(session) était appelé avant le if (gracePeriod > 0) — le bundle scripting était donc invalidé même au niveau 3, ce qui réduisait la surface d'exploitation de A11 au seul securityToken.

Correction : invalidateBundle() et invalidateToken() déplacés dans le bloc else — en niveau 3, seul session.removeAttribute("LOGGED_IN_USER") est appelé, laissant la session entière exploitable 30 secondes.

Impact : A11 couvre désormais tout le parcours checkout (securityToken + bundle scripting + données checkout) pendant la grace period.

B4 — Doublon ADMIN_SESSION_KEY dans FrontendChaosController

Fichier : FrontendChaosController.java et AdminController.java

FrontendChaosController déclarait sa propre constante ADMIN_SESSION_KEY = "admin_logged_in" et appelait AdminController.isValidAdminToken() directement.

Correction : - FrontendChaosController : remplacé par AdminAuth.isAdmin(session, adminToken) - AdminController : private static final String ADMIN_SESSION_KEY = "admin_logged_in" remplacé par = AdminAuth.ADMIN_SESSION_KEY (source de vérité unique)


2. Revue de code complète — 2 bugs monitoring corrigés

Temps : ~30 min Difficulté : ⭐⭐⭐

Fix A — ChaosInterceptor n'excluait pas /api/chaos/public

Fichier : ChaosInterceptor.java

L'interceptor excluait /actuator et /api/admin/chaos, mais pas /api/chaos/public — les endpoints de monitoring public (status, logs métier, status scripting) passaient donc par les chaos threadPool, slowQuery et network.

Conséquence : lors d'un chaos network à 100%, le dashboard de monitoring se retrouvait lui-même ralenti ou en timeout, rendant l'observation du chaos impossible.

Correction :

if (path.startsWith("/actuator")
        || path.startsWith("/api/admin/chaos")
        || path.startsWith("/api/chaos/public")) {
    return true;
}

Fix B — CSS manquant pour les types PROMO_OK et SQL_* dans l'onglet Métier

Fichier : monitoring/public/index.html

La fonction renderLogs() calcule le style CSS via chipKey = type.split('_')[0]. - PROMO_OK.split('_')[0]PROMO.chip-PROMO : absent du CSS - SQL_INJECT.split('_')[0]SQL.chip-SQL : absent du CSS

Ces entrées de log s'affichaient sans couleur ni fond, passant inaperçues.

Correction : ajout des deux règles CSS manquantes :

.chip-PROMO { background:rgba(46,213,115,0.1); color:var(--success); }
.chip-SQL   { background:rgba(251,146,60,0.1);  color:#fb923c; }


3. Vérification bout-en-bout — Onglet Chaos Métier monitoring

Temps : ~30 min Difficulté : ⭐⭐

Vérification exhaustive de la chaîne complète :

BusinessChaosService.addLog()
  → { ts, time, type, severity, user, detail, technical }
  → GET /api/chaos/public/business/logs (non impacté par ChaosInterceptor)
  → fetchMetier() toutes les 2s dans index.html
  → renderLogs() → tableau avec chips colorés

Résultat : toutes les clés JSON produites par le backend sont consommées par le frontend. Tous les compteurs A1→A11 sont présents et nommés identiquement. Les deux bugs CSS corrigés ci-dessus. Chaîne 100% fonctionnelle.


4. Conception complète du Chaos Sécurité

Temps : ~30 min Difficulté : ⭐⭐

Rédaction du document de conception PROMPT_CHAOS_SECURITE.md (310 lignes) livré à C:\Users\philn\OneDrive\Documents\Claude\perfshop\PROMPT_CHAOS_SECURITE.md.

Architecture retenue :

# Faille Niveau Vecteur OWASP
S1 Injection SQL (recherche produit) 1 A03 — SQLi
S2 IDOR commandes (accès cross-user) 1 A01 — Broken Access Control
S3 Exposition hash mot de passe 1 A02 — Data Exposure
S4 XSS stocké (adresse livraison) 2 A03 — XSS persistant
S5 Falsification prix côté client 2 A04 — Insecure Design
S6 Timing attack sur le login 2 A07 — Enumération comptes
S7 JWT à clé faible (forgeable) 3 A02 — Broken Auth
S8 Path Traversal (facture PDF) 3 A01 — LFI
S9 Mass Assignment (élévation role) 3 A08 — Software Integrity

Chaque faille est ancrée dans un endpoint existant du projet, avec niveau 0 toujours safe, pattern identique au Chaos Métier.


🎢 Chronologie Détaillée

Phase 1 (1h30) : Revue de code fonctionnel 🟢

  • Vérification automatisée par script Python des 8 points critiques
  • Identification de 4 bugs réels (B1-B4)
  • Corrections appliquées une par une dans les bons fichiers
  • Ressenti : 🟢 Méthodique, les scripts d'analyse accélèrent la revue

Phase 2 (30 min) : Revue monitoring 🟢

  • Vérification bout-en-bout backend ↔ frontend sur l'onglet Métier
  • Identification de 2 bugs CSS discrets (chip-PROMO, chip-SQL)
  • Fix ChaosInterceptor (endpoints publics non exclus)
  • Ressenti : 🟢 Rapide, analyse outillée avec grep/python

Phase 3 (1h) : Conception Chaos Sécurité 🟢

  • Entretien sur les objectifs pédagogiques (formation sécurité IT)
  • Mapping 9 failles ↔ endpoints Java existants
  • Rédaction prompt de passation exhaustif (310 lignes)
  • Ressenti : 🟢 Cadrage clair, architecture cohérente avec l'existant

🧠 Moments Clés d'Apprentissage

1. Tester les anomalies de bout en bout, pas seulement le log

B1 est révélateur : le log A1 s'affichait, le compteur s'incrémentait, mais le montant en base était identique au nominal. Une anomalie pédagogique invisible pour l'étudiant n'a aucune valeur. Règle : chaque anomalie doit avoir un effet observable dans l'UI, pas seulement dans les logs.

2. Le monitoring ne doit pas être impacté par le chaos qu'il observe

Le bug ChaosInterceptor est logique en rétrospective : si le monitoring appelle les endpoints /api/chaos/public/* pour afficher l'état du chaos, et que ces endpoints subissent eux-mêmes le chaos réseau, l'observabilité s'effondre exactement quand on en a le plus besoin.

3. Les bugs CSS silencieux sont les plus sournois

chip-PROMO_OK.chip-PROMO semblait fonctionner (pas d'erreur JS, log affiché), mais les entrées de log s'affichaient en blanc sur fond gris — invisibles. Ce type de bug passe toutes les phases de test classiques.

4. Une revue scriptée vaut mieux qu'une revue manuelle

L'analyse Python cross-référençant les clés JSON du backend avec les clés consommées par le HTML a identifié les 2 bugs CSS en quelques secondes. Une relecture manuelle de 1237 lignes de HTML aurait pris 30+ minutes avec un risque d'omission.


📊 Métriques de la Session

Métrique Valeur
Durée totale ~3 heures
Conversations Claude 2
Bugs fonctionnels corrigés 4 (B1-B4)
Bugs monitoring corrigés 2 (ChaosInterceptor + CSS)
Fichiers Java modifiés 4 (OrderService, AuthController, FrontendChaosController, AdminController)
Fichiers monitoring modifiés 2 (ChaosInterceptor.java, index.html)
Lignes prompt Chaos Sécurité 310
Failles Chaos Sécurité conçues 9 (S1-S9, 3 niveaux)

🎯 Difficultés Rencontrées

🟡 Difficile (⭐⭐⭐⭐)

Problème : B1 — getTvaRate() loguée mais jamais appliquée
Subtilité : Le log WARN s'affichait correctement dans le monitoring, donnant l'illusion que l'anomalie fonctionnait. Il fallait comparer le montant DB au montant calculé manuellement.
Leçon : Logger ≠ appliquer. Toujours vérifier que l'effet de l'anomalie est bien persisté.

🟡 Difficile (⭐⭐⭐⭐)

Problème : B3 — invalidateBundle() avant le if (gracePeriod > 0)
Subtilité : Le code "ressemblait" logique à première vue. Il fallait suivre l'ordre d'exécution précis pour réaliser que le bundle était invalidé avant même d'entrer dans la branche chaos.
Leçon : En revue de code sur la sécurité/chaos, suivre l'ordre d'exécution ligne à ligne.


✅ Ce Qui a Bien Fonctionné

Revue outillée par scripts Python

Plutôt que relire le code manuellement, les scripts Python ont cross-référencé : - Clés JSON backend ↔ clés consommées frontend - Types de log ↔ styles CSS définis - Constantes dupliquées ↔ usages dans le code

Cette approche permet de détecter des incohérences structurelles en secondes, indépendamment de la taille des fichiers.

Conception Chaos Sécurité ancrée dans l'existant

Chaque faille S1-S9 est mappée sur un endpoint Java existant (ProductController, OrderController, UserController, AuthController). Pas de nouveau controller créé pour les vecteurs d'attaque — les failles utilisent la surface d'attaque naturelle du projet, ce qui est plus réaliste pédagogiquement.


🎓 Conclusion

Cette session de ~3 heures en vibe coding a permis de :

Corriger 4 bugs fonctionnels — dont B1 (A1 invisible) et B3 (A11 sous-exploitable) ✅ Corriger 2 bugs monitoring — ChaosInterceptor et CSS chips silencieux ✅ Valider la chaîne complète — monitoring onglet Métier 100% fonctionnel ✅ Concevoir le Chaos Sécurité — 9 failles OWASP sur 3 niveaux, prompt de passation prêt

Ratio temps productif / temps total : ~95% Objectifs atteints : 100%

La revue outillée (scripts Python d'analyse cross-référençant backend et frontend) est l'approche la plus efficace testée sur ce projet. Elle dépasse la revue manuelle sur les bugs structurels (clés JSON, styles CSS, constantes dupliquées) tout en étant plus rapide.


🤖 Erreurs imputables à Claude AI — Session 7


❌ Erreur S7-1 — Bug B1 : anomalie A1 non testée de bout en bout lors de l'implémentation

Ce que j'ai proposé : L'implémentation initiale de A1 en Session 6 appelait businessChaosService.getTvaRate(email) et loguait la valeur, mais n'appliquait pas le résultat à order.setTotalAmount().

Ce qui s'est passé : L'anomalie était entièrement invisible pour l'étudiant — le log s'affichait, le compteur s'incrémentait, mais le montant de la commande était identique en niveau 0 et en niveau 1+.

Pourquoi c'était une erreur : J'aurais dû, lors de l'implémentation, vérifier explicitement que l'effet de l'anomalie atteignait bien la couche persistance (order.setTotalAmount() avec la valeur altérée).

Temps perdu : ~20 min (revue + correction) | Sévérité : ⭐⭐⭐⭐⭐


❌ Erreur S7-2 — Bug B3 : ordre d'exécution non vérifié dans AuthController.logout()

Ce que j'ai proposé : invalidateBundle(session) placé avant le test if (gracePeriod > 0) dans AuthController.logout().

Ce qui s'est passé : En niveau 3, le bundle scripting était systématiquement invalidé avant même d'évaluer si la grace period était active, réduisant la surface d'exploitation de A11.

Pourquoi c'était une erreur : Erreur d'ordre d'exécution classique dans un bloc conditionnel. J'aurais dû relire le flux complet de logout() après l'implémentation de A11 pour vérifier que les deux chemins (niveau 3 vs autres) produisaient bien les effets attendus.

Temps perdu : ~15 min | Sévérité : ⭐⭐⭐⭐


❌ Erreur S7-3 — Bug B4 : doublon ADMIN_SESSION_KEY non détecté à l'implémentation

Ce que j'ai proposé : FrontendChaosController avec sa propre constante ADMIN_SESSION_KEY = "admin_logged_in" au lieu d'utiliser AdminAuth.isAdmin().

Ce qui s'est passé : Doublon de la constante avec AdminController, violation du principe DRY introduit lors de la création d'AdminAuth.java en Session 6.

Pourquoi c'était une erreur : AdminAuth.java avait été créé précisément pour centraliser cette logique. J'aurais dû vérifier que tous les controllers utilisaient bien AdminAuth.isAdmin() après sa création.

Temps perdu : ~10 min | Sévérité : ⭐⭐⭐


❌ Erreur S7-4 — Fix CSS chip-PROMO manqué lors de l'implémentation de l'onglet Métier

Ce que j'ai proposé : L'onglet Chaos Métier avec la règle CSS .chip-PROMO_OK alors que le JS calculait chipKey = type.split('_')[0]PROMO.

Ce qui s'est passé : Les entrées de log de type PROMO_OK et SQL_INJECT / SQL_ERROR s'affichaient sans style visuel dans le tableau des logs.

Pourquoi c'était une erreur : Incohérence entre la convention de nommage CSS (.chip-PROMO_OK) et le calcul JS (split('_')[0]PROMO). J'aurais dû tester tous les types de log réellement produits par BusinessChaosService.addLog() contre les styles CSS disponibles.

Temps perdu : ~10 min | Sévérité : ⭐⭐⭐


📊 Récapitulatif Session 7

# Erreur Temps perdu Sévérité
S7-1 A1 getTvaRate() sans applyTva() — invisible UI ~20 min ⭐⭐⭐⭐⭐
S7-2 A11 invalidateBundle() avant if (gracePeriod > 0) ~15 min ⭐⭐⭐⭐
S7-3 Doublon ADMIN_SESSION_KEY dans FrontendChaosController ~10 min ⭐⭐⭐
S7-4 CSS chip-PROMO_OK / chip-SQL manquants ~10 min ⭐⭐⭐
TOTAL ~55 min

Pattern : Défaut de vérification bout-en-bout — implémenter la logique (log, compteur, méthode) sans vérifier que l'effet final atteint la couche cible (persistance DB, CSS visible, interface unifiée).


Session Sujet Durée Temps perdu erreurs Ratio productif
1 CPU Chaos & Monitoring ~6h ~3h15 ~46%
2 Variabilisation & CORS ~10h ~2h35 ~74%
3 Catalogue 1000 produits & images ~8h ~1h45 ~78%
4 Chaos Scripting & Domaines ~4h ~45 min ~81%
5 PerfShop.io ~8h ~2h50 ~64%
6 Chaos Métier & Revue de code ~12h ~1h15 ~90%
7 Revue finale & Conception Sécurité ~3h ~55 min ~69%
8 Chaos Sécurité — 9 failles OWASP ~8h ~30 min ~94%
TOTAL ~59h ~13h50 ~77%

Tendance : Le temps perdu en erreurs diminue au fil des sessions. La revue de code systématique introduite en Session 6 a permis d'atteindre ~90% de ratio productif — la meilleure session du projet.


🔁 Pattern Récurrent Global — Bilan des 7 sessions

En analysant les 25+ erreurs sur 7 sessions, le pattern central reste inchangé :

"Proposer une solution avant d'avoir audité l'environnement d'exécution réel."

Quatre manifestations :

  1. Hypothèse d'environnement — S1 (JIT), S3 (busybox), S6 (charset NAS) : assumer qu'un environnement se comporte comme l'environnement de développement local.

  2. Fix symptomatique sans audit global — S2 (CORS obstacle par obstacle) : traiter les erreurs une par une sans cartographier d'abord l'ensemble.

  3. Hypothèse sur l'état des données — S6 (retry OrderService) : assumer que les données passées en paramètre sont immuables.

  4. Non-application des leçons — S3-4 (CRLF) répète S2 : documenter une leçon ne suffit pas si elle n'est pas intégrée dans le réflexe de génération de code.

Règle corrective finale : avant tout fix ou nouvelle implémentation, poser deux questions : 1. "Quel est l'environnement réel d'exécution ?" (charset, shell, JVM, réseau) 2. "Quels autres endroits dans le projet font la même chose ?" (audit global avant fix local)