1. Avant de commencer
⏱️ Durée : 3:00
Bienvenue dans l'atelier de programmation pratique Sécuriser votre application avec CodeMender sur Gemini Enterprise Agent Platform de Google Cloud.
Dans cet atelier, vous allez endosser le rôle d'un ingénieur en sécurité cloud chargé d'auditer et de sécuriser OWASP Juice Shop, l'application Web intentionnellement vulnérable et standard du secteur, créée avec Node.js, Express, TypeScript et Angular.
Les outils d'analyse de sécurité traditionnels (SAST/DAST) inondent les équipes de développement de milliers de résultats de sécurité statiques, de taux élevés de faux positifs et d'aucune correction de code exploitable. Les développeurs passent des heures à trier les journaux, à suivre les flux de données et à écrire manuellement des correctifs qui perturbent fréquemment le comportement des applications existantes.
CodeMender révolutionne la sécurité du code en enveloppant les LLM Gemini de Google d'un harnais agentique affiné. À l'aide de prompts conçus par Google DeepMind, de compétences de sécurité spécialisées et d'une orchestration multi-agent, CodeMender agit comme un co-développeur de sécurité IA autonome qui détecte, vérifie et corrige les failles logicielles directement dans les dépôts sources locaux.
Prérequis
- Compréhension de base des failles des applications Web (OWASP Top 10, comme l'injection SQL et le XSS)
- Connaissances de base des applications JavaScript/TypeScript et Node.js
- Connaissances de base des outils d'interface de ligne de commande (CLI)
Points abordés
- Configurer, authentifier et initialiser la CLI CodeMender (
cm) dans Google Cloud Shell. - Comment analyser un dépôt de manière autonome pour détecter les failles exploitables (
cm find) - Valider les failles dans des bacs à sable isolés et inspecter les artefacts de validation (
cm verify). - Comment synthétiser, tester et appliquer de manière autonome des correctifs de sécurité contextuels (
cm fix). - Comment auditer la télémétrie des jetons et exporter des rapports de conformité multiformat (
cm stats,cm report).
Ce dont vous avez besoin
- Un projet Google Cloud avec facturation activée
- Google Cloud Shell avec une connexion de projet active (inclut
gcloud,gitet Node.js 18 ou version ultérieure préinstallés) - Dépôt de démarrage : dépôt GitHub OWASP Juice Shop
2. Présentation de l'architecture CodeMender
⏱️ Durée : 4 minutes
Avant de nous pencher sur l'analyse et la correction du code, voyons comment CodeMender fonctionne en arrière-plan dans Gemini Enterprise Agent Platform, conformément aux normes d'architecture officielles de Google Cloud.
Architecture du système : agent et daemon client

Du point de vue de l'utilisateur, CodeMender comprend deux composants architecturaux majeurs :
Plate-forme multi-agent hébergée : système multi-agent hébergé s'exécutant sur Google Cloud qui exécute la logique métier de sécurité de base, le prompt engineering de LLM et le raisonnement de sécurité.
CLI du client local et daemon de bac à sable (cm) : client exécuté dans Google Cloud Shell qui agit à la fois comme une CLI (pour émettre des commandes telles que cm find, cm verify, cm fix) et comme un daemon local (pour exécuter des commandes de manière sécurisée au nom de l'agent dans un bac à sable isolé au niveau du processus).
Les trois principales fonctionnalités de correction

CodeMender gère la sécurité du code en trois étapes intégrées :
Find Vulnerabilities (cm find) : analyse les codebases à l'aide d'un LLM guidé par l'agent, en exploitant des outils de sécurité spécialisés et le prompt engineering pour concentrer le modèle sur les failles de sécurité. (Vous pouvez également importer des résultats à partir d'outils d'analyse de sécurité externes.)
Vérifier les failles (cm verify) : compile le code localement et tente d'exploiter les failles découvertes pour vérifier si elles sont exploitables. Cela élimine les faux positifs et génère des artefacts de vérification d'espace de travail persistants dans .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md).
Corriger les failles (cm fix) : synthétise des correctifs sources adaptés au langage et les vérifie en exécutant des suites de tests de compilation et de régression du projet (npm test) dans le bac à sable local.
3. Configurer l'environnement OWASP Juice Shop
⏱️ Durée : 5 minutes
Dans cette étape, vous allez ouvrir votre environnement de terminal Google Cloud et récupérer le dépôt de l'application cible.
Étape 1 : Ouvrez Cloud Shell dans la console Google Cloud
Accédez à la console Google Cloud dans votre navigateur.
Dans la barre de navigation supérieure, cliquez sur le bouton Activer Cloud Shell (icône >_).
Cloud Shell fournit un terminal Linux basé sur un navigateur avec gcloud, git et Node.js préinstallés et authentifiés.
Étape 2 : Clonez le dépôt Juice Shop de l'OWASP
Dans votre terminal Cloud Shell ou local, clonez le dépôt OWASP Juice Shop :
git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop
Étape 3 : Inspecter les fichiers d'application clés
OWASP Juice Shop utilise Express.js sur le backend avec des modules TypeScript. Examinez rapidement la structure du répertoire :
ls -la routes/ lib/
Notez les fichiers de routage clés qui gèrent l'authentification, les requêtes des utilisateurs et l'administration du panier :
routes/login.ts : gère l'authentification des utilisateurs et l'exécution des requêtes SQL brutes.
routes/search.ts : gère la recherche de produits et l'affichage des réponses.
routes/basket.ts : gère la récupération du panier de l'utilisateur.
routes/trackOrder.ts : gère le suivi des commandes via des requêtes NoSQL.
lib/xml.ts : gère l'analyse XML et l'importation de fichiers.
lib/insecurity.ts : utilitaires d'aide pour les jetons de session et le chiffrement.
4. Installer la CLI CodeMender (cm) et authentifier les identifiants GCP
⏱️ Durée : 8:00
Au cours de cette étape, vous allez activer les API Google Cloud requises, accorder des autorisations IAM à l'aide de gcloud, télécharger et installer le binaire de la CLI cm, et configurer les identifiants par défaut de l'application (ADC).
Étape 1 : Activez les API Google Cloud requises via gcloud
CodeMender nécessite l'API Agent Platform (aiplatform.googleapis.com) et l'API Cloud Resource Manager (cloudresourcemanager.googleapis.com) sur Gemini Enterprise Agent Platform.
Dans Cloud Shell ou votre terminal, récupérez l'ID de votre projet actif (ou vérifiez le menu déroulant des projets en haut de la console Google Cloud) et activez les API de service requises :
# Automatically retrieve and set your active Google Cloud project ID
export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project ${PROJECT_ID}
# Enable required Google Cloud APIs
gcloud services enable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
serviceusage.googleapis.com \
--project=${PROJECT_ID}
Vérifiez que les API sont activées :
gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"
Étape 2 : Accordez des autorisations IAM via gcloud
Pour interagir avec le moteur de raisonnement cloud CodeMender, les utilisateurs et les comptes de service doivent disposer du rôle IAM roles/aiplatform.user (Utilisateur Agent Platform).
Attribuer un rôle IAM à votre compte utilisateur via la CLI
# Get your active authenticated gcloud account email
USER_EMAIL=$(gcloud config get-value account)
# Add IAM policy binding for user account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="user:${USER_EMAIL}" \
--role="roles/aiplatform.user"
Étape 3 : Téléchargez et installez la cm CLI dans Cloud Shell
Dans Google Cloud Shell, les données utilisateur sont stockées de manière persistante dans votre répertoire $HOME. Exécutez les commandes suivantes pour installer cm dans ~/bin sans avoir besoin de sudo. Vous êtes toujours dans ~/juice-shop depuis la section précédente. Les commandes sont donc téléchargées dans un répertoire temporaire, qui est ensuite nettoyé. De cette façon, aucun fichier d'installation ne se retrouve dans le dépôt Juice Shop :
# Download into a temporary directory so nothing lands in the Juice Shop repository
CM_TMP=$(mktemp -d)
curl -L -o "${CM_TMP}/cm-linux-amd64.zip" "https://artifactregistry.googleapis.com/download/v1/projects/cmoc-prod/locations/us/repositories/codemender-cli-production/files/cm:stable:cm-linux-amd64.zip:download?alt=media"
unzip -o "${CM_TMP}/cm-linux-amd64.zip" -d "${CM_TMP}"
# Install into your persistent ~/bin directory and clean up
mkdir -p ~/bin
install -m 0755 "${CM_TMP}/cm" ~/bin/cm
rm -rf "${CM_TMP}"
# Add ~/bin to PATH for this session and future Cloud Shell sessions
export PATH="$HOME/bin:$PATH"
grep -qxF 'export PATH="$HOME/bin:$PATH"' ~/.bashrc || echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
Étape 4 : Vérifiez l'installation de la CLI cm
Exécutez cm --version pour vérifier que le binaire de la CLI est correctement installé :
cm --version
Résultat attendu :
cm version 0.17.0
Étape 5 : Configurez les identifiants par défaut de l'application (ADC) Google Cloud
Configurez les identifiants par défaut de l'application (ADC) Google Cloud afin que cm puisse authentifier les requêtes auprès du moteur de raisonnement cloud :
gcloud auth application-default login
Une boîte de dialogue modale d'autorisation intitulée Autoriser Cloud Shell s'affiche. Cliquez sur Autoriser pour accorder l'accès.
5. Initialiser et vérifier l'espace de travail CodeMender
⏱️ Durée : 3:00
Maintenant que cm est installé et authentifié, vous allez initialiser l'espace de travail CodeMender dans le répertoire du projet cible et vérifier la configuration de votre environnement.
Étape 1 : Initialiser l'espace de travail CodeMender (cm init)
Exécutez cm init à partir de la racine du répertoire de votre projet pour initialiser les fichiers de suivi de l'état local et établir des configurations de référence :
cm init
Résultat :
✅ Initialized CodeMender workspace at /home/user/.codemender
Étape 2 : Exécutez des diagnostics d'état de bout en bout (cm health)
Avant de lancer une session d'agent, exécutez cm health pour vérifier vos identifiants, votre configuration, votre accessibilité et votre autorisation :
cm health
Résultat :
CodeMender Health Check ─────────────────────── Backend: iapi Endpoint: https://aiplatform.googleapis.com Location: global Project: my-gcp-project ✓ credentials passed (0ms) Token acquired for project "my-gcp-project" ✓ config passed (0ms) Configuration valid (backend "iapi") ✓ reachability passed (250ms) Endpoint https://aiplatform.googleapis.com responded ✓ authorization passed (68ms) Caller authorized for project "my-gcp-project" Status: HEALTHY (exit code 0, 319ms)
Étape 3 : Comprendre les paramètres de configuration (config.yaml)
CodeMender crée un fichier de configuration d'espace de travail dans .codemender/config.yaml (ou ~/.codemender/config.yaml). Ce fichier définit les limites des règles, les règles d'inclusion de fichiers et les hooks de vérification des tests :
# CodeMender CLI configuration.
# The server endpoint is baked in at build time (see build profiles).
# Override it here only if you need a different endpoint.
server: {}
location: "global" # Service location: "global" (default), "us", "eu", or "us-central1" (overridden by $CM_LOCATION)
# Customer-supplied team identifier sent as the X-CodeMender-Team-Id
# telemetry header. Overridden by --team-id flag or $CM_TEAM_ID env var.
# Max 63 chars, must match [A-Za-z0-9._-]. Omit to skip the header.
# team_id: "acme-security"
scan:
extensions:
include: [".py", ".java", ".go", ".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".c", ".cc", ".cpp", ".cxx", ".h", ".hh", ".hpp", ".hxx", ".inl", ".ipp", ".cs", ".rs", ".kt", ".kts", ".rb", ".php", ".sol", ".tf", ".hcl"]
exclude: [".min.js", ".generated.go", ".pb.go"]
# A leading "/" matches only that directory at the scan root.
exclude_dirs: ["node_modules", "vendor", "dist", "/target", "/obj", "/build", ".gradle"]
max_file_size_kb: 2048 # Maximum file size for discovery (2048 KB / 2 MiB)
incremental: true
# Restrict agent file access to these directories (all commands).
# When empty, the scan target directory is used as the boundary.
# project_paths: []
output:
format: table # "table", "json", "sarif"
tools:
confirm_commands: true # Prompt Y/N before running shell commands (default: true)
confirm_writes: true # Prompt Y/N before writing/modifying files (default: true)
# cleanup_candidate_branches: true # Auto-delete temporary candidate branches on completion (default: true)
# Use --yes flag on find/fix/session resume to skip all confirmations
# Version Control and Automated Testing Guardrails
vcs:
type: "" # VCS type: "git", "mercurial", "custom", or "" (auto-detect)
commands:
reset: "" # Shell command to reset codebase (auto-populated for known VCS)
diff: "" # Shell command to show changes (auto-populated for known VCS)
status: "" # Shell command to list modified files (auto-populated for known VCS)
stage: "" # Shell command to stage changes (auto-populated for known VCS)
build:
command: "npm test" # Shell command to build/verify changes from the agent
sandbox:
enabled: true # Process-level OS sandbox (default: true)
mounts:
target_dir: "."
network:
profile: "permissive-closed" # Complete network isolation; set to "permissive-open" if build requires internet
security:
protected_files: [] # Files mounted read-only inside sandbox (e.g. ["~/.ssh/*"])
6. Découvrez les failles avec cm find .
⏱️ Durée : 7:00
Dans cette étape, vous allez exécuter cm find . --quick pour lancer une analyse de sécurité agentive sur la codebase Juice Shop.
Étape 1 : Exécutez cm find . --quick.
À partir de CodeMender v0.16.0, cm find <path> est défini par défaut sur Analyse approfondie (
--deep
) pour une analyse exhaustive fichier par fichier, tandis que l'analyse rapide (
--quick
) permet de trier rapidement les dépôts. Exécutez cm find . --quick pour effectuer une analyse rapide du dépôt OWASP Juice Shop (durée d'exécution estimée : environ 8 minutes pour le tri complet de la codebase de 684 fichiers) :
cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash
cm lance une session d'analyse sur Gemini Enterprise Agent Platform, en analysant les fichiers de code source dans tous les modules du dépôt :
⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository. 🔍 Discovering files in /home/user/juice-shop... Found 684 source files 🚀 Starting FIND session (mode: QUICK)... Server: https://aiplatform.googleapis.com Session: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu Operation: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu 📂 Scan target: /home/user/juice-shop 🔒 Sandbox roots (agent can only access these directories): • /home/user/juice-shop 📡 Waiting for server (https://aiplatform.googleapis.com)... ──────────────────────────────────────────────────────────── 2026-10-29T03:01:47Z [INFO] 🔧 [Step 1] list_dir → /home/user/juice-shop 2026-10-29T03:01:56Z [INFO] 🔧 [Step 2] list_dir → .../juice-shop/routes 2026-10-29T03:02:08Z [INFO] 🔧 [Step 3] read_file → .../juice-shop/server.ts 2026-10-29T03:02:47Z [INFO] 🔧 [Step 7] read_file → .../juice-shop/routes/login.ts 2026-10-29T03:02:56Z [INFO] 🔧 [Step 8] read_file → .../juice-shop/routes/search.ts 2026-10-29T03:03:48Z [INFO] 🔧 [Step 13] read_file → .../juice-shop/routes/fileUpload.ts 2026-10-29T03:04:30Z [INFO] 🔧 [Step 16] read_file → .../juice-shop/routes/userProfile.ts 2026-10-29T03:06:11Z [INFO] 🔧 [Step 25] read_file → .../juice-shop/routes/trackOrder.ts 2026-10-29T03:07:57Z [INFO] 🔧 [Step 33] read_file → .../juice-shop/routes/order.ts 2026-10-29T03:09:30Z [INFO] ✅ Completed 33 tool steps in 7m48s | Tokens: 2.6M in / 8k out / 2.7M total ──────────────────────────────────────────────────────────── 🔒 Found 12 vulnerabilities: ID SEVERITY TYPE FILE TITLE CONFIDENCE ──────── ──────── ──── ──── ───── ────────── 43aa7446 🔴 CRITICAL SQL INJECTION routes/login.ts SQL Injection in User Login Handler Allows Authentication Bypass 100% dd83d0a4 🟠 HIGH SQL INJECTION routes/search.ts UNION-Based SQL Injection in Product Search Allows Database Exfiltration 100% 4dfe2409 🟠 HIGH CODE INJECTION routes/userProfile.ts Remote Code Execution via Eval in User Profile Template Handler 100% 79d490b0 🟠 HIGH PATH TRAVERSAL routes/fileUpload.ts Path Traversal (Zip Slip) in Zip File Upload Allows Arbitrary File Overwrite 100% 4f2b050c 🟠 HIGH XML EXTERNAL ENTITY (XXE) routes/fileUpload.ts XML External Entity (XXE) Injection in File Upload Route Leaks System Files 100% 1ece0e25 🟠 HIGH IMPROPER ACCESS CONTROL server.ts Missing Authorization on Product Update Endpoint Allows Unauthorized Product Tampering 100% 757fd438 🟠 HIGH CWE-943 routes/trackOrder.ts NoSQL / JavaScript Injection in Order Tracking Allows Database Record Exfiltration 100% 349bac9f 🟡 MEDIUM SERVER-SIDE REQUEST FORGERY (SSRF) routes/profileImageUrlUpload.ts Server-Side Request Forgery (SSRF) in Profile Image URL Upload Route 100% be5e1459 🟡 MEDIUM OPEN REDIRECT routes/redirect.ts Open Redirect via Inadequate Allowlist Substring Match 100% 06ecf8a5 🟡 MEDIUM INSECURE DIRECT OBJECT REFERENCE (IDOR) routes/basket.ts Insecure Direct Object Reference (IDOR) Allows Access to Arbitrary User Baskets 100% 02f6a293 🟡 MEDIUM PATH TRAVERSAL routes/dataErasure.ts Local File Read via Insecure Template Layout Parameter in Data Erasure Route 100% 95ee59a3 🟡 MEDIUM CWE-943 routes/updateProductReviews.ts NoSQL Injection in Product Review Update Endpoint Allows Mass Modification 100% Summary: 1 CRITICAL, 6 HIGH, 5 MEDIUM Run 'cm report' for detailed analysis, 'cm verify <finding-id>' to validate, or 'cm fix <finding-id>' to generate a patch. 2026-10-29T03:09:30Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T030140Z_ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu.log
Étape 2 : Examinez les résultats de l'analyse via cm report
Exécutez cm report -f table pour afficher tous les résultats de sécurité détectés dans la base de données d'état SQLite locale :
cm report -f table
Résultat :
┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐ │ID │Severity │Status│Fix│File │Title │ ├──────────┼───────────┼──────┼───┼──────────────────────────────┼────────────────────────────────────────┤ │ 43aa7446 │🔴 CRITICAL│OPEN │— │routes/login.ts │SQL Injection in User Login Handler A...│ │ dd83d0a4 │🟠 HIGH │OPEN │— │routes/search.ts │UNION-Based SQL Injection in Product ...│ │ 4dfe2409 │🟠 HIGH │OPEN │— │routes/userProfile.ts │Remote Code Execution via Eval in Use...│ │ 79d490b0 │🟠 HIGH │OPEN │— │routes/fileUpload.ts │Path Traversal (Zip Slip) in Zip File...│ │ 4f2b050c │🟠 HIGH │OPEN │— │routes/fileUpload.ts │XML External Entity (XXE) Injection i...│ │ 1ece0e25 │🟠 HIGH │OPEN │— │server.ts │Missing Authorization on Product Upda...│ │ 757fd438 │🟠 HIGH │OPEN │— │routes/trackOrder.ts │NoSQL / JavaScript Injection in Order...│ │ 349bac9f │🟡 MEDIUM │OPEN │— │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│ │ be5e1459 │🟡 MEDIUM │OPEN │— │routes/redirect.ts │Open Redirect via Inadequate Allowlis...│ │ 06ecf8a5 │🟡 MEDIUM │OPEN │— │routes/basket.ts │Insecure Direct Object Reference (IDO...│ │ 02f6a293 │🟡 MEDIUM │OPEN │— │routes/dataErasure.ts │Local File Read via Insecure Template...│ │ 95ee59a3 │🟡 MEDIUM │OPEN │— │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│ └──────────┴───────────┴──────┴───┴──────────────────────────────┴────────────────────────────────────────┘ 12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 0 fixed, 🔴 12 open 📋 Report generated at 2026-10-29 03:10:05 UTC 2026-10-29T03:10:05Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T031005Z_pending.log
Étape 3 : Comprendre les états du cycle de vie et les niveaux de gravité des résultats
CodeMender suit les failles à travers un cycle de vie formel en quatre états :
État du résultat | Signification et gestion de la transition |
| La faille a été découverte (ou importée), mais n'a pas encore été vérifiée, corrigée ni ignorée. |
| CodeMender a généré un correctif, appliqué la différence et vérifié que les suites de compilation/test réussissent et que les exploits échouent. |
| Marqué comme inactif en raison d'un faible niveau de confiance, d'un modèle de menace hors champ ou d'un faux positif vérifié. Désactive les alertes futures. |
| Une faille précédemment |
Classification par niveau de gravité
🔴 CRITICAL : risque immédiat et grave (par exemple, exécution de code à distance, injection SQL non authentifiée) directement accessible depuis des limites non fiables.
🟠 HIGH : faille grave (par exemple, lecture arbitraire de la base de données, élévation des privilèges) nécessitant un contexte utilisateur spécifique ou des conditions enchaînées.
🟡 MEDIUM : risque modéré avec un champ d'application limité ou nécessitant une interaction de l'utilisateur (par exemple, redirection ouverte, CSRF).
LOW : failles d'hygiène de défense en profondeur ou vecteurs de reconnaissance ayant un impact direct minimal.
7. Vérifier les failles et examiner les artefacts de vérification capturés
⏱️ Durée : 10:00
L'une des principales fonctionnalités de CodeMender est la génération automatique d'artefacts de vérification persistants chaque fois que vous exécutez cm verify. Vérifions le résultat critique "Injection SQL" dans routes/login.ts (illustré par 43aa7446 dans ce tutoriel) et examinons les artefacts créés par l'agent.
Étape 1 : Exécutez cm verify <login-finding-id>.
Recherchez l'ID de résultat pour routes/login.ts dans votre table cm report (par exemple, 43aa7446), puis exécutez cm verify <finding-id> --sandbox=false --bypass-warning -y (temps d'exécution estimé : environ 20 minutes pour exécuter les étapes de l'outil autonome, démarrer les services d'arrière-plan et exécuter les scripts d'exploitation PoC en direct) :
# Replace 43aa7446 with your actual login.ts finding ID
# --sandbox=false turns off only the OS-level sandbox; the path boundary and command policy stay enforced
cm verify 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
Résultat :
⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository. 🔬 Verifying finding: SQL Injection in User Login Handler Allows Authentication Bypass ID: 43aa7446-40de-467d-8ca4-8571dca16036 File: /home/user/juice-shop/routes/login.ts Severity: 🔴 CRITICAL Type: SQL INJECTION Resetting workspace at /home/user/juice-shop 🔧 Running: git checkout HEAD -- . && git clean -fd Removing .cm_project ✅ Reset complete. Ready for vulnerability research. 🚀 Starting VERIFY session... Server: https://aiplatform.googleapis.com Session: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu Operation: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu 📂 Scan target: /home/user/juice-shop/routes 🔒 Sandbox boundary (agent can explore within): • /home/user/juice-shop 📡 Waiting for verification agent (https://aiplatform.googleapis.com)... ──────────────────────────────────────────────────────────── 2026-10-29T03:11:31Z [INFO] 🔧 [Step 1] run_command → mkdir -p /home/user/juice-shop/.exploit 2026-10-29T03:11:42Z [INFO] 🔧 [Step 2] read_file → .../juice-shop/routes/login.ts 2026-10-29T03:12:03Z [INFO] 🔧 [Step 4] read_file → .../juice-shop/package.json 2026-10-29T03:12:14Z [INFO] 🔧 [Step 5] write_to_file → .../juice-shop/.exploit/PLAN.md 2026-10-29T03:19:00Z [INFO] 🔧 [Step 25] run_command → npm run build:server 2026-10-29T03:29:20Z [INFO] 🔧 [Step 61] write_to_file → .../juice-shop/.exploit/info.yaml 2026-10-29T03:29:53Z [INFO] 🔧 [Step 63] write_to_file → .../juice-shop/.exploit/LOG.md 2026-10-29T03:30:17Z [INFO] 🔧 [Step 64] write_to_file → .../juice-shop/.exploit/REPORT.md 2026-10-29T03:30:55Z [INFO] 🔧 [Step 66] run_command → git status --short 2026-10-29T03:31:46Z [INFO] ✅ Completed 66 tool steps in 20m23s | Tokens: 2.8M in / 7k out / 2.8M total ──────────────────────────────────────────────────────────── 2026-10-29T03:31:46Z [INFO] Artifacts manifest written: /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu/manifest.json (7 artifacts) 📦 Captured 7 agent artifacts in /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu Resetting workspace at /home/user/juice-shop 🔧 Running: git checkout HEAD -- . && git clean -fd Removing .cm_project Removing .exploit/LOG.md Removing .exploit/PLAN.md Removing .exploit/REPORT.md Removing .exploit/exploit.sh Removing .exploit/info.yaml Removing .exploit/server_runner.js ✅ Reset complete. Ready for vulnerability research. 📥 Copying 7 finding artifact(s) to workspace... • /home/user/juice-shop/.exploit/LOG.md • /home/user/juice-shop/.exploit/PLAN.md • /home/user/juice-shop/.exploit/REPORT.md • /home/user/juice-shop/.exploit/exploit.sh • /home/user/juice-shop/.exploit/info.yaml • /home/user/juice-shop/.exploit/server.log • /home/user/juice-shop/.exploit/server_runner.js 🚀 Programmatically running exploit script to confirm: /home/user/juice-shop/.exploit/exploit.sh EXPLOIT SUCCESSFUL ✅ Exploit execution succeeded. Finding VERIFIED (confidence: 100%) Run 'cm report' to see updated findings. 2026-10-29T03:31:52Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T031121Z_ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu.log
Étape 2 : Présentation des artefacts de validation capturés
À partir de CodeMender v0.16.0, les artefacts de vérification sont standardisés à la racine du dépôt sous .exploit/, tout en conservant une copie persistante dans ~/.codemender/artifacts/<session-id>/. Il s'agit de fichiers de travail locaux plutôt que de fichiers faisant partie de votre correctif. Vous les exclurez donc de Git avant de préparer le correctif dans la section suivante. Exécutez ls -la .exploit/ pour les lister :
ls -la .exploit/
Résultat :
total 40 drwxrwxr-x 2 user user 4096 Oct 29 03:31 . drwxrwxr-x 35 user user 4096 Oct 29 03:31 .. -rwxr-xr-x 1 user user 3272 Oct 29 03:31 exploit.sh -rw-r--r-- 1 user user 313 Oct 29 03:31 info.yaml -rw-r--r-- 1 user user 2196 Oct 29 03:31 LOG.md -rw-r--r-- 1 user user 771 Oct 29 03:31 PLAN.md -rw-r--r-- 1 user user 6387 Oct 29 03:31 REPORT.md -rw-rw-r-- 1 user user 2438 Oct 29 03:31 server.log -rw-rw-r-- 1 user user 462 Oct 29 03:31 server_runner.js
Fichier d'artefact | Catégorie | Purpose |
| Fichier manifeste de métadonnées | YAML structuré définissant l'UUID, le titre, la gravité ( |
| Stratégie d'agent | Plan de vérification par étapes et checklist exécutés de manière autonome par le moteur de raisonnement CodeMender. |
| Journal de trace d'exécution | Piste d'audit horodatée enregistrant chaque appel d'outil, point de terminaison de requête HTTP et résultat de test. |
| Journal de l'exécuteur/du serveur d'assistance | Script d'assistance créé par l'agent pour démarrer Juice Shop à des fins de test, et sortie du serveur capturée. |
| Wrapper d'exécution/PoC autonome | Wrapper de script shell lançant le service cible et appelant le client PoC, validant les réponses HTTP 200. |
| Analyse des causes fondamentales | Synthèse, analyse ligne par ligne des failles, répartition SQL brute et recommandations de paramétrage Sequelize. |
Étape 3 : Présentation détaillée des éléments clés des artefacts de validation
L'agent écrit ces artefacts à chaque exécution. Leur contenu exact diffère donc à chaque fois. Ouvrez-les dans l'éditeur Cloud Shell (ou avec cat) et recherchez les éléments suivants :
Artefact | Ce qu'il faut chercher |
| ID complet, titre, gravité, confiance et tags du résultat, tels que |
| La checklist suivie par l'agent, de la lecture du fichier signalé à l'écriture du script de reproduction. |
| Actions et résultats horodatés, y compris le résultat de chaque exécution du script de reproduction. |
| Le script de reproduction autonome : comment il démarre l'application, quel point de terminaison il cible et comment il détermine la réussite (il affiche |
| Fichiers d'aide créés par l'agent pour démarrer Juice Shop à des fins de test, et sortie de ce serveur. |
| L'analyse des causes principales : la ligne vulnérable dans |
8. Corriger l'injection SQL avec cm fix
⏱️ Durée : 10:00
Maintenant que nous avons vérifié le résultat d'injection SQL dans routes/login.ts (ID d'exemple 43aa7446) et examiné ses artefacts, exécutons cm fix pour appliquer un correctif de requête paramétrée automatisé.
Étape 1 : Exécutez cm fix <login-finding-id> -y.
Exécutez cm fix <finding-id> --sandbox=false --bypass-warning -y (remplacez 43aa7446 par l'ID du résultat de connexion réel de cm report) pour synthétiser et appliquer un correctif :
# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
Résultat :
⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🩹 Fixing finding: SQL Injection in User Login Handler Allows Authentication Bypass
File: /home/user/juice-shop/routes/login.ts
Severity: CRITICAL
🔒 Sandbox roots (agent can only access these directories):
• /home/user/juice-shop
Found latest VERIFY session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu for finding 43aa7446-40de-467d-8ca4-8571dca16036
Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Resetting workspace at /home/user/juice-shop
🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project
Removing .exploit/LOG.md
Removing .exploit/PLAN.md
Removing .exploit/REPORT.md
Removing .exploit/exploit.sh
Removing .exploit/info.yaml
Removing .exploit/server_runner.js
✅ Reset complete. Ready for vulnerability research.
📥 Copying 7 finding artifact(s) to workspace...
• /home/user/juice-shop/.exploit/LOG.md
• /home/user/juice-shop/.exploit/PLAN.md
• /home/user/juice-shop/.exploit/REPORT.md
• /home/user/juice-shop/.exploit/exploit.sh
• /home/user/juice-shop/.exploit/info.yaml
• /home/user/juice-shop/.exploit/server.log
• /home/user/juice-shop/.exploit/server_runner.js
Session: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu
Operation: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu
📡 Waiting for fix agent (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:41:30Z [INFO] 🔧 [Step 4] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:41:58Z [INFO] 🔧 [Step 6] run_command → npm run test:server
2026-10-29T03:43:11Z [INFO] 🔧 [Step 9] grep_search → pattern="sequelize\\.query" path=.../juice-shop/routes
2026-10-29T03:43:54Z [INFO] 🔧 [Step 12] read_file → .../juice-shop/routes/vulnCodeSnippet.ts
2026-10-29T03:44:41Z [INFO] 🔧 [Step 13] read_file → .../juice-shop/routes/vulnCodeFixes.ts
2026-10-29T03:53:14Z [INFO] 🔧 [Step 31] search_and_replace → .../juice-shop/routes/login.ts
2026-10-29T03:53:52Z [INFO] 🔧 [Step 33] run_command → npm run build:server
2026-10-29T03:55:23Z [INFO] 🔧 [Step 37] run_command → npm run test:server
2026-10-29T03:55:49Z [INFO] 🔧 [Step 38] run_command → git diff
2026-10-29T03:57:18Z [INFO] ✅ Completed 43 tool steps in 16m54s | Tokens: 1.6M in / 4k out / 1.6M total
────────────────────────────────────────────────────────────
✨ Patch generated successfully!
diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {
return (req: Request, res: Response, next: NextFunction) => {
verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
- models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+ models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+ replacements: {
+ email: typeof req.body?.email === 'string' ? req.body.email : '',
+ password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+ },
+ model: UserModel,
+ plain: true
+ }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
.then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
const user = utils.queryResultToJson(authenticatedUser)
if (user.data?.id && user.data.totpSecret !== '') {
────────────────────────────────────────────────────────────
2026-10-29T03:57:18Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T034021Z_ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu.log
Étape 2 : Inspectez l'état et la différence du VCS à l'aide de cm vcs
Exécutez cm vcs status et cm vcs diff pour afficher les fichiers de l'espace de travail modifiés :
cm vcs status
cm vcs diff
Résultat :
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts ?? .cm_project ?? .exploit/ 2026-10-29T03:59:47Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T035947Z_pending.log
Les deux entrées non suivies sont des fichiers locaux de CodeMender, qui ne font pas partie du correctif : .exploit/ contient les artefacts de validation de cm verify, et .cm_project marque la racine du projet pour CodeMender. Vous les exclurez de votre commit à l'étape suivante.
Et cm vcs diff :
🔍 Running diff in /home/user/juice-shop: git diff
diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {
return (req: Request, res: Response, next: NextFunction) => {
verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
- models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+ models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+ replacements: {
+ email: typeof req.body?.email === 'string' ? req.body.email : '',
+ password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+ },
+ model: UserModel,
+ plain: true
+ }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
.then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
const user = utils.queryResultToJson(authenticatedUser)
if (user.data?.id && user.data.totpSecret !== '') {
Étape 3 : Préparer le correctif validé avec cm vcs stage
Une fois que vous avez examiné le diff unifié et confirmé que la correction répond à vos normes de qualité et de sécurité, préparez le correctif pour le commit. Comme cm vcs stage exécute git add -A, il prépare chaque modification de l'arborescence de travail, y compris les entrées .exploit/ et .cm_project non suivies de l'étape 2. Tout d'abord, ajoutez-les à .git/info/exclude, un fichier d'exclusion local que Git ne valide jamais, afin que seul le correctif soit indexé :
# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude
Ensuite, préparez les modifications à l'aide de cm vcs stage :
cm vcs stage
Résultat :
📦 CodeMender VCS Stage ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git add -A ────────────────────────────────────────────────── 2026-10-29T04:00:06Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T040006Z_pending.log ✅ Changes staged successfully.
Vérifiez que seul le correctif est préparé dans Git :
cm vcs status
Résultat :
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts
Si vous avez exécuté cm vcs stage avant de mettre à jour .git/info/exclude, annulez la mise en préproduction des fichiers CodeMender avec git restore --staged .exploit .cm_project. Les fichiers restent sur le disque. Ils sont uniquement supprimés de la zone de préproduction.
Étape 4 : Validez le correctif et effacez les artefacts de vérification
Validez le correctif préparé avant de corriger le résultat suivant : chaque exécution de cm fix et cm verify commence par réinitialiser l'espace de travail (git checkout HEAD -- . && git clean -fd), ce qui supprime les modifications non validées. Supprimez ensuite le dossier .exploit/ local afin que la correction suivante démarre à partir d'un espace de travail propre. Comme .exploit/ est désormais ignoré, git clean -fd ne le supprime plus pour vous. Une copie persistante des artefacts reste dans ~/.codemender/artifacts/<session-id>/.
git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/
Si Git vous demande votre identité, exécutez git config user.name "Your Name" et git config user.email "you@example.com" dans le dépôt, puis effectuez un nouveau commit.
9. Valider les correctifs, gérer les sessions et exporter des rapports (cm report)
⏱️ Durée : 8:00
Après avoir appliqué un correctif de sécurité généré par l'IA, il est essentiel de gérer les sessions actives, d'inspecter les statistiques d'utilisation des jetons et de générer des rapports de conformité de sécurité d'entreprise à l'aide de cm report.
Étape 1 : Gérer les sessions avec état (cm session list / resume / cancel)
CodeMender suit chaque tâche d'analyse, de vérification et de correction en tant que session avec état dans sa base de données SQLite locale (~/.codemender/state.db). Exécutez cm session list pour inspecter vos sessions :
cm session list
Résultat :
SESSION_ID TYPE STATUS TARGET CREATED RESUMABLE ────────── ──── ────── ────── ─────── ───────── ChA0Yjll FIX ✅ COMPLETED ...40de-467d-8ca4-8571dca16036 2026-10-29T03:40:21 — ChBkZTRh VERIFY ✅ COMPLETED ...40de-467d-8ca4-8571dca16036 2026-10-29T03:11:21 — ChBjMjI4 FIND ✅ COMPLETED /home/user/juice-shop 2026-10-29T03:01:40 — 3 session(s) total 2026-10-22T02:24:43Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022443Z_pending.log
Étape 2 : Exécutez cm report pour vérifier les résultats corrigés
Exécutez cm report -f table pour afficher les états mis à jour des résultats (notez que les résultats corrigés affichent désormais FIXED avec ✅ applied dans la colonne Fix) :
cm report -f table
Résultat :
┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐ │ID │Severity │Status│Fix │File │Title │ ├──────────┼───────────┼──────┼──────────┼──────────────────────────────┼────────────────────────────────────────┤ │ 43aa7446 │🔴 CRITICAL│FIXED │✅ applied│routes/login.ts │SQL Injection in User Login Handler A...│ │ dd83d0a4 │🟠 HIGH │OPEN │— │routes/search.ts │UNION-Based SQL Injection in Product ...│ │ 4dfe2409 │🟠 HIGH │OPEN │— │routes/userProfile.ts │Remote Code Execution via Eval in Use...│ │ 79d490b0 │🟠 HIGH │OPEN │— │routes/fileUpload.ts │Path Traversal (Zip Slip) in Zip File...│ │ 4f2b050c │🟠 HIGH │OPEN │— │routes/fileUpload.ts │XML External Entity (XXE) Injection i...│ │ 1ece0e25 │🟠 HIGH │OPEN │— │server.ts │Missing Authorization on Product Upda...│ │ 757fd438 │🟠 HIGH │OPEN │— │routes/trackOrder.ts │NoSQL / JavaScript Injection in Order...│ │ 349bac9f │🟡 MEDIUM │OPEN │— │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│ │ be5e1459 │🟡 MEDIUM │OPEN │— │routes/redirect.ts │Open Redirect via Inadequate Allowlis...│ │ 06ecf8a5 │🟡 MEDIUM │OPEN │— │routes/basket.ts │Insecure Direct Object Reference (IDO...│ │ 02f6a293 │🟡 MEDIUM │OPEN │— │routes/dataErasure.ts │Local File Read via Insecure Template...│ │ 95ee59a3 │🟡 MEDIUM │OPEN │— │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│ └──────────┴───────────┴──────┴──────────┴──────────────────────────────┴────────────────────────────────────────┘ 12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 1 fixed, 🔴 11 open 📋 Report generated at 2026-10-29 04:01:10 UTC 2026-10-29T04:01:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T040110Z_pending.log
Étape 3 : Vérifiez l'utilisation des jetons à l'aide de cm stats
Exécutez cm stats pour inspecter la consommation de jetons locaux dans les différents modes d'analyse (cm find --quick, cm verify et cm fix) :
cm stats
Résultat :
COMMAND REQUESTS POLLS INPUT OUTPUT CACHED THOUGHT TOOL_CALLS TOTAL CACHE_HIT% THINK_RATIO% DURATION ─────── ──────── ───── ───── ────── ────── ─────── ────────── ───── ────────── ──────────── ──────── total 3 186 10.7M 23.1k 9.9M 55.5k 0 10.8M 91.8% 70.7% 35m 54s cm find --quick 1 33 2.0M 9.4k 1.8M 15.2k 0 2.1M 90.6% 61.8% 05m 44s cm fix 1 33 870.9k 908 678.6k 20.3k 0 892.2k 77.9% 95.7% 04m 40s cm verify 1 120 7.8M 12.7k 7.3M 20.0k 0 7.9M 93.6% 61.1% 25m 31s 3 turn(s) across 3 command type(s) in the last 7 days 2026-10-22T02:24:46Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022446Z_pending.log
Étape 4 : Générez et prévisualisez le rapport HTML interactif (cm report -f html)
Exportez les résultats de l'analyse et les correctifs appliqués sous la forme d'un tableau de bord HTML interactif autonome :
cm report -f html
cp ~/.codemender/reports/report.html ./report.html
Pour afficher report.html dans Google Cloud Shell :
Démarrez un serveur Web d'aperçu local dans votre terminal Cloud Shell :
python3 -m http.server 8080
Dans la barre d'outils en haut à droite de Cloud Shell, cliquez sur le bouton Aperçu sur le Web (icône représentant un œil/un écran) ➔ Prévisualiser sur le port 8080 pour afficher le tableau de bord de conformité interactif dans votre navigateur.
(Alternative) Dans l'explorateur de fichiers de l'éditeur Cloud Shell, effectuez un clic droit sur report.html, puis cliquez sur Télécharger pour afficher le fichier dans votre navigateur local.
Étape 5 : Principales fonctionnalités du rapport HTML interactif généré
Voici une description des principaux composants du rapport HTML interactif généré (report.html) :

1. En-tête des métriques exécutives et fiches de stratégie
Métadonnées d'en-tête : affiche les détails du dépôt cible (OWASP Juice Shop), le nombre total de fichiers sources analysés (684 files) et le code temporel de génération UTC.
Grille de fiches de métriques : fournit un aperçu instantané de haut niveau du nombre total de résultats, de la répartition des niveaux de gravité (CRITICAL, HIGH, MEDIUM, LOW) et du nombre total de failles corrigées (FIXED).
2. Tableau récapitulatif interactif des résultats
Matrice des failles : affiche un tableau filtrable contenant ID, Severity, Status (OPEN par rapport à FIXED), CWE Type, File Location, Vulnerability Title et Confidence Score.
3. Analyse approfondie des causes fondamentales et extrait de code source vulnérable
Analyse des causes principales (RCA) : cliquez sur une ligne de résultat pour développer l'analyse des causes principales synthétisée par le modèle de raisonnement de sécurité Gemini.
Extrait de code source vulnérable : affiche les numéros de ligne exacts et le code source avec coloration syntaxique autour du récepteur vulnérable.
4. Diffs de correctifs de correction d'IA synthétisés
Vue des différences unifiée : pour les failles corrigées (FIXED), CodeMender affiche un bloc de différences unifié mettant en évidence les ajouts de code appliqués en vert (+) et le code vulnérable supprimé en rouge (-).
Étape 6 : (Facultatif) Importez les résultats SAST tiers (cm report import)
CodeMender ne se limite pas aux failles découvertes par son propre scanner. Les équipes peuvent importer des résultats SAST externes (par exemple, depuis Semgrep, Snyk, SonarQube ou Fortify) à l'aide d'un schéma JSON standardisé ou d'un assistant interactif, ce qui permet à CodeMender de vérifier et de synthétiser immédiatement les correctifs :
# Create a sample third-party findings JSON file
cat << 'EOF' > ./findings.json
[
{
"file_path": "routes/basket.ts",
"line": 18,
"title": "SQL Injection in Basket Handler",
"message": "Raw basket ID concatenated in query",
"severity": "HIGH",
"vuln_type": "CWE-89"
}
]
EOF
# Ingest findings into CodeMender state database
cm report import --file ./findings.json
Résultat :
Successfully imported 1 findings. 2026-10-22T02:27:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log
10. Effectuer un nettoyage des ressources
⏱️ Durée : 1 minute
Pour éviter d'utiliser inutilement de l'espace disque dans votre environnement Google Cloud Shell et nettoyer les ressources temporaires de l'atelier, suivez ces étapes de nettoyage.
Étape 1 : Videz le cache local de CodeMender et supprimez le dépôt
CodeMender fournit une commande cm clean intégrée pour purger la base de données des résultats locaux (~/.codemender/state.db), les rapports HTML et les fichiers de sauvegarde source. Exécutez les commandes suivantes dans Cloud Shell :
# Purge local SQLite findings cache, HTML reports, and backup files
cm clean
# Remove cloned repository
cd ~
rm -rf ~/juice-shop
Étape 2 : (Facultatif) Désactiver les API Google Cloud
Si vous ne prévoyez pas d'utiliser les API CodeMender ou Agent Platform dans ce projet pour un développement ultérieur, vous pouvez désactiver les API de service :
gcloud services disable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=${PROJECT_ID}
11. Félicitations
⏱️ Durée : 2 minutes
Félicitations ! Vous avez transformé OWASP Juice Shop, une application intentionnellement vulnérable, en un codebase renforcé et sécurisé à l'aide de CodeMender sur Gemini Enterprise Agent Platform de Google Cloud.
Points abordés
Correction autonome en boucle fermée : CodeMender va au-delà du bruit des alertes statiques passives en exécutant un cycle de vie de sécurité complet et autonome, de la découverte du dépôt (cm find) à la vérification des failles dans un bac à sable (cm verify) et à la synthèse des correctifs testés pour les régressions (cm fix).
Preuves d'exploitation basées sur des preuves : en capturant des artefacts de vérification tangibles (PLAN.md, LOG.md, exploit.sh, REPORT.md), CodeMender élimine les faux positifs et prouve l'exploitabilité réelle avant d'écrire du code.
Correctifs idiomatiques et contextuels : au lieu d'appliquer des remplacements de texte génériques, les agents de raisonnement Gemini analysent l'architecture de l'application, les modèles de données et les ORM pour produire des correctifs propres et faciles à gérer (comme des requêtes Sequelize paramétrées) qui préservent la logique métier existante.
Mesures de sécurité et de test intégrées : chaque correction proposée est automatiquement validée par rapport aux suites de tests du projet (npm test) et aux vérificateurs de types (tsc) dans des bacs à sable d'espace de travail isolés avant que les modifications ne soient préparées.
Changement d'état d'esprit des développeurs
Workflow SAST manuel traditionnel | Correction autonome avec CodeMender (cm) |
Lassitude face aux alertes : des heures passées à trier des rapports bruyants avec des taux élevés de faux positifs. | Agentic Code Discovery ( |
Vérification manuelle du PoC : création de charges utiles curl et de scripts d'attaque personnalisés pour confirmer les failles. | Preuves d'exploitation automatisées ( |
Refactorisation manuelle à haut risque : correction manuelle de requêtes de base de données complexes, ce qui introduit souvent des erreurs de syntaxe ou d'exécution. | Synthèse de correctifs idiomatiques ( |
Risques de régression en production : les correctifs de sécurité interrompent fréquemment la logique métier ou les tests en aval. | Limites de test automatisées : validation continue par rapport aux suites de tests locales et aux bacs à sable de processus isolés. |
Compilations manuelles de conformité : regrouper manuellement les résultats dans des documents statiques pour les examens d'audit. | Télémétrie et SARIF standardisés ( |
Étapes suivantes
🚀 Poursuivez la trilogie CodeMender :
Partie 2 : Sécuriser votre pipeline CI/CD avec CodeMender : automatisez l'analyse continue sans interface graphique, l'intégration du tableau de bord SARIF et les demandes d'extraction d'autoréparation dans GitHub Actions.
Partie 3 : Sécuriser le vibe-coding avec Antigravity et CodeMender – Associez le développement d'IA générative à un assistant de sécurité autonome.
📖 Consultez la documentation :
Documentation CodeMender sur Google Cloud
Solutions de sécurité Google Cloud
💡 Appliquez ces principes à vos propres projets :
Exécutez cm find . et cm fix sur vos propres dépôts Node.js, Python, Go, Java, Rust ou C/C++.