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 состоит из двух основных архитектурных компонентов:
Размещенная мультиагентная платформа. Размещенная мультиагентная система, работающая в Google Cloud и выполняющая основную бизнес-логику безопасности, составление запросов LLM и обоснование безопасности.
Локальный клиентский CLI и фоновый процесс песочницы (cm). Клиент, работающий в Google Cloud Shell и выполняющий функции как CLI (для выполнения таких команд, как cm find, cm verify, cm fix), так и локального фонового процесса (для безопасного выполнения команд от имени агента в изолированной песочнице на уровне процесса).
Три основных способа устранения уязвимостей

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 отслеживает уязвимости на протяжении четырех этапов жизненного цикла:
Статус поиска | Значение и обработка перехода |
| Уязвимость обнаружена (или импортирована), но ещё не проверена, не устранена и не отклонена. |
| CodeMender сгенерировал исправление, применил его и проверил, что сборка и набор тестов работают, а эксплойты – нет. |
| Отмечено как неактивное из-за низкой достоверности, несоответствия модели угроз или подтверждения ложного срабатывания. Отключает будущие оповещения. |
| Ранее |
Классификация по уровню серьезности
🔴 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 |
| Манифест метаданных | Структурированный YAML, определяющий UUID, название, серьезность ( |
| Стратегия агента | Пошаговый план проверки и контрольный список, выполняемые автономно механизмом рассуждений CodeMender. |
| Журнал трассировки выполнения | Журнал аудита с временными метками, в котором регистрируется каждый вызов инструмента, конечная точка HTTP-запроса и результат теста. |
| Журнал вспомогательного исполнителя/сервера | Вспомогательный скрипт, созданный агентом для запуска Juice Shop в целях тестирования, и полученные выходные данные сервера. |
| Оболочка выполнения/автономная проверка концепции | Оболочка сценария командной строки, которая запускает целевой сервис и вызывает клиент PoC, проверяя ответы HTTP 200. |
| Анализ основных причин | Краткое содержание, построчный анализ уязвимостей, разбивка необработанного SQL и рекомендации по параметризации Sequelize. |
Шаг 3. Подробный разбор основных моментов в артефактах проверки
Агент создает эти артефакты заново при каждом запуске, поэтому их точное содержимое каждый раз отличается. Откройте их в редакторе Cloud Shell (или с помощью cat) и найдите следующее:
Артефакт | На что следует обратить внимание |
| Полный идентификатор, название, уровень серьезности, достоверность и теги, например |
| Контрольный список, которому следовал агент, от чтения файла с сообщением до написания скрипта воспроизведения. |
| Действия и результаты с временными метками, включая результат каждого запуска скрипта воспроизведения. |
| Отдельный скрипт воспроизведения: как он запускает приложение, на какую конечную точку нацелен и как определяет успех (он печатает |
| Вспомогательные файлы, созданные агентом для запуска Juice Shop в целях тестирования, и выходные данные сервера. |
| Анализ основной причины: уязвимая строка в |
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).

1. Заголовок и карточки с показателями безопасности для руководителей
Метаданные заголовка. Сведения о целевом хранилище (OWASP Juice Shop), общем количестве отсканированных исходных файлов (684 files) и временная метка создания по UTC.
Сетка карточек показателей. Позволяет быстро получить общее представление о количестве находок, распределении по уровню серьезности (CRITICAL, HIGH, MEDIUM, LOW) и общем количестве устраненных уязвимостей (FIXED).
2. Интерактивная сводная таблица результатов
Матрица уязвимостей. Таблица с возможностью фильтрации, содержащая следующие данные: ID, Severity, Status (OPEN и FIXED), CWE Type, File Location, Vulnerability Title и Confidence Score.
3. Глубокий анализ основных причин и фрагмент уязвимого исходного кода
Сворачиваемый анализ первопричин. Нажмите на строку с результатами, чтобы развернуть подробный анализ первопричин, созданный моделью Gemini для обоснования безопасности.
Фрагмент уязвимого исходного кода. Показывает точные номера строк и исходный код с подсветкой синтаксиса вокруг уязвимого приемника.
4. Синтезированные ИИ исправления
Унифицированное представление различий. Для устраненных уязвимостей (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 ( |
Проверяем концепцию вручную: создаем специальные полезные нагрузки curl и скрипты атак, чтобы подтвердить уязвимости. | Автоматизированные доказательства эксплойтов ( |
Высокий риск при ручном рефакторинге. Ручное исправление сложных запросов к базе данных часто приводит к синтаксическим ошибкам или ошибкам выполнения. | Idiomatic Patch Synthesis ( |
Риски регрессии в рабочей среде. Исправления уязвимостей часто нарушают бизнес-логику или тесты. | Автоматизированные тестовые ограничения. Постоянная проверка с помощью локальных наборов тестов и изолированных песочниц процессов. |
Ручной сбор данных о соответствии требованиям. Сбор данных в статические документы для аудита. | Стандартизированная телеметрия и SARIF ( |
Дальнейшие действия
🚀 Продолжение трилогии 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++.