1. Hinweis
⏱️ Dauer: 03:00
Willkommen beim praktischen Codelab Anwendung mit CodeMender sichern auf der Gemini Enterprise Agent Platform von Google Cloud.
In diesem Workshop schlüpfen Sie in die Rolle eines Cloud Security Engineers, der den OWASP Juice Shop prüfen und sichern soll. Dabei handelt es sich um eine absichtlich anfällige Webanwendung, die mit Node.js, Express, TypeScript und Angular erstellt wurde und als Branchenstandard gilt.
Herkömmliche Sicherheitsscan-Tools (SAST/DAST) überfluten Entwicklungsteams mit Tausenden von statischen Sicherheitsergebnissen, hohen Falsch-Positiv-Raten und keinen umsetzbaren Codekorrekturen. Entwickler verbringen Stunden damit, Logs zu sichten, Datenflüsse zu verfolgen und manuell Patches zu schreiben, die häufig das bestehende Verhalten von Anwendungen beeinträchtigen.
CodeMender revolutioniert die Codesicherheit, indem es die Gemini-LLMs von Google mit einem fein abgestimmten Agenten-Framework umgibt. CodeMender nutzt von Google DeepMind entwickelte Prompts, spezialisierte Sicherheitsfunktionen und die Orchestrierung mehrerer Agenten, um als autonomer KI-Sicherheits-Co-Entwickler Software-Sicherheitslücken direkt in lokalen Quell-Repositories zu finden, zu verifizieren und zu beheben.
Voraussetzungen
- Grundlegendes Verständnis von Sicherheitslücken in Webanwendungen (OWASP Top 10, z. B. SQL-Injection und XSS)
- Grundkenntnisse in JavaScript/TypeScript und Node.js-Anwendungen
- Grundkenntnisse zu Befehlszeilentools
Lerninhalte
- So richten Sie die CodeMender-Befehlszeile (
cm) in Google Cloud Shell ein, authentifizieren sie und initialisieren sie. - Repository automatisch auf ausnutzbare Sicherheitslücken scannen (
cm find) - So validieren Sie Sicherheitslücken in isolierten Sandboxes und prüfen Verifizierungsartefakte (
cm verify). - Kontextsensitive Sicherheitspatches autonom synthetisieren, testen und anwenden (
cm fix) - Token-Telemetrie prüfen und Complianceberichte in mehreren Formaten (
cm stats,cm report) exportieren
Voraussetzungen
- Ein Google Cloud-Projekt mit aktivierter Abrechnung
- Google Cloud Shell mit aktiver Projektverbindung (einschließlich vorinstalliertem
gcloud,gitund Node.js 18+) - Starter-Repository: OWASP Juice Shop GitHub-Repository
2. Einführung in die CodeMender-Architektur
⏱️ Dauer: 04:00
Bevor wir uns mit dem Scannen und Beheben von Codefehlern befassen, sollten wir uns ansehen, wie CodeMender im Hintergrund in der Gemini Enterprise Agent Platform gemäß den offiziellen Architekturstandards von Google Cloud funktioniert.
Die Systemarchitektur: Agent und Client-Daemon

Aus Nutzersicht besteht CodeMender aus zwei Hauptkomponenten:
Gehostete Multi-Agenten-Plattform: Ein gehostetes Multi-Agenten-System, das in Google Cloud ausgeführt wird und die zentrale Geschäftslogik für die Sicherheit, das LLM-Prompt-Engineering und die Sicherheitslogik ausführt.
Lokale Client-CLI und Sandbox-Daemon (cm): Ein Client, der in Google Cloud Shell ausgeführt wird und sowohl als CLI (zum Ausführen von Befehlen wie cm find, cm verify, cm fix) als auch als lokaler Daemon (zum sicheren Ausführen von Befehlen im Namen des Agents in einer isolierten Sandbox auf Prozessebene) fungiert.
Die drei wichtigsten Funktionen zur Problembehebung

CodeMender sorgt in drei integrierten Phasen für Codesicherheit:
Sicherheitslücken finden (cm find): Scannt Codebasen mithilfe eines LLM, das vom Agenten gesteuert wird. Dabei werden spezielle Sicherheitstools und Prompt Engineering verwendet, um das Modell auf Sicherheitslücken zu fokussieren. Alternativ können Ergebnisse aus externen Sicherheitsscans importiert werden.
Sicherheitslücken überprüfen (cm verify): Erstellt Code lokal und versucht, entdeckte Fehler auszunutzen, um zu prüfen, ob sie ausnutzbar sind. Dadurch werden falsch positive Ergebnisse vermieden und persistente Artefakte zur Arbeitsbereichsüberprüfung in .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md) generiert.
Sicherheitslücken beheben (cm fix): Synthetisiert sprachabhängige Quellpatches und verifiziert sie, indem Projekt-Build- und Regressionstest-Suites (npm test) in der lokalen Sandbox ausgeführt werden.
3. OWASP Juice Shop-Umgebung einrichten
⏱️ Dauer: 05:00
In diesem Schritt öffnen Sie Ihre Google Cloud-Terminalumgebung und rufen das Repository der Zielanwendung ab.
Schritt 1: Cloud Shell in der Google Cloud Console öffnen
Öffnen Sie die Google Cloud Console in Ihrem Browser.
Klicken Sie in der oberen Navigationsleiste auf den Button Cloud Shell aktivieren (Symbol >_).
Cloud Shell bietet ein browserbasiertes Linux-Terminal, in dem gcloud, git und Node.js vorinstalliert und authentifiziert sind.
Schritt 2: OWASP Juice Shop-Repository klonen
Klonen Sie in Ihrer Cloud Shell oder Ihrem lokalen Terminal das OWASP Juice Shop-Repository:
git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop
Schritt 3: Wichtige Anwendungsdateien prüfen
OWASP Juice Shop verwendet Express.js im Backend mit TypeScript-Modulen. Sehen Sie sich die Verzeichnisstruktur an:
ls -la routes/ lib/
Sehen Sie sich die wichtigsten Routendateien an, die für die Authentifizierung, Nutzeranfragen und die Warenkorbverwaltung zuständig sind:
routes/login.ts: Übernimmt die Nutzerauthentifizierung und die Ausführung von Roh-SQL-Abfragen.
routes/search.ts: Übernimmt die Produktsuche und das Rendern von Antworten.
routes/basket.ts: Ruft den Einkaufswagen des Nutzers ab.
routes/trackOrder.ts: Verarbeitet die Bestellverfolgung über NoSQL-Abfragen.
lib/xml.ts: Verarbeitet das XML-Parsing und Datei-Uploads.
lib/insecurity.ts: Hilfsprogramme für Sitzungstokens und Verschlüsselung.
4. CodeMender CLI (cm) installieren und GCP-Anmeldedaten authentifizieren
⏱️ Dauer: 08:00
In diesem Schritt aktivieren Sie die erforderlichen Google Cloud APIs, gewähren IAM-Berechtigungen mit gcloud, laden die Binärdatei der cm-Befehlszeile herunter und installieren sie und konfigurieren Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC).
Schritt 1: Erforderliche Google Cloud APIs über gcloud aktivieren
CodeMender erfordert die Agent Platform API (aiplatform.googleapis.com) und die Cloud Resource Manager API (cloudresourcemanager.googleapis.com) auf der Gemini Enterprise Agent Platform.
Rufen Sie in Cloud Shell oder Ihrem Terminal Ihre aktive Projekt-ID ab (oder sehen Sie im Drop-down-Menü für Projekte oben in der Google Cloud Console nach) und aktivieren Sie die erforderlichen Dienst-APIs:
# 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}
Prüfen Sie, ob die APIs aktiviert sind:
gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"
Schritt 2: IAM-Berechtigungen über gcloud gewähren
Für die Interaktion mit der CodeMender Cloud Reasoning Engine muss Nutzern und Dienstkonten die IAM-Rolle roles/aiplatform.user (Agent Platform User) zugewiesen sein.
Ihrem Nutzerkonto über die Befehlszeile eine IAM-Rolle zuweisen
# 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"
Schritt 3: cm-CLI in Cloud Shell herunterladen und installieren
In Google Cloud Shell werden Nutzerdaten dauerhaft im Verzeichnis $HOME gespeichert. Führen Sie die folgenden Befehle aus, um cm in ~/bin zu installieren, ohne dass sudo erforderlich ist. Sie befinden sich noch in ~/juice-shop aus dem vorherigen Abschnitt. Die Befehle werden also in ein temporäres Verzeichnis heruntergeladen, das anschließend bereinigt wird. So landen keine Installationsdateien im Juice Shop-Repository:
# 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
Schritt 4: cm Installation der -Befehlszeile prüfen
Führen Sie cm --version aus, um zu prüfen, ob die Binärdatei der Befehlszeile korrekt installiert ist:
cm --version
Erwartete Ausgabe:
cm version 0.17.0
Schritt 5: Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC) für Google Cloud konfigurieren
Konfigurieren Sie die Standardanmeldedaten für Anwendungen (Application Default Credentials, ADC) von Google Cloud, damit cm Anfragen an die Cloud Reasoning Engine authentifizieren kann:
gcloud auth application-default login
Es wird ein modales Autorisierungsdialogfeld mit der Bezeichnung Cloud Shell autorisieren angezeigt. Klicken Sie auf Autorisieren, um Zugriff zu gewähren.
5. CodeMender-Arbeitsbereich initialisieren und prüfen
⏱️ Dauer: 03:00
Nachdem cm installiert und authentifiziert wurde, initialisieren Sie den CodeMender-Arbeitsbereich im Zielprojektverzeichnis und prüfen die Umgebungseinrichtung.
Schritt 1: CodeMender-Arbeitsbereich initialisieren (cm init)
Führen Sie cm init im Stammverzeichnis Ihres Projektverzeichnisses aus, um lokale Statusverfolgungsdateien zu initialisieren und grundlegende Konfigurationen festzulegen:
cm init
Ausgabe:
✅ Initialized CodeMender workspace at /home/user/.codemender
Schritt 2: End-to-End-Diagnose ausführen (cm health)
Führen Sie vor dem Starten einer Agentensitzung cm health aus, um Ihre Anmeldedaten, Konfiguration, Erreichbarkeit und Autorisierung zu prüfen:
cm health
Ausgabe:
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)
Schritt 3: Konfigurationsparameter verstehen (config.yaml)
CodeMender erstellt eine Arbeitsbereichskonfigurationsdatei unter .codemender/config.yaml (oder ~/.codemender/config.yaml). In dieser Datei werden Richtliniengrenzen, Regeln für die Einbeziehung von Dateien und Hooks für die Testüberprüfung definiert:
# 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. Sicherheitslücken mit cm find . entdecken
⏱️ Dauer: 07:00
In diesem Schritt führen Sie cm find . --quick aus, um einen agentischen Sicherheitsscan für die Juice Shop-Codebasis auszuführen.
Schritt 1: cm find . --quick ausführen
Ab CodeMender v0.16.0 ist cm find <path> standardmäßig auf Deep Scan (
--deep
) für eine umfassende Analyse jeder einzelnen Datei, während Schneller Scan (
--quick
) bietet eine schnelle Repository-Triage. Führen Sie cm find . --quick aus, um einen Schnellscan im OWASP Juice Shop-Repository durchzuführen (Geschätzte Ausführungszeit: ca. 8 Minuten für die vollständige Triage der Codebasis mit 684 Dateien):
cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash
cm startet eine Scansitzung auf der Gemini Enterprise Agent Platform, bei der Quellcodedateien in allen Repository-Modulen analysiert werden:
⚠️ 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
Schritt 2: Scanergebnisse über cm report prüfen
Führen Sie cm report -f table aus, um alle gefundenen Sicherheitsergebnisse aus der lokalen SQLite-Zustandsdatenbank anzuzeigen:
cm report -f table
Ausgabe:
┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐ │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
Schritt 3: Lebenszyklusstatus und Schweregrade von Ergebnissen verstehen
CodeMender verfolgt Sicherheitslücken über einen formalen Lebenszyklus mit vier Status:
Ergebnisstatus | Bedeutung und Übergangsbehandlung |
| Die Sicherheitslücke wurde entdeckt (oder importiert), aber noch nicht verifiziert, gepatcht oder verworfen. |
| CodeMender hat einen Patch generiert, die Differenz angewendet und überprüft, ob die Build-/Test-Suites erfolgreich ausgeführt werden und Exploits fehlschlagen. |
| Aufgrund geringer Zuverlässigkeit, fehlender Bedrohungsmodellierung oder Bestätigung als falsch positiv als inaktiv markiert. Zukünftige Benachrichtigungen werden stummgeschaltet. |
| Ein zuvor |
Schweregradklassifizierungen
🔴 CRITICAL: Unmittelbares, schwerwiegendes Risiko (z.B. Remote-Codeausführung, nicht authentifizierte SQL-Injection), das direkt von nicht vertrauenswürdigen Grenzen aus erreichbar ist.
🟠 HIGH: Schwerwiegender Fehler (z.B. willkürliches Lesen der Datenbank, Rechteausweitung), der einen bestimmten Nutzerkontext oder verkettete Bedingungen erfordert.
🟡 MEDIUM: Mittleres Risiko mit eingeschränktem Umfang oder erforderlicher Nutzerinteraktion (z.B. Open Redirect, CSRF).
🔵 LOW: Mängel bei der Defense-in-Depth-Hygiene oder Aufklärungsvektoren mit minimalen direkten Auswirkungen.
7. Sicherheitslücken überprüfen und erfasste Verifizierungsartefakte durchgehen
⏱️ Dauer: 10:00
Eine der wichtigsten Funktionen von CodeMender ist die automatische Generierung von persistenten Prüfartefakten, wenn Sie cm verify ausführen. Prüfen Sie das kritische SQL-Injection-Ergebnis in routes/login.ts (in dieser Anleitung als 43aa7446 dargestellt) und gehen Sie die vom Agenten erstellten Artefakte durch.
Schritt 1: cm verify <login-finding-id> ausführen
Suchen Sie die Ergebnis-ID für routes/login.ts in der Tabelle cm report (z. B. 43aa7446) und führen Sie cm verify <finding-id> --sandbox=false --bypass-warning -y aus (Geschätzte Ausführungszeit: ca. 20 Minuten, um autonome Toolschritte auszuführen, Hintergrunddienste zu starten und Live-PoC-Exploit-Skripts auszuführen):
# 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
Ausgabe:
⚠️ 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
Schritt 2: Übersicht über die erfassten Bestätigungsartefakte
Ab CodeMender v0.16.0 werden Bestätigungsartefakte im Repository-Stammverzeichnis unter .exploit/ standardisiert, während eine dauerhafte Kopie in ~/.codemender/artifacts/<session-id>/ beibehalten wird. Dies sind lokale Arbeitsdateien und nicht Teil Ihres Fixes. Sie werden daher aus Git ausgeschlossen, bevor Sie den Patch im nächsten Abschnitt bereitstellen. Führen Sie ls -la .exploit/ aus, um sie aufzulisten:
ls -la .exploit/
Ausgabe:
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
Artefaktdatei | Kategorie | Purpose |
| Metadatenmanifest | Strukturierte YAML-Datei, die die UUID, den Titel, den Schweregrad ( |
| Agentenstrategie | Schritt-für-Schritt-Verifizierungsplan und Checkliste, die von der CodeMender-Reasoning-Engine autonom ausgeführt werden. |
| Ausführungs-Trace-Log | Audit-Trail mit Zeitstempel, in dem jeder Toolaufruf, HTTP-Anfrageendpunkt und jedes Testergebnis aufgezeichnet wird. |
| Helper Runner/Server-Log | Hilfsskript, das der Agent zum Starten von Juice Shop für Tests erstellt hat, und die erfasste Serverausgabe. |
| Execution Wrapper / Standalone PoC | Shell-Skript-Wrapper, der den Zieldienst startet und den PoC-Client aufruft, um HTTP-200-Antworten zu validieren. |
| Ursachenanalyse | Kurzfassung, zeilenweise Analyse von Sicherheitslücken, Aufschlüsselung des Roh-SQL-Codes und Empfehlungen zur Sequelize-Parametrisierung. |
Schritt 3: Detaillierte Erläuterung der Highlights der Verifizierungsartefakte
Der KI-Agent erstellt diese Artefakte bei jeder Ausführung neu, sodass sich der genaue Inhalt jedes Mal unterscheidet. Öffnen Sie sie im Cloud Shell-Editor (oder mit cat) und suchen Sie nach Folgendem:
Artefakt | Darauf sollten Sie achten |
| Die vollständige ID, der Titel, der Schweregrad, die Konfidenz und die Tags des Ergebnisses, z. B. |
| Die Checkliste, die der Agent befolgt hat, vom Lesen der gemeldeten Datei bis zum Schreiben des Reproduktionsskripts. |
| Aktionen und Ergebnisse mit Zeitstempel, einschließlich des Ergebnisses jeder Ausführung des Reproduktionsskripts. |
| Das eigenständige Reproduktionsskript: wie es die Anwendung startet, auf welchen Endpunkt es abzielt und wie es den Erfolg bestimmt (es gibt |
| Hilfsdateien, die der KI-Agent erstellt hat, um Juice Shop zu Testzwecken zu starten, und die Ausgabe dieses Servers. |
| Die Ursachenanalyse: die anfällige Zeile in |
8. SQL-Injection mit cm fix beheben
⏱️ Dauer: 10:00
Nachdem wir das SQL-Injection-Ergebnis in routes/login.ts (Beispiel-ID 43aa7446) überprüft und die Artefakte untersucht haben, führen wir cm fix aus, um einen automatisierten Patch für parametrisierte Abfragen anzuwenden.
Schritt 1: cm fix <login-finding-id> -y ausführen
Führen Sie cm fix <finding-id> --sandbox=false --bypass-warning -y aus (ersetzen Sie 43aa7446 durch die tatsächliche ID des Anmeldeergebnisses aus cm report), um eine Korrektur zu synthetisieren und anzuwenden:
# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
Ausgabe:
⚠️ 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
Schritt 2: VCS-Status und -Diff mit cm vcs prüfen
Führen Sie cm vcs status und cm vcs diff aus, um die geänderten Arbeitsbereichsdateien aufzurufen:
cm vcs status
cm vcs diff
Ausgabe:
📂 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
Die beiden nicht verfolgten Einträge sind die lokalen Dateien von CodeMender und nicht Teil der Korrektur: .exploit/ enthält die Verifizierungsartefakte aus cm verify und .cm_project markiert das Projektstammverzeichnis für CodeMender. Im nächsten Schritt werden sie aus dem Commit ausgeschlossen.
Und 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 !== '') {
Schritt 3: Verifizierten Patch mit cm vcs stage bereitstellen
Nachdem Sie das Unified Diff geprüft und bestätigt haben, dass die Korrektur Ihren Qualitäts- und Sicherheitsstandards entspricht, stellen Sie den Patch für den Commit bereit. Da cm vcs stage den Befehl git add -A ausführt, werden alle Änderungen im Arbeitsbaum bereitgestellt, einschließlich der nicht verfolgten Einträge .exploit/ und .cm_project aus Schritt 2. Fügen Sie sie zuerst zu .git/info/exclude hinzu, einer lokalen Ignorierdatei, die von Git nie committet wird, damit nur der Patch bereitgestellt wird:
# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude
Stellen Sie die Änderungen dann mit cm vcs stage bereit:
cm vcs stage
Ausgabe:
📦 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.
Prüfen Sie, ob nur der Patch in Git bereitgestellt ist:
cm vcs status
Ausgabe:
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts
Wenn Sie cm vcs stage ausgeführt haben, bevor Sie .git/info/exclude aktualisiert haben, entfernen Sie die CodeMender-Dateien mit git restore --staged .exploit .cm_project aus dem Staging-Bereich. Die Dateien bleiben auf dem Laufwerk und werden nur aus dem Staging-Bereich entfernt.
Schritt 4: Patch übernehmen und Bestätigungsartefakte löschen
Übernehmen Sie den Patch, bevor Sie das nächste Ergebnis beheben: Jeder cm fix- und cm verify-Lauf beginnt mit dem Zurücksetzen des Arbeitsbereichs (git checkout HEAD -- . && git clean -fd), wodurch nicht übernommene Änderungen verworfen werden. Löschen Sie dann den lokalen Ordner .exploit/, damit die nächste Korrektur in einem sauberen Arbeitsbereich beginnt. Da .exploit/ jetzt ignoriert wird, wird es von git clean -fd nicht mehr entfernt. Eine persistente Kopie der Artefakte verbleibt in ~/.codemender/artifacts/<session-id>/.
git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/
Wenn Git nach Ihrer Identität fragt, führen Sie git config user.name "Your Name" und git config user.email "you@example.com" im Repository aus und führen Sie dann noch einmal einen Commit durch.
9. Patches validieren, Sitzungen verwalten und Berichte exportieren (cm report)
⏱️ Dauer: 08:00
Nachdem Sie eine KI-generierte Sicherheitskorrektur angewendet haben, ist es wichtig, aktive Sitzungen zu verwalten, Statistiken zur Tokennutzung zu prüfen und mit cm report Berichte zur Einhaltung von Sicherheitsrichtlinien in Unternehmen zu erstellen.
Schritt 1: Zustandsorientierte Sitzungen verwalten (cm session list / resume / cancel)
CodeMender verfolgt jeden Scan, jede Überprüfung und jede Korrekturaufgabe als zustandsorientierte Sitzung in seiner lokalen SQLite-Datenbank (~/.codemender/state.db). Führen Sie cm session list aus, um Ihre Sitzungen zu prüfen:
cm session list
Ausgabe:
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
Schritt 2: cm report ausführen, um behobene Ergebnisse zu überprüfen
Führen Sie cm report -f table aus, um die aktualisierten Ergebnisstatus anzuzeigen. Beachten Sie, dass für behobene Ergebnisse jetzt FIXED mit ✅ applied in der Spalte Fix angezeigt wird:
cm report -f table
Ausgabe:
┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐ │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
Schritt 3: Tokennutzung mit cm stats prüfen
Führen Sie cm stats aus, um den lokalen Tokenverbrauch in den verschiedenen Scanmodi (cm find --quick, cm verify und cm fix) zu prüfen:
cm stats
Ausgabe:
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
Schritt 4: Interaktiven HTML-Bericht generieren und in der Vorschau ansehen (cm report -f html)
Exportieren Sie Ihre Scanergebnisse und angewendeten Patches als eigenständiges, interaktives HTML-Dashboard:
cm report -f html
cp ~/.codemender/reports/report.html ./report.html
So rufen Sie report.html in Google Cloud Shell auf:
Starten Sie in Ihrem Cloud Shell-Terminal einen lokalen Webserver für die Vorabversion:
python3 -m http.server 8080
Klicken Sie in der Symbolleiste oben rechts in Cloud Shell auf den Button Webvorschau (Symbol mit Auge/Bildschirm) ➔ Vorschau auf Port 8080, um das interaktive Compliance-Dashboard in Ihrem Browser aufzurufen.
(Alternative) Klicken Sie im Datei-Explorer des Cloud Shell-Editors mit der rechten Maustaste auf report.html und dann auf Herunterladen, um die Datei in Ihrem lokalen Browser anzusehen.
Schritt 5: Wichtige Funktionen des generierten interaktiven HTML-Berichts
Im Folgenden finden Sie eine Übersicht über die wichtigsten Komponenten des generierten interaktiven HTML-Berichts (report.html):

1. Header für Führungskräfte-Messwerte und Statuskarten
Header-Metadaten: Hier werden Details zum Ziel-Repository (OWASP Juice Shop), die Gesamtzahl der gescannten Quelldateien (684 files) und der UTC-Zeitstempel der Erstellung angezeigt.
Messwertkarten-Raster: Bietet einen sofortigen Überblick über die Gesamtzahl der Ergebnisse, die Verteilung der Schweregrade (CRITICAL, HIGH, MEDIUM, LOW) und die Gesamtzahl der behobenen Sicherheitslücken (FIXED).
2. Interaktive Tabelle mit Zusammenfassung der Ergebnisse
Matrix der Sicherheitslücken: Zeigt eine filterbare Tabelle mit ID, Severity, Status (OPEN im Vergleich zu FIXED), CWE Type, File Location, Vulnerability Title und Confidence Score an.
3. Detaillierte Ursachenanalyse und Code-Snippet mit Sicherheitslücke
Minimierbare Analyse (RCA): Wenn Sie auf eine Ergebniszeile klicken, wird die detaillierte Ursachenanalyse maximiert, die vom Gemini-Sicherheits-Reasoning-Modell erstellt wurde.
Snippet des anfälligen Quellcodes: Zeigt die genauen Zeilennummern und den Quellcode mit Syntaxhervorhebung um die anfällige Senke herum an.
4. Synthetisierte KI-Patch-Diffs zur Fehlerbehebung
Unified Diff View: Für behobene Sicherheitslücken (FIXED) rendert CodeMender einen Unified Diff-Block, in dem angewendete Codeergänzungen grün (+) und entfernter anfälliger Code rot (-) hervorgehoben werden.
Schritt 6: (Optional) SAST-Ergebnisse von Drittanbietern importieren (cm report import)
CodeMender ist nicht auf Fehler beschränkt, die von seinem eigenen Scanner erkannt werden. Teams können externe SAST-Ergebnisse (z. B. von Semgrep, Snyk, SonarQube oder Fortify) über ein standardisiertes JSON-Schema oder einen interaktiven Assistenten importieren. CodeMender kann diese dann sofort prüfen und Korrekturen dafür erstellen:
# 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
Ausgabe:
Successfully imported 1 findings. 2026-10-22T02:27:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log
10. Ressourcen bereinigen
⏱️ Dauer: 01:00
Führen Sie die folgenden Schritte aus, um unnötige Speicherplatznutzung in Ihrer Google Cloud Shell-Umgebung zu vermeiden und temporäre Workshop-Ressourcen zu bereinigen.
Schritt 1: Lokalen CodeMender-Cache löschen und Repository entfernen
CodeMender bietet einen integrierten cm clean-Befehl, mit dem die lokale Ergebnisdatenbank (~/.codemender/state.db), HTML-Berichte und Sicherungsdateien der Quelle gelöscht werden können. Führen Sie in Cloud Shell die folgenden Befehle aus:
# Purge local SQLite findings cache, HTML reports, and backup files
cm clean
# Remove cloned repository
cd ~
rm -rf ~/juice-shop
Schritt 2: (Optional) Google Cloud APIs deaktivieren
Wenn Sie die CodeMender- oder Agent Platform-APIs in diesem Projekt nicht für die weitere Entwicklung verwenden möchten, können Sie die Dienst-APIs deaktivieren:
gcloud services disable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=${PROJECT_ID}
11. Glückwunsch
⏱️ Dauer: 02:00
Glückwunsch! Sie haben OWASP Juice Shop mit CodeMender auf der Gemini Enterprise Agent Platform von Google Cloud von einer absichtlich anfälligen Anwendung in eine gehärtete, sichere Codebasis umgewandelt.
Was Sie gelernt haben
Autonome Behebung im geschlossenen Regelkreis: CodeMender geht über passive statische Warnmeldungen hinaus und führt einen vollständigen, selbstgesteuerten Sicherheitslebenszyklus aus – von der Repository-Erkennung (cm find) über die Sandbox-Exploit-Verifizierung (cm verify) bis hin zur regressionstesten Patch-Synthese (cm fix).
Evidenzbasierte Exploit-Nachweise: Durch die Erfassung konkreter Verifizierungsartefakte (PLAN.md, LOG.md, exploit.sh, REPORT.md) eliminiert CodeMender falsch positive Ergebnisse und beweist die tatsächliche Ausnutzbarkeit, bevor Code geschrieben wird.
Kontextbezogene, idiomatische Korrekturen: Anstatt generische Textersetzungen anzuwenden, analysieren die Reasoning-Agents von Gemini die Anwendungsarchitektur, Datenmodelle und ORMs, um saubere, wartbare Patches (z. B. parametrisierte Sequelize-Abfragen) zu erstellen, die die vorhandene Geschäftslogik beibehalten.
Integrierte Sicherheits- und Test-Leitlinien: Jede vorgeschlagene Korrektur wird automatisch anhand von Projekt-Test-Suites (npm test) und Typprüfungen (tsc) in isolierten Arbeitsbereich-Sandboxes validiert, bevor Änderungen bereitgestellt werden.
Umdenken bei Entwicklern
Herkömmlicher manueller SAST-Workflow | Autonome Fehlerbehebung mit CodeMender (cm) |
Benachrichtigungsflut: Stundenlanges Sichten von Berichten mit vielen falsch positiven Ergebnissen. | Agentic Code Discovery ( |
Manuelle PoC-Überprüfung: Erstellen benutzerdefinierter curl-Nutzlasten und Angriffsskripts, um Sicherheitslücken zu bestätigen. | Automatisierte Exploit-Proofs ( |
Risikoreiches manuelles Refaktorieren: Manuelles Patchen komplexer Datenbankabfragen, was häufig zu Syntax- oder Laufzeitfehlern führt. | Idiomatische Patch-Synthese ( |
Regressionsrisiken in der Produktion: Sicherheitspatches beeinträchtigen häufig nachgelagerte Geschäftslogik oder Tests. | Automatisierte Test-Guardrails: Kontinuierliche Validierung anhand lokaler Test-Suites und isolierter Prozess-Sandboxes. |
Manuelle Compliance-Zusammenstellungen: Manuelles Zusammenfassen von Ergebnissen in statischen Dokumenten für Audits. | Standardisierte Telemetrie und SARIF ( |
Weiteres Vorgehen
🚀 CodeMender-Trilogie fortsetzen:
Teil 2: CI/CD-Pipeline mit CodeMender sichern – Automatisieren Sie kontinuierliche Headless-Scans, die Integration des SARIF-Dashboards und selbstheilende Pull-Anfragen in GitHub Actions.
Teil 3: Sicheres Vibe-Coding mit Antigravity und CodeMender – Kombinieren Sie die Entwicklung mit generativer KI mit einem autonomen Sicherheitsassistenten.
📖 Dokumentation ansehen:
CodeMender in der Google Cloud-Dokumentation
Google Cloud Security-Lösungen
💡 Auf eigene Projekte anwenden:
Führen Sie cm find . und cm fix in Ihren eigenen Node.js-, Python-, Go-, Java-, Rust- oder C/C++-Repositories aus.