Anwendung mit CodeMender schützen

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, git und 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

Workflow der CodeMender Autonomous Remediation Engine

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

Ablauf der autonomen Codekorrektur mit CodeMender

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

OPEN

Die Sicherheitslücke wurde entdeckt (oder importiert), aber noch nicht verifiziert, gepatcht oder verworfen.

FIXED

CodeMender hat einen Patch generiert, die Differenz angewendet und überprüft, ob die Build-/Test-Suites erfolgreich ausgeführt werden und Exploits fehlschlagen.

DISMISSED

Aufgrund geringer Zuverlässigkeit, fehlender Bedrohungsmodellierung oder Bestätigung als falsch positiv als inaktiv markiert. Zukünftige Benachrichtigungen werden stummgeschaltet.

REOPENED

Ein zuvor FIXED oder DISMISSED Fehler, der bei einem späteren Scan noch einmal erkannt wurde (was auf eine Coderegression hinweist).

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

info.yaml

Metadatenmanifest

Strukturierte YAML-Datei, die die UUID, den Titel, den Schweregrad (CRITICAL), die Konfidenz (certain) und die CWE-Tags (cwe-89) des Ergebnisses definiert.

PLAN.md

Agentenstrategie

Schritt-für-Schritt-Verifizierungsplan und Checkliste, die von der CodeMender-Reasoning-Engine autonom ausgeführt werden.

LOG.md

Ausführungs-Trace-Log

Audit-Trail mit Zeitstempel, in dem jeder Toolaufruf, HTTP-Anfrageendpunkt und jedes Testergebnis aufgezeichnet wird.

server_runner.js/server.log

Helper Runner/Server-Log

Hilfsskript, das der Agent zum Starten von Juice Shop für Tests erstellt hat, und die erfasste Serverausgabe.

exploit.sh

Execution Wrapper / Standalone PoC

Shell-Skript-Wrapper, der den Zieldienst startet und den PoC-Client aufruft, um HTTP-200-Antworten zu validieren.

REPORT.md

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

info.yaml

Die vollständige ID, der Titel, der Schweregrad, die Konfidenz und die Tags des Ergebnisses, z. B. cwe-89.

PLAN.md

Die Checkliste, die der Agent befolgt hat, vom Lesen der gemeldeten Datei bis zum Schreiben des Reproduktionsskripts.

LOG.md

Aktionen und Ergebnisse mit Zeitstempel, einschließlich des Ergebnisses jeder Ausführung des Reproduktionsskripts.

exploit.sh

Das eigenständige Reproduktionsskript: wie es die Anwendung startet, auf welchen Endpunkt es abzielt und wie es den Erfolg bestimmt (es gibt EXPLOIT SUCCESSFUL aus).

server_runner.js/server.log

Hilfsdateien, die der KI-Agent erstellt hat, um Juice Shop zu Testzwecken zu starten, und die Ausgabe dieses Servers.

REPORT.md

Die Ursachenanalyse: die anfällige Zeile in routes/login.ts, warum sie ausnutzbar ist, und die empfohlene Korrektur (parametrisierte Abfragen).

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):

CodeMender-Dashboard für Sicherheits-Compliance – Übersicht

1. Header für Führungskräfte-Messwerte und Statuskarten

CodeMender-Header für Executive-Messwerte und StatuskartenHeader-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

Tabelle mit Zusammenfassung der CodeMender-ErgebnisseMatrix 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

CodeMender-Ursachenanalyse und Code-SnippetMinimierbare 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

CodeMender Synthesized Remediation Patch DiffUnified 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 (cm find .): Tiefgehende, kontextsensitive Repository-Scans, die auf Gemini-Modellen basieren.

Manuelle PoC-Überprüfung: Erstellen benutzerdefinierter curl-Nutzlasten und Angriffsskripts, um Sicherheitslücken zu bestätigen.

Automatisierte Exploit-Proofs (cm verify ): Automatische Synthese von ausführbaren Validierungsplänen, Logs und Shell-Skripts.

Risikoreiches manuelles Refaktorieren: Manuelles Patchen komplexer Datenbankabfragen, was häufig zu Syntax- oder Laufzeitfehlern führt.

Idiomatische Patch-Synthese (cm fix ): Kontextsensitive Diff-Generierung, die auf vorhandene ORMs und Framework-Standards zugeschnitten ist.

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 (cm report -f sarif): Sofortiger Export von OASIS SARIF v2.1.0, HTML-Dashboards und Token-Analysen.

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.