Protege tu aplicación con CodeMender

1. Antes de comenzar

⏱️ Duración: 3:00

Te damos la bienvenida al codelab práctico para proteger tu aplicación con CodeMender en Gemini Enterprise Agent Platform de Google Cloud.

En este taller, te pondrás en el lugar de un ingeniero de seguridad en la nube que tiene la tarea de auditar y proteger OWASP Juice Shop, la aplicación web estándar de la industria, que es intencionalmente vulnerable y está compilada con Node.js, Express, TypeScript y Angular.

Las herramientas tradicionales de análisis de seguridad (SAST/DAST) inundan a los equipos de desarrollo con miles de hallazgos de seguridad estáticos, altas tasas de falsos positivos y cero correcciones de código prácticas. Los desarrolladores pasan horas clasificando registros, rastreando flujos de datos y escribiendo parches de forma manual que, con frecuencia, interrumpen el comportamiento de las aplicaciones existentes.

CodeMender revoluciona la seguridad del código, ya que envuelve un arnés de agentes optimizado alrededor de los LLM de Gemini de Google. Con instrucciones diseñadas por Google DeepMind, habilidades de seguridad especializadas y organización de múltiples agentes, CodeMender actúa como un codesarrollador de seguridad de IA autónomo que encuentra, verifica y corrige vulnerabilidades de software directamente en los repositorios de código fuente locales.

Requisitos previos

  • Comprensión básica de las vulnerabilidades de las aplicaciones web (OWASP Top 10, como la inyección de SQL y XSS)
  • Conocimientos básicos de JavaScript/TypeScript y aplicaciones de Node.js
  • Conocimientos básicos sobre las herramientas de interfaz de línea de comandos (CLI)

Qué aprenderás

  • Cómo configurar, autenticar e inicializar la CLI de CodeMender (cm) en Google Cloud Shell.
  • Cómo analizar un repositorio de forma autónoma para descubrir vulnerabilidades explotables (cm find)
  • Cómo validar vulnerabilidades en zonas de pruebas aisladas y, además, inspeccionar artefactos de verificación (cm verify)
  • Cómo sintetizar, probar y aplicar parches de seguridad adaptados al contexto de forma autónoma (cm fix)
  • Cómo auditar la telemetría de tokens y exportar informes de cumplimiento multiformato (cm stats, cm report)

Requisitos

  • Un proyecto de Google Cloud con la facturación habilitada.
  • Google Cloud Shell con conexión activa al proyecto (incluye gcloud, git y Node.js 18 o versiones posteriores preinstalados)
  • Repositorio de inicio: Repositorio de GitHub de OWASP Juice Shop

2. Introducción a la arquitectura de CodeMender

⏱️ Duración: 4:00

Antes de analizar el análisis y la corrección de código, veamos cómo funciona CodeMender de forma interna en Gemini Enterprise Agent Platform según los estándares oficiales de arquitectura de Google Cloud.

Arquitectura del sistema: Agente y daemon del cliente

Flujo de trabajo del motor de corrección autónoma de CodeMender

Desde la perspectiva del usuario, CodeMender comprende dos componentes principales de la arquitectura:

Plataforma multiagente alojada: Es un sistema multiagente alojado que se ejecuta en Google Cloud y que ejecuta la lógica empresarial de seguridad principal, la ingeniería de instrucciones de LLM y el razonamiento de seguridad.

CLI del cliente local y daemon de la zona de pruebas (cm): Es un cliente que se ejecuta en Google Cloud Shell y que actúa como una CLI (para emitir comandos como cm find, cm verify y cm fix) y un daemon local (para ejecutar comandos de forma segura en nombre del agente dentro de una zona de pruebas aislada a nivel de proceso).

Las 3 capacidades principales de corrección

Flujo de corrección autónoma de CodeMender

CodeMender controla la seguridad del código a través de tres etapas integradas:

Encontrar vulnerabilidades (cm find): Analiza las bases de código con un LLM guiado por el agente, aprovechando herramientas de seguridad especializadas y la ingeniería de instrucciones para enfocar el modelo en las fallas de seguridad. (Como alternativa, los hallazgos se pueden importar desde herramientas externas de análisis de seguridad).

Verificar vulnerabilidades (cm verify): Compila el código de forma local y, luego, intenta explotar las fallas descubiertas para verificar si se pueden explotar. Esto elimina los falsos positivos y genera artefactos de verificación de espacios de trabajo persistentes en .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md).

Corregir vulnerabilidades (cm fix): Sintetiza parches de código fuente conscientes del lenguaje y los verifica ejecutando paquetes de pruebas de compilación y regresión del proyecto (npm test) dentro de la zona de pruebas local.

3. Configura el entorno de OWASP Juice Shop

⏱️ Duración: 5:00

En este paso, abrirás el entorno de la terminal de Google Cloud y recuperarás el repositorio de la aplicación de destino.

Paso 1: Abre Cloud Shell en la consola de Google Cloud

Navega a la consola de Google Cloud en tu navegador.

En la barra de navegación superior, haz clic en el botón Activar Cloud Shell (ícono >_).

Cloud Shell proporciona una terminal de Linux basada en el navegador con gcloud, git y Node.js preinstalados y autenticados.

Paso 2: Clona el repositorio de OWASP Juice Shop

En Cloud Shell o en tu terminal local, clona el repositorio de OWASP Juice Shop:

git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop

Paso 3: Inspecciona los archivos clave de la aplicación

OWASP Juice Shop usa Express.js en el backend con módulos de TypeScript. Echa un vistazo rápido a la estructura del directorio:

ls -la routes/ lib/

Observa los archivos de ruta clave que controlan la autenticación, las consultas de los usuarios y la administración del carrito:

routes/login.ts: Controla la autenticación de usuarios y la ejecución de consultas en SQL sin procesar.

routes/search.ts: Controla la búsqueda de productos y la renderización de respuestas.

routes/basket.ts: Controla la recuperación del carrito de compras del usuario.

routes/trackOrder.ts: Controla el seguimiento de pedidos a través de consultas de NoSQL.

lib/xml.ts: Controla el análisis de XML y las cargas de archivos.

lib/insecurity.ts: Son utilidades auxiliares para los tokens de sesión y la encriptación.

4. Instala la CLI de CodeMender (cm) y autentica las credenciales de GCP

⏱️ Duración: 8:00

En este paso, habilitarás las APIs de Google Cloud necesarias, otorgarás permisos de IAM con gcloud, descargarás e instalarás el objeto binario de la CLI de cm y configurarás las credenciales predeterminadas de la aplicación (ADC).

Paso 1: Habilita las APIs de Google Cloud requeridas a través de gcloud

CodeMender requiere la API de Agent Platform (aiplatform.googleapis.com) y la API de Cloud Resource Manager (cloudresourcemanager.googleapis.com) en Gemini Enterprise Agent Platform.

En Cloud Shell o en tu terminal, recupera el ID del proyecto activo (o consulta el menú desplegable de proyectos en la parte superior de la consola de Google Cloud) y habilita las APIs de servicio requeridas:

# 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}

Verifica que las APIs estén habilitadas:

gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"

Paso 2: Otorga permisos de IAM a través de gcloud

Para interactuar con el motor de razonamiento en la nube de CodeMender, los usuarios y las cuentas de servicio deben tener asignado el rol de IAM roles/aiplatform.user (Usuario de Agent Platform).

Otorga un rol de IAM a tu cuenta de usuario a través de la CLI

# Get your active authenticated gcloud account email
USER_EMAIL=$(gcloud config get-value account)

# Add IAM policy binding for user account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="user:${USER_EMAIL}" \
 --role="roles/aiplatform.user"

Paso 3: Descarga e instala la cm CLI de en Cloud Shell

En Google Cloud Shell, los datos del usuario se almacenan de forma persistente en tu directorio $HOME. Ejecuta los siguientes comandos para instalar cm en ~/bin sin necesidad de sudo. Aún estás en ~/juice-shop de la sección anterior, por lo que los comandos se descargan en un directorio temporal y se limpian después. De esta forma, no se guardarán archivos de instalación en el repositorio de Juice Shop:

# Download into a temporary directory so nothing lands in the Juice Shop repository
CM_TMP=$(mktemp -d)
curl -L -o "${CM_TMP}/cm-linux-amd64.zip" "https://artifactregistry.googleapis.com/download/v1/projects/cmoc-prod/locations/us/repositories/codemender-cli-production/files/cm:stable:cm-linux-amd64.zip:download?alt=media"
unzip -o "${CM_TMP}/cm-linux-amd64.zip" -d "${CM_TMP}"

# Install into your persistent ~/bin directory and clean up
mkdir -p ~/bin
install -m 0755 "${CM_TMP}/cm" ~/bin/cm
rm -rf "${CM_TMP}"

# Add ~/bin to PATH for this session and future Cloud Shell sessions
export PATH="$HOME/bin:$PATH"
grep -qxF 'export PATH="$HOME/bin:$PATH"' ~/.bashrc || echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc

Paso 4: Verifica la instalación de la CLI de cm

Ejecuta cm --version para verificar que el objeto binario de la CLI esté instalado correctamente:

cm --version

Resultado esperado:

cm version 0.17.0

Paso 5: Configura las credenciales predeterminadas de la aplicación (ADC) de Google Cloud

Configura las credenciales predeterminadas de la aplicación (ADC) de Google Cloud para que cm pueda autenticar las solicitudes al motor de razonamiento de la nube:

gcloud auth application-default login

Aparecerá un diálogo modal de autorización con la etiqueta Autoriza Cloud Shell. Haz clic en Autorizar para otorgar acceso.

5. Inicializa y verifica el espacio de trabajo de CodeMender

⏱️ Duración: 3:00

Ahora que cm está instalado y autenticado, inicializarás el espacio de trabajo de CodeMender dentro del directorio del proyecto de destino y verificarás la configuración de tu entorno.

Paso 1: Inicializa el espacio de trabajo de CodeMender (cm init)

Ejecuta cm init desde la raíz del directorio de tu proyecto para inicializar los archivos de seguimiento de estado locales y establecer las configuraciones de referencia:

cm init

Resultado:

✅ Initialized CodeMender workspace at /home/user/.codemender

Paso 2: Ejecuta diagnósticos de estado de extremo a extremo (cm health)

Antes de iniciar una sesión de agente, ejecuta cm health para verificar tus credenciales, configuración, accesibilidad y autorización:

cm health

Resultado:

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)

Paso 3: Comprende los parámetros de configuración (config.yaml)

CodeMender crea un archivo de configuración del espacio de trabajo en .codemender/config.yaml (o ~/.codemender/config.yaml). Este archivo define los límites de las políticas, las reglas de inclusión de archivos y los hooks de verificación de pruebas:

# 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. Descubre vulnerabilidades con cm find .

⏱️ Duración: 7:00

En este paso, ejecutarás cm find . --quick para realizar un análisis de seguridad basado en agentes en la base de código de Juice Shop.

Paso 1: Ejecuta cm find . --quick

A partir de la versión 0.16.0 de CodeMender, cm find <path> se establece de forma predeterminada en Análisis profundo (

--deep

) para un análisis exhaustivo archivo por archivo, mientras que el Análisis rápido (

--quick

) proporciona una clasificación rápida del repositorio. Ejecuta cm find . --quick para realizar un análisis rápido en el repositorio de OWASP Juice Shop (tiempo de ejecución estimado: ~8 minutos para la clasificación completa de la base de código de 684 archivos):

cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash

cm inicia una sesión de análisis en Gemini Enterprise Agent Platform, en la que se analizan los archivos de código fuente en todos los módulos del repositorio:

⚠️ 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

Paso 2: Revisa los resultados del análisis con cm report

Ejecuta cm report -f table para mostrar todos los hallazgos de seguridad descubiertos de la base de datos de estado de SQLite local:

cm report -f table

Resultado:

┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐
│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

Paso 3: Comprende los estados del ciclo de vida de los hallazgos y los niveles de gravedad

CodeMender hace un seguimiento de las vulnerabilidades a través de un ciclo de vida formal de cuatro estados:

Estado del hallazgo

Significado y manejo de transiciones

OPEN

Se descubrió (o importó) la vulnerabilidad, pero aún no se verificó, se aplicó un parche ni se descartó.

FIXED

CodeMender generó un parche, aplicó la diferencia y verificó que los paquetes de compilación y pruebas se aprueben y que los exploits fallen.

DISMISSED

Se marcó como inactiva debido a un nivel de confianza bajo, fuera del modelo de amenazas o se verificó como un falso positivo. Silencia las alertas futuras.

REOPENED

Un error FIXED o DISMISSED que se detectó de nuevo en un análisis posterior (lo que indica una regresión de código).

Clasificaciones de gravedad

🔴 CRITICAL: Riesgo inmediato y grave (p.ej., ejecución remota de código, inyección de SQL no autenticada) al que se puede acceder directamente desde límites no confiables.

🟠 HIGH: Es una falla grave (p.ej., lectura arbitraria de la base de datos o elevación de privilegios) que requiere un contexto de usuario específico o condiciones encadenadas.

🟡 MEDIUM: Riesgo moderado con alcance restringido o que requiere interacción del usuario (p.ej., redireccionamiento abierto, CSRF).

🔵 LOW: Fallas de higiene de defensa en profundidad o vectores de reconocimiento con un impacto directo mínimo.

7. Verificar vulnerabilidades y revisar los artefactos de verificación capturados

⏱️ Duración: 10:00

Una de las funciones clave de CodeMender es la generación automática de artefactos de verificación persistentes cada vez que ejecutas cm verify. Verifiquemos el hallazgo de inyección de SQL crítica en routes/login.ts (ilustrado como 43aa7446 en este instructivo) y revisemos los artefactos que creó el agente.

Paso 1: Ejecuta cm verify <login-finding-id>

Busca el ID del hallazgo de routes/login.ts en tu tabla cm report (por ejemplo, 43aa7446) y ejecuta cm verify <finding-id> --sandbox=false --bypass-warning -y (tiempo de ejecución estimado: ~20 minutos para ejecutar los pasos de la herramienta autónoma, iniciar los servicios en segundo plano y ejecutar las secuencias de comandos de explotación de PoC en vivo):

# 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

Resultado:

⚠️ 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

Paso 2: Descripción general de los artefactos de verificación capturados

A partir de CodeMender v0.16.0, los artefactos de verificación se estandarizan en la raíz del repositorio en .exploit/, mientras que se conserva una copia persistente en ~/.codemender/artifacts/<session-id>/. Estos son archivos de trabajo locales, no forman parte de tu corrección, por lo que los excluirás de Git antes de preparar el parche en la siguiente sección. Ejecuta ls -la .exploit/ para enumerarlas:

ls -la .exploit/

Resultado:

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

Archivo de artefacto

Categoría

Purpose

info.yaml

Manifiesto de metadatos

YAML estructurado que define el UUID del hallazgo, el título, la gravedad (CRITICAL), la confianza (certain) y las etiquetas de CWE (cwe-89).

PLAN.md

Estrategia de agentes

Plan de verificación paso a paso y lista de tareas ejecutada de forma autónoma por el motor de razonamiento de CodeMender.

LOG.md

Registro de seguimiento de la ejecución

Registro de auditoría con marca de tiempo que registra cada llamada a la herramienta, extremo de solicitud HTTP y resultado de la prueba.

server_runner.js/server.log

Registro del servidor o del ejecutor auxiliar

La secuencia de comandos auxiliar que creó el agente para iniciar Juice Shop para las pruebas y el resultado capturado del servidor.

exploit.sh

Execution Wrapper/PDC independiente

Wrapper de secuencia de comandos de shell que inicia el servicio de destino y llama al cliente de PoC, validando las respuestas HTTP 200.

REPORT.md

Análisis de la causa raíz

Resumen ejecutivo, análisis de vulnerabilidades línea por línea, desglose de SQL sin procesar y recomendaciones de parametrización de Sequelize.

Paso 3: Recorrido detallado de los aspectos destacados de los artefactos de verificación

El agente escribe estos artefactos de forma nueva en cada ejecución, por lo que su contenido exacto difiere cada vez. Ábrelos en el editor de Cloud Shell (o con cat) y busca lo siguiente:

Artefacto

Qué debes buscar

info.yaml

El ID completo, el título, la gravedad, la confianza y las etiquetas del hallazgo, como cwe-89.

PLAN.md

La lista de tareas que siguió el agente, desde leer el archivo informado hasta escribir la secuencia de comandos de reproducción

LOG.md

Acciones y resultados con marca de tiempo, incluido el resultado de cada ejecución de la secuencia de comandos de reproducción

exploit.sh

La secuencia de comandos de reproducción independiente: cómo inicia la app, a qué extremo se orienta y cómo decide el éxito (imprime EXPLOIT SUCCESSFUL).

server_runner.js/server.log

Son archivos auxiliares que creó el agente para iniciar Juice Shop para las pruebas y el resultado de ese servidor.

REPORT.md

El análisis de causa raíz: la línea vulnerable en routes/login.ts, por qué se puede explotar y la corrección recomendada (consultas parametrizadas).

8. Corrige la inyección de SQL con cm fix

⏱️ Duración: 10:00

Ahora que verificamos el hallazgo de inyección de SQL en routes/login.ts (ID de ejemplo 43aa7446) y examinamos sus artefactos, ejecutemos cm fix para aplicar un parche de consulta parametrizada automatizado.

Paso 1: Ejecuta cm fix <login-finding-id> -y

Ejecuta cm fix <finding-id> --sandbox=false --bypass-warning -y (reemplaza 43aa7446 por el ID del hallazgo de acceso real de cm report) para sintetizar y aplicar una corrección:

# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash

Resultado:

⚠️ 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

Paso 2: Inspecciona el estado del VCS y las diferencias con cm vcs

Ejecuta cm vcs status y cm vcs diff para ver los archivos modificados del espacio de trabajo:

cm vcs status
cm vcs diff

Resultado:

📂 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

Las dos entradas sin seguimiento son archivos locales de CodeMender, no forman parte de la corrección: .exploit/ contiene los artefactos de verificación de cm verify y .cm_project marca la raíz del proyecto para CodeMender. En el siguiente paso, los mantendrás fuera de tu confirmación.

Y 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 !== '') {

Paso 3: Almacena en etapa intermedia el parche verificado con cm vcs stage

Una vez que hayas revisado la diferencia unificada y confirmado que la solución cumple con tus estándares de calidad y seguridad, prepara el parche para la confirmación. Como cm vcs stage ejecuta git add -A, almacena en etapa intermedia cada cambio en el árbol de trabajo, incluidas las entradas .exploit/ y .cm_project sin seguimiento del paso 2. Primero, agrégalos a .git/info/exclude, un archivo de exclusión solo local que Git nunca confirma, para que solo se prepare el parche:

# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude

Luego, almacena los cambios en etapa intermedia con cm vcs stage:

cm vcs stage

Resultado:

📦 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.

Verifica que solo el parche esté en etapa de pruebas en Git:

cm vcs status

Resultado:

📂 CodeMender VCS Status
──────────────────────────────────────────────────
  Directory: /home/user/juice-shop
  Command:   git status --short
──────────────────────────────────────────────────

M  routes/login.ts

Si ejecutaste cm vcs stage antes de actualizar .git/info/exclude, quita los archivos de CodeMender del área de preparación con git restore --staged .exploit .cm_project. Los archivos permanecen en el disco; solo se quitan del área de etapa de pruebas.

Paso 4: Confirma el parche y borra los artefactos de verificación

Confirma el parche en etapa de pruebas antes de corregir el siguiente hallazgo: cada ejecución de cm fix y cm verify comienza restableciendo el espacio de trabajo (git checkout HEAD -- . && git clean -fd), lo que descarta los cambios no confirmados. Luego, borra la carpeta local .exploit/ para que la próxima corrección comience desde un espacio de trabajo limpio. Como ahora se ignora .exploit/, git clean -fd ya no lo quita por ti. Una copia persistente de los artefactos permanece en ~/.codemender/artifacts/<session-id>/.

git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/

Si Git te solicita tu identidad, ejecuta git config user.name "Your Name" y git config user.email "you@example.com" en el repositorio y, luego, vuelve a confirmar.

9. Valida parches, administra sesiones y exporta informes (cm report)

⏱️ Duración: 8:00

Después de aplicar una corrección de seguridad generada por IA, es esencial administrar las sesiones activas, inspeccionar las estadísticas de uso de tokens y generar informes de cumplimiento de seguridad empresarial con cm report.

Paso 1: Administra sesiones con estado (cm session list / resume / cancel)

CodeMender hace un seguimiento de cada tarea de análisis, verificación y corrección como una sesión con estado en su base de datos local de SQLite (~/.codemender/state.db). Ejecuta cm session list para inspeccionar tus sesiones:

cm session list

Resultado:

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

Paso 2: Ejecuta cm report para verificar los hallazgos corregidos

Ejecuta cm report -f table para mostrar los estados actualizados de los hallazgos (observa que los hallazgos corregidos ahora muestran FIXED con ✅ applied en la columna Fix):

cm report -f table

Resultado:

┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐
│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

Paso 3: Verifica el uso de tokens con cm stats

Ejecuta cm stats para inspeccionar el consumo de tokens locales en los modos de análisis (cm find --quick, cm verify y cm fix):

cm stats

Resultado:

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

Paso 4: Genera y obtén una vista previa del informe HTML interactivo (cm report -f html)

Exporta los hallazgos de tu análisis y los parches aplicados como un panel HTML interactivo independiente:

cm report -f html
cp ~/.codemender/reports/report.html ./report.html

Para ver report.html en Google Cloud Shell, haz lo siguiente:

Inicia un servidor web de vista previa local en tu terminal de Cloud Shell:

python3 -m http.server 8080

En la barra de herramientas de la esquina superior derecha de Cloud Shell, haz clic en el botón Vista previa en la Web (ícono con un ojo y una pantalla) ➔ Vista previa en el puerto 8080 para ver el panel de cumplimiento interactivo en tu navegador.

(Alternativa) En el explorador de archivos del editor de Cloud Shell, haz clic con el botón derecho en report.html y, luego, en Descargar para ver el archivo en tu navegador local.

Paso 5: Funciones clave del informe HTML interactivo generado

A continuación, se incluye un desglose de los componentes clave del informe HTML interactivo generado (report.html):

Descripción general del panel de cumplimiento de seguridad de CodeMender

1. Encabezado de métricas ejecutivas y tarjetas de postura

Encabezado de métricas ejecutivas y tarjetas de postura de CodeMenderMetadatos del encabezado: Muestra los detalles del repositorio de destino (OWASP Juice Shop), el total de archivos de origen analizados (684 files) y la marca de tiempo de generación en UTC.

Cuadrícula de tarjetas de métricas: Proporciona una descripción general instantánea de alto nivel de los hallazgos totales, las distribuciones de gravedad (CRITICAL, HIGH, MEDIUM, LOW) y el total de vulnerabilidades corregidas (FIXED).

2. Tabla de resumen de hallazgos interactivos

Tabla de resumen de hallazgos de CodeMenderMatriz de vulnerabilidades: Muestra una tabla filtrable que contiene ID, Severity, Status (OPEN frente a FIXED), CWE Type, File Location, Vulnerability Title y Confidence Score.

3. Análisis profundo de la causa raíz y fragmento de código fuente vulnerable

Análisis de la causa raíz y fragmento de código de CodeMenderAnálisis contraíble (RCA): Al hacer clic en cualquier fila de hallazgo, se expande el análisis de causa raíz detallado sintetizado por el modelo de razonamiento de seguridad de Gemini.

Fragmento de código fuente vulnerable: Muestra los números de línea exactos y el código fuente con sintaxis destacada alrededor del receptor vulnerable.

4. Diferencias de parches de corrección de IA sintetizados

Diferencia de parches de corrección sintetizados de CodeMenderVista de diferencias unificada: En el caso de las vulnerabilidades corregidas (FIXED), CodeMender renderiza un bloque de diferencias unificado que destaca las adiciones de código aplicadas en verde (+) y el código vulnerable quitado en rojo (-).

Paso 6: Importa hallazgos de SAST de terceros (cm report import) (opcional)

CodeMender no se limita a los errores que descubre su propio escáner. Los equipos pueden importar resultados de SAST externos (p.ej., de Semgrep, Snyk, SonarQube o Fortify) con un esquema JSON estandarizado o un asistente interactivo, lo que permite que CodeMender verifique y sintetice correcciones de inmediato:

# 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

Resultado:

Successfully imported 1 findings.
2026-10-22T02:27:10Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log

10. Limpia los recursos

⏱️ Duración: 1:00

Para evitar el uso innecesario de disco en tu entorno de Google Cloud Shell y limpiar los recursos temporales del taller, sigue estos pasos de limpieza.

Paso 1: Limpia la caché local de CodeMender y quita el repositorio

CodeMender proporciona un comando cm clean integrado para borrar la base de datos de hallazgos locales (~/.codemender/state.db), los informes HTML y los archivos de copia de seguridad de origen. Ejecute los siguientes comandos en Cloud Shell:

# Purge local SQLite findings cache, HTML reports, and backup files
cm clean

# Remove cloned repository
cd ~
rm -rf ~/juice-shop

Paso 2: Inhabilita las APIs de Google Cloud (opcional)

Si no planeas usar las APIs de CodeMender o Agent Platform en este proyecto para un desarrollo posterior, puedes inhabilitar las APIs de servicio:

gcloud services disable \
 aiplatform.googleapis.com \
 cloudresourcemanager.googleapis.com \
 --project=${PROJECT_ID}

11. Felicitaciones

⏱️ Duración: 2:00

¡Felicitaciones! Transformaste correctamente OWASP Juice Shop de una aplicación intencionalmente vulnerable a una base de código protegida y segura con CodeMender en Gemini Enterprise Agent Platform de Google Cloud.

Temas abordados

Corrección autónoma de ciclo cerrado: CodeMender va más allá del ruido de las alertas estáticas pasivas, ya que ejecuta un ciclo de vida de seguridad completo y autodirigido, desde el descubrimiento del repositorio (cm find) hasta la verificación de exploits en entornos de pruebas (cm verify) y la síntesis de parches con pruebas de regresión (cm fix).

Pruebas de vulnerabilidades basadas en evidencia: Al capturar artefactos de verificación tangibles (PLAN.md, LOG.md, exploit.sh, REPORT.md), CodeMender elimina los falsos positivos y demuestra la capacidad de explotación en el mundo real antes de escribir cualquier código.

Correcciones idiomáticas adaptadas al contexto: En lugar de aplicar reemplazos de texto genéricos, los agentes de razonamiento de Gemini analizan la arquitectura de la aplicación, los modelos de datos y los ORM para producir parches limpios y fáciles de mantener (como consultas parametrizadas de Sequelize) que preservan la lógica empresarial existente.

Medidas de seguridad y pruebas integradas: Cada corrección propuesta se valida automáticamente con los paquetes de pruebas del proyecto (npm test) y los verificadores de tipos (tsc) dentro de entornos de pruebas aislados del espacio de trabajo antes de que se almacenen los cambios.

Cambio de mentalidad de los desarrolladores

Flujo de trabajo de SAST manual tradicional

Corrección autónoma con CodeMender (cm)

Fatiga por alertas: Horas dedicadas a clasificar informes ruidosos con altas tasas de falsos positivos.

Agentic Code Discovery (cm find .): Análisis profundo y contextual de repositorios con la tecnología de los modelos de Gemini.

Verificación manual de PoC: Creación de cargas útiles de curl personalizadas y secuencias de comandos de ataque para confirmar vulnerabilidades.

Pruebas de explotación automatizadas (cm verify ): Síntesis automática de planes de validación ejecutables, registros y secuencias de comandos de shell.

Refactorización manual de alto riesgo: Se corrigen manualmente consultas complejas de bases de datos, lo que suele generar errores de sintaxis o de tiempo de ejecución.

Síntesis de parches idiomáticos (cm fix ): Generación de diferencias adaptadas al contexto y a los ORM y estándares de frameworks existentes.

Riesgos de regresión en la producción: Los parches de seguridad suelen interrumpir las pruebas o la lógica empresarial downstream.

Lineamientos de pruebas automatizadas: Validación continua con paquetes de pruebas locales y entornos de pruebas de procesos aislados.

Recopilaciones manuales de cumplimiento: Agrupar manualmente los hallazgos en documentos estáticos para las revisiones de auditoría.

Telemetría estandarizada y SARIF (cm report -f sarif): Exportación instantánea de OASIS SARIF v2.1.0, paneles HTML y análisis de tokens.

Próximos pasos

🚀 Continúa con la trilogía de CodeMender:

Parte 2: Protege tu canalización de CI/CD con CodeMender — Automatiza el análisis continuo sin interfaz gráfica, la integración del panel de SARIF y las solicitudes de extracción de reparación automática en GitHub Actions.

Parte 3: Vibe-Coding seguro con Antigravity y CodeMender — Combina el desarrollo de IA generativa con un asistente de seguridad autónomo.

📖 Explora la documentación:

Documentación de CodeMender en Google Cloud

Soluciones de seguridad de Google Cloud

💡 Aplica estos conocimientos a tus propios proyectos:

Ejecuta cm find . y cm fix en tus propios repositorios de Node.js, Python, Go, Java, Rust o C/C++.