Как защитить приложение с помощью CodeMender

1. Подготовка

⏱️ Продолжительность: 3:00

Добро пожаловать на практическую работу Защита приложения с помощью CodeMender на платформе Gemini Enterprise Agent Platform в Google Cloud.

На этом семинаре вы попробуете себя в роли инженера по облачной безопасности, которому поручено провести аудит и защитить OWASP Juice Shop – стандартное веб-приложение, намеренно уязвимое и созданное с помощью Node.js, Express, TypeScript и Angular.

Традиционные инструменты сканирования безопасности (SAST/DAST) заваливают команды разработчиков тысячами статических результатов безопасности, высоким уровнем ложных срабатываний и нулевым количеством действенных исправлений кода. Разработчики тратят часы на сортировку журналов, отслеживание потоков данных и написание исправлений вручную, что часто нарушает работу существующих приложений.

CodeMender – это революционный инструмент для обеспечения безопасности кода, который использует агентную обвязку для LLM Gemini от Google. CodeMender использует запросы, разработанные Google DeepMind, специализированные навыки в области безопасности и мультиагентную оркестрацию. Он действует как автономный ИИ-помощник по безопасности, который находит, проверяет и устраняет уязвимости ПО непосредственно в локальных репозиториях исходного кода.

Требования

  • Базовое понимание уязвимостей веб-приложений (OWASP Top 10, например внедрение SQL-кода и XSS).
  • Базовые знания о приложениях JavaScript/TypeScript и Node.js.
  • Базовые знания об инструментах интерфейса командной строки (CLI).

Что вы узнаете

  • Как настроить, выполнить аутентификацию и инициализировать CLI CodeMender (cm) в Google Cloud Shell.
  • Как автономно сканировать репозиторий, чтобы обнаруживать уязвимости, которые могут быть использованы злоумышленниками (cm find).
  • Как проверять уязвимости в изолированных средах и изучать артефакты проверки (cm verify).
  • Как автономно синтезировать, тестировать и применять контекстно-зависимые исправления системы безопасности (cm fix).
  • Как проверять телеметрию токенов и экспортировать многоформатные отчеты о соответствии требованиям (cm stats, cm report).

Что вам понадобится

  • Проект Google Cloud с включенными платежными функциями.
  • Google Cloud Shell с активным подключением к проекту (включает предустановленные gcloud, git и Node.js 18+).
  • Стартовый репозиторий: OWASP Juice Shop GitHub Repo.

2. Общие сведения об архитектуре CodeMender

⏱️ Продолжительность: 4 минуты.

Прежде чем перейти к сканированию и исправлению кода, давайте разберемся, как CodeMender работает на платформе Gemini Enterprise Agent Platform в соответствии с официальными стандартами архитектуры Google Cloud.

Архитектура системы: агент и клиентский демон

Рабочий процесс автономного устранения уязвимостей CodeMender

С точки зрения пользователя CodeMender состоит из двух основных архитектурных компонентов:

Размещенная мультиагентная платформа. Размещенная мультиагентная система, работающая в Google Cloud и выполняющая основную бизнес-логику безопасности, составление запросов LLM и обоснование безопасности.

Локальный клиентский CLI и фоновый процесс песочницы (cm). Клиент, работающий в Google Cloud Shell и выполняющий функции как CLI (для выполнения таких команд, как cm find, cm verify, cm fix), так и локального фонового процесса (для безопасного выполнения команд от имени агента в изолированной песочнице на уровне процесса).

Три основных способа устранения уязвимостей

Автономный процесс устранения уязвимостей CodeMender

CodeMender обеспечивает безопасность кода в три этапа:

Поиск уязвимостей (cm find). Сканирует базы кода с помощью LLM под управлением агента, используя специализированные инструменты безопасности и подготовку запросов, чтобы сосредоточить модель на уязвимостях. (или импортировать их из внешних инструментов сканирования).

Проверка уязвимостей (cm verify). Локально собирает код и пытается использовать обнаруженные уязвимости, чтобы проверить, можно ли их использовать. Это позволяет исключить ложные срабатывания и создать постоянные артефакты проверки рабочей области в .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md).

Fix Vulnerabilities (cm fix) – синтезирует исправления исходного кода с учетом языка и проверяет их, запуская сборку проекта и наборы регрессионных тестов (npm test) в локальной изолированной среде.

3. Настройте среду OWASP Juice Shop

⏱️ Продолжительность: 5 минут.

На этом шаге вы откроете терминал Google Cloud и получите репозиторий целевого приложения.

Шаг 1. Откройте Cloud Shell в консоли Google Cloud

Перейдите в консоль Google Cloud в браузере.

На верхней панели навигации нажмите кнопку Activate Cloud Shell (Активировать Cloud Shell) (значок >_).

Cloud Shell предоставляет терминал Linux на основе браузера с предустановленными и аутентифицированными gcloud, git и Node.js.

Шаг 2. Клонируйте репозиторий OWASP Juice Shop

В Cloud Shell или локальном терминале клонируйте репозиторий OWASP Juice Shop:

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

Шаг 3. Проверьте основные файлы приложения

В OWASP Juice Shop на бэкенде используется Express.js с модулями TypeScript. Вот как выглядит структура каталога:

ls -la routes/ lib/

Обратите внимание на файлы ключевых маршрутов, которые обрабатывают аутентификацию, запросы пользователей и администрирование корзины:

routes/login.ts: обрабатывает аутентификацию пользователей и выполнение необработанных SQL-запросов.

routes/search.ts – обрабатывает поиск товаров и отрисовку ответов.

routes/basket.ts: обрабатывает извлечение корзины пользователя.

routes/trackOrder.ts: обрабатывает отслеживание заказов с помощью запросов NoSQL.

lib/xml.ts – обрабатывает синтаксический анализ XML и загрузку файлов.

lib/insecurity.ts – вспомогательные утилиты для токенов сеансов и шифрования.

4. Установите CodeMender CLI (cm) и выполните аутентификацию учетных данных GCP

⏱️ Продолжительность: 8 минут.

На этом шаге вы включите необходимые API Google Cloud, предоставите разрешения IAM с помощью gcloud, скачаете и установите двоичный файл CLI cm и настроите учетные данные по умолчанию для приложения (ADC).

Шаг 1. Включите необходимые API Google Cloud через gcloud

Для работы CodeMender требуются Agent Platform API (aiplatform.googleapis.com) и Cloud Resource Manager API (cloudresourcemanager.googleapis.com) на платформе агентов Gemini Enterprise.

В Cloud Shell или терминале получите идентификатор активного проекта (или проверьте раскрывающийся список проектов в верхней части консоли Google Cloud) и включите необходимые API сервисов:

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

Убедитесь, что API включены:

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

Шаг 2. Предоставьте разрешения IAM через gcloud

Чтобы взаимодействовать с облачным механизмом рассуждений CodeMender, пользователям и сервисным аккаунтам должна быть назначена роль IAM roles/aiplatform.user (Пользователь платформы агентов).

Как назначить роль IAM аккаунту пользователя с помощью 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"

Шаг 3. Скачайте и установите cm CLI в Cloud Shell

В Google Cloud Shell пользовательские данные постоянно хранятся в каталоге $HOME. Выполните следующие команды, чтобы установить cm в ~/bin без sudo. Вы все ещё находитесь в каталоге ~/juice-shop из предыдущего раздела, поэтому команды скачивают файлы во временный каталог и затем очищают его. Таким образом, в репозитории 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

Шаг 4. Проверьте установку cm CLI

Чтобы проверить, правильно ли установлен двоичный файл CLI, выполните команду cm --version.

cm --version

Ожидаемый результат:

cm version 0.17.0

Шаг 5. Настройте Application Default Credentials (ADC) для Google Cloud

Настройте Google Cloud Application Default Credentials (ADC), чтобы cm мог аутентифицировать запросы к облачному механизму рассуждений:

gcloud auth application-default login

Появится модальное диалоговое окно Authorize Cloud Shell (Авторизовать Cloud Shell). Нажмите Authorize (Авторизовать), чтобы предоставить доступ.

5. Инициализация и проверка рабочей области CodeMender

⏱️ Продолжительность: 3:00

Теперь, когда cm установлен и аутентифицирован, вы инициализируете рабочую область CodeMender в каталоге целевого проекта и проверите настройку среды.

Шаг 1. Инициализируйте рабочую область CodeMender (cm init)

Чтобы инициализировать локальные файлы отслеживания состояния и задать базовые конфигурации, выполните команду cm init из корневого каталога проекта:

cm init

Вывод:

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

Шаг 2. Проведите комплексную диагностику (cm health)

Перед запуском сеанса агента выполните команду cm health, чтобы проверить учетные данные, конфигурацию, доступность и авторизацию:

cm health

Вывод:

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)

Шаг 3. Изучите параметры конфигурации (config.yaml)

CodeMender создает файл конфигурации рабочей области в .codemender/config.yaml (или ~/.codemender/config.yaml). Этот файл определяет границы правил, правила включения файлов и хуки проверки тестов:

# 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. Обнаруживайте уязвимости с помощью cm find .

⏱️ Продолжительность: 7 минут.

На этом шаге вы запустите cm find . --quick, чтобы выполнить агентное сканирование безопасности в базе кода Juice Shop.

Шаг 1. Выполните cm find . --quick

Начиная с CodeMender версии 0.16.0, cm find <path> по умолчанию использует глубокое сканирование (

--deep

) для тщательного анализа каждого файла, а Быстрое сканирование (

--quick

) позволяет быстро сортировать хранилища. Выполните команду cm find . --quick, чтобы запустить быстрое сканирование репозитория OWASP Juice Shop. Ориентировочное время выполнения: около 8 минут для полной сортировки базы кода из 684 файлов.

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

cm запускает сеанс сканирования на платформе Gemini Enterprise Agent Platform, анализируя файлы исходного кода во всех модулях репозитория:

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

Шаг 2. Проверьте результаты сканирования в cm report

Выполните команду cm report -f table, чтобы показать все обнаруженные проблемы безопасности из локальной базы данных SQLite:

cm report -f table

Вывод:

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

Шаг 3. Изучите статусы жизненного цикла и уровни серьезности находок

CodeMender отслеживает уязвимости на протяжении четырех этапов жизненного цикла:

Статус поиска

Значение и обработка перехода

OPEN

Уязвимость обнаружена (или импортирована), но ещё не проверена, не устранена и не отклонена.

FIXED

CodeMender сгенерировал исправление, применил его и проверил, что сборка и набор тестов работают, а эксплойты – нет.

DISMISSED

Отмечено как неактивное из-за низкой достоверности, несоответствия модели угроз или подтверждения ложного срабатывания. Отключает будущие оповещения.

REOPENED

Ранее FIXED или DISMISSED уязвимость, повторно обнаруженная при последующем сканировании (указывает на регрессию кода).

Классификация по уровню серьезности

🔴 CRITICAL: немедленный серьезный риск (например, удаленное выполнение кода, неаутентифицированная SQL-инъекция), напрямую доступный из ненадежных границ.

HIGH Серьезная уязвимость (например, произвольное чтение базы данных, повышение привилегий), требующая определенного контекста пользователя или цепочки условий.

MEDIUM 🟡 Умеренный риск с ограниченной областью действия или требующий взаимодействия с пользователем (например, открытая переадресация, CSRF).

🔵LOW Недостатки углубленной защиты или векторы разведки с минимальным прямым воздействием.

7. Проверка уязвимостей и просмотр полученных артефактов проверки

⏱️ Продолжительность: 10:00

Одна из ключевых функций CodeMender – автоматическое создание постоянных артефактов проверки при каждом запуске cm verify. Давайте проверим критическую уязвимость SQL-инъекции в routes/login.ts (в этом руководстве она обозначена как 43aa7446) и рассмотрим артефакты, созданные агентом.

Шаг 1. Выполните cm verify <login-finding-id>

Найдите идентификатор находки для routes/login.ts в таблице cm report (например, 43aa7446) и выполните cm verify <finding-id> --sandbox=false --bypass-warning -y (расчетное время выполнения: около 20 минут на запуск автономных инструментов, фоновых служб и скриптов PoC-эксплойтов):

# 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

Вывод:

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

Шаг 2. Обзор полученных артефактов проверки

Начиная с CodeMender версии 0.16.0 артефакты проверки стандартизированы в корне репозитория в каталоге .exploit/, а их постоянная копия хранится в каталоге ~/.codemender/artifacts/<session-id>/. Это локальные рабочие файлы, а не часть вашего исправления, поэтому вы исключите их из Git, прежде чем подготовить патч в следующем разделе. Чтобы посмотреть их, выполните команду ls -la .exploit/:

ls -la .exploit/

Вывод:

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

Файл артефакта

Категория

Purpose

info.yaml

Манифест метаданных

Структурированный YAML, определяющий UUID, название, серьезность (CRITICAL), достоверность (certain) и теги CWE (cwe-89) обнаруженной уязвимости.

PLAN.md

Стратегия агента

Пошаговый план проверки и контрольный список, выполняемые автономно механизмом рассуждений CodeMender.

LOG.md

Журнал трассировки выполнения

Журнал аудита с временными метками, в котором регистрируется каждый вызов инструмента, конечная точка HTTP-запроса и результат теста.

server_runner.js/server.log

Журнал вспомогательного исполнителя/сервера

Вспомогательный скрипт, созданный агентом для запуска Juice Shop в целях тестирования, и полученные выходные данные сервера.

exploit.sh

Оболочка выполнения/автономная проверка концепции

Оболочка сценария командной строки, которая запускает целевой сервис и вызывает клиент PoC, проверяя ответы HTTP 200.

REPORT.md

Анализ основных причин

Краткое содержание, построчный анализ уязвимостей, разбивка необработанного SQL и рекомендации по параметризации Sequelize.

Шаг 3. Подробный разбор основных моментов в артефактах проверки

Агент создает эти артефакты заново при каждом запуске, поэтому их точное содержимое каждый раз отличается. Откройте их в редакторе Cloud Shell (или с помощью cat) и найдите следующее:

Артефакт

На что следует обратить внимание

info.yaml

Полный идентификатор, название, уровень серьезности, достоверность и теги, например cwe-89.

PLAN.md

Контрольный список, которому следовал агент, от чтения файла с сообщением до написания скрипта воспроизведения.

LOG.md

Действия и результаты с временными метками, включая результат каждого запуска скрипта воспроизведения.

exploit.sh

Отдельный скрипт воспроизведения: как он запускает приложение, на какую конечную точку нацелен и как определяет успех (он печатает EXPLOIT SUCCESSFUL).

server_runner.js/server.log

Вспомогательные файлы, созданные агентом для запуска Juice Shop в целях тестирования, и выходные данные сервера.

REPORT.md

Анализ основной причины: уязвимая строка в routes/login.ts, почему ее можно использовать и рекомендуемое исправление (параметризованные запросы).

8. Устранение уязвимости к внедрению SQL-кода с помощью cm fix

⏱️ Продолжительность: 10:00

Мы подтвердили наличие уязвимости к SQL-инъекциям в routes/login.ts (пример идентификатора: 43aa7446) и изучили ее артефакты. Теперь давайте выполним cm fix, чтобы применить автоматическое исправление параметризованного запроса.

Шаг 1. Выполните cm fix <login-finding-id> -y

Чтобы синтезировать и применить исправление, выполните команду cm fix <finding-id> --sandbox=false --bypass-warning -y (замените 43aa7446 на идентификатор проблемы, найденной при входе, из cm report):

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

Вывод:

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

Шаг 2. Проверьте статус VCS и различия с помощью cm vcs

Выполните команды cm vcs status и cm vcs diff, чтобы посмотреть измененные файлы рабочей области:

cm vcs status
cm vcs diff

Вывод:

📂 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

Две неотслеживаемые записи – это локальные файлы CodeMender, не являющиеся частью исправления: .exploit/ содержит артефакты проверки из cm verify, а .cm_project отмечает корень проекта для CodeMender. На следующем шаге вы исключите их из фиксации.

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

Шаг 3. Подготовьте проверенное исправление с помощью cm vcs stage

Проверив унифицированный diff и убедившись, что исправление соответствует вашим стандартам качества и безопасности, подготовьте исправление к фиксации. Поскольку cm vcs stage запускает git add -A, он подготавливает все изменения в рабочем дереве, включая неотслеживаемые записи .exploit/ и .cm_project из шага 2. Сначала добавьте их в .git/info/exclude – локальный файл игнорирования, который Git никогда не фиксирует, чтобы подготовить только исправление:

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

Затем подготовьте изменения с помощью cm vcs stage:

cm vcs stage

Вывод:

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

Убедитесь, что в Git подготовлен только патч:

cm vcs status

Вывод:

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

M  routes/login.ts

Если вы запустили cm vcs stage до обновления .git/info/exclude, отмените индексирование файлов CodeMender с помощью git restore --staged .exploit .cm_project. Файлы останутся на диске, но будут удалены из промежуточной области.

Шаг 4. Примените исправление и удалите артефакты проверки

Зафиксируйте подготовленный патч, прежде чем исправлять следующую проблему. Каждый запуск cm fix и cm verify начинается со сброса рабочей области (git checkout HEAD -- . && git clean -fd), в результате чего незафиксированные изменения отменяются. Затем удалите локальную папку .exploit/, чтобы начать следующее исправление с чистой рабочей области. Поскольку .exploit/ теперь игнорируется, git clean -fd больше не удаляет его. Постоянная копия объектов остается в ~/.codemender/artifacts/<session-id>/.

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

Если Git запрашивает идентификационные данные, выполните в репозитории команды git config user.name "Your Name" и git config user.email "you@example.com", а затем повторите фиксацию.

9. Проверка исправлений, управление сеансами и экспорт отчетов (cm report)

⏱️ Продолжительность: 8 минут.

После применения исправления безопасности, созданного ИИ, необходимо управлять активными сеансами, проверять статистику использования токенов и создавать отчеты о соответствии требованиям безопасности предприятия с помощью cm report.

Шаг 1. Управляйте сеансами с сохранением состояния (cm session list / resume / cancel)

CodeMender отслеживает каждое сканирование, проверку и исправление как сеанс с сохранением состояния в локальной базе данных SQLite (~/.codemender/state.db). Чтобы проверить сеансы, выполните команду cm session list.

cm session list

Вывод:

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

Шаг 2. Запустите cm report, чтобы проверить исправленные ошибки

Выполните команду cm report -f table, чтобы посмотреть обновленные статусы находок. Обратите внимание, что устраненные находки теперь имеют статус FIXED и значение ✅ applied в столбце Fix.

cm report -f table

Вывод:

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

Шаг 3. Проверьте использование токенов с помощью cm stats

Чтобы проверить локальное потребление токенов в разных режимах сканирования (cm find --quick, cm verify и cm fix), выполните команду cm stats:

cm stats

Вывод:

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

Шаг 4. Создайте и посмотрите интерактивный отчет в формате HTML (cm report -f html)

Экспортируйте результаты сканирования и примененные исправления в виде отдельной интерактивной панели управления HTML:

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

Чтобы посмотреть report.html в Google Cloud Shell:

Запустите локальный веб-сервер предварительного просмотра в терминале Cloud Shell:

python3 -m http.server 8080

На панели инструментов Cloud Shell в правом верхнем углу нажмите кнопку Web Preview (Предварительный просмотр) (значок с глазом и экраном) ➔ Preview on port 8080 (Предварительный просмотр на порте 8080), чтобы открыть интерактивную панель соответствия требованиям в браузере.

(Альтернативный вариант) В проводнике Cloud Shell Editor нажмите правой кнопкой мыши на report.html и выберите Download (Скачать), чтобы посмотреть файл в локальном браузере.

Шаг 5. Изучите основные функции интерактивного отчета в формате HTML

Ниже приведены основные компоненты сгенерированного интерактивного HTML-отчета (report.html).

Обзор панели соответствия требованиям безопасности CodeMender

1. Заголовок и карточки с показателями безопасности для руководителей

Заголовок и карточки состояния CodeMender Executive MetricsМетаданные заголовка. Сведения о целевом хранилище (OWASP Juice Shop), общем количестве отсканированных исходных файлов (684 files) и временная метка создания по UTC.

Сетка карточек показателей. Позволяет быстро получить общее представление о количестве находок, распределении по уровню серьезности (CRITICAL, HIGH, MEDIUM, LOW) и общем количестве устраненных уязвимостей (FIXED).

2. Интерактивная сводная таблица результатов

Сводная таблица результатов CodeMenderМатрица уязвимостей. Таблица с возможностью фильтрации, содержащая следующие данные: ID, Severity, Status (OPEN и FIXED), CWE Type, File Location, Vulnerability Title и Confidence Score.

3. Глубокий анализ основных причин и фрагмент уязвимого исходного кода

Анализ основных причин и фрагмент кода от CodeMenderСворачиваемый анализ первопричин. Нажмите на строку с результатами, чтобы развернуть подробный анализ первопричин, созданный моделью Gemini для обоснования безопасности.

Фрагмент уязвимого исходного кода. Показывает точные номера строк и исходный код с подсветкой синтаксиса вокруг уязвимого приемника.

4. Синтезированные ИИ исправления

Различия в синтезированном исправлении CodeMenderУнифицированное представление различий. Для устраненных уязвимостей (FIXED) CodeMender показывает унифицированный блок различий, в котором добавленный код выделен зеленым (+), а удаленный уязвимый код – красным (-).

Шаг 6. Импортируйте результаты стороннего статического тестирования защищенности приложений (cm report import)

CodeMender не ограничивается уязвимостями, обнаруженными его собственным сканером. Команды могут импортировать результаты внешнего статического анализа защищенности приложений (например, из Semgrep, Snyk, SonarQube или Fortify), используя стандартизированную схему JSON или интерактивный мастер. Это позволяет CodeMender сразу же проверять и синтезировать исправления для них:

# 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

Вывод:

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

10. Очистка ресурсов

⏱️ Продолжительность: 1:00

Чтобы не занимать лишнее место на диске в среде Google Cloud Shell и удалить временные ресурсы, выполните следующие действия.

Шаг 1. Очистите локальный кеш CodeMender и удалите хранилище

В CodeMender есть встроенная команда cm clean, которая позволяет очистить локальную базу данных с результатами (~/.codemender/state.db), HTML-отчеты и резервные копии исходных файлов. Выполните в Cloud Shell следующие команды:

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

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

Шаг 2. Отключите Google Cloud API (необязательно)

Если вы не планируете использовать CodeMender или Agent Platform API в этом проекте для дальнейшей разработки, вы можете отключить API сервисов:

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

11. Поздравляю!

⏱️ Продолжительность: 2 минуты.

Поздравляем! Вы успешно преобразовали OWASP Juice Shop из намеренно уязвимого приложения в защищенную базу кода с помощью CodeMender на платформе Gemini Enterprise Agent Platform в Google Cloud.

Что вы узнали

Автономное устранение уязвимостей в замкнутом цикле. CodeMender не просто пассивно сообщает о проблемах, а выполняет полный жизненный цикл обеспечения безопасности – от обнаружения репозитория (cm find) до проверки эксплойта в изолированной среде (cm verify) и создания патча, прошедшего регрессионное тестирование (cm fix).

Доказательства уязвимостей на основе фактов. CodeMender собирает материальные доказательства (PLAN.md, LOG.md, exploit.sh, REPORT.md), что позволяет исключить ложные срабатывания и подтвердить возможность эксплуатации уязвимости до написания кода.

Исправления с учетом контекста и идиом. Вместо того чтобы применять общие текстовые замены, агенты Gemini анализируют архитектуру приложения, модели данных и ORM, чтобы создавать чистые, поддерживаемые исправления (например, параметризованные запросы Sequelize), которые сохраняют существующую бизнес-логику.

Встроенные средства безопасности и тестирования. Каждое предлагаемое исправление автоматически проверяется с помощью наборов тестов проекта (npm test) и средств проверки типов (tsc) в изолированных тестовых средах рабочей области, прежде чем изменения будут подготовлены.

Изменение мышления разработчиков

Традиционный рабочий процесс SAST вручную

Автономное устранение уязвимостей с помощью CodeMender (cm)

Усталость от оповещений. Специалисты тратят часы на сортировку отчетов с высоким уровнем ложных срабатываний.

Agentic Code Discovery (cm find .) – глубокое сканирование репозитория с учетом контекста на основе моделей Gemini.

Проверяем концепцию вручную: создаем специальные полезные нагрузки curl и скрипты атак, чтобы подтвердить уязвимости.

Автоматизированные доказательства эксплойтов (cm verify ). Автоматический синтез исполняемых планов проверки, журналов и сценариев командной оболочки.

Высокий риск при ручном рефакторинге. Ручное исправление сложных запросов к базе данных часто приводит к синтаксическим ошибкам или ошибкам выполнения.

Idiomatic Patch Synthesis (cm fix ) – контекстно-зависимое создание различий, адаптированное к существующим ORM и стандартам фреймворков.

Риски регрессии в рабочей среде. Исправления уязвимостей часто нарушают бизнес-логику или тесты.

Автоматизированные тестовые ограничения. Постоянная проверка с помощью локальных наборов тестов и изолированных песочниц процессов.

Ручной сбор данных о соответствии требованиям. Сбор данных в статические документы для аудита.

Стандартизированная телеметрия и SARIF (cm report -f sarif). Мгновенный экспорт OASIS SARIF v2.1.0, HTML-панелей и аналитики токенов.

Дальнейшие действия

🚀 Продолжение трилогии CodeMender

Часть 2. Защита конвейера CI/CD с помощью CodeMender. Автоматизация непрерывного сканирования без графического интерфейса, интеграция панели управления SARIF и самовосстанавливающиеся pull-запросы в GitHub Actions.

Часть 3. Безопасный вайб-кодинг с Antigravity и CodeMender. Сочетайте разработку с помощью генеративного искусственного интеллекта с автономным помощником по безопасности.

📖 Изучите документацию

Документация по CodeMender в Google Cloud

Решения Google Cloud для обеспечения безопасности

💡 Примените полученные знания в своих проектах

Запустите cm find . и cm fix в своих репозиториях Node.js, Python, Go, Java, Rust или C/C++.