1. Sebelum memulai
⏱️ Durasi: 03.00
Selamat datang di codelab interaktif untuk Mengamankan Aplikasi Anda dengan CodeMender di Gemini Enterprise Agent Platform Google Cloud.
Dalam workshop ini, Anda akan berperan sebagai Cloud Security Engineer yang bertugas mengaudit dan mengamankan OWASP Juice Shop—aplikasi web standar industri yang sengaja dibuat rentan dengan Node.js, Express, TypeScript, dan Angular.
Alat pemindaian keamanan tradisional (SAST/DAST) membanjiri tim pengembangan dengan ribuan temuan keamanan statis, rasio positif palsu yang tinggi, dan tanpa perbaikan kode yang dapat ditindaklanjuti. Developer menghabiskan waktu berjam-jam untuk melakukan triase log, melacak aliran data, dan menulis patch secara manual yang sering kali merusak perilaku aplikasi yang ada.
CodeMender merevolusi keamanan kode dengan menggabungkan infrastruktur pengelola agen yang disesuaikan dengan LLM Gemini Google. Dengan menggunakan perintah yang dirancang oleh Google DeepMind, keterampilan keamanan khusus, dan orkestrasi multi-agen, CodeMender bertindak sebagai Co-developer Keamanan AI otonom yang menemukan, memverifikasi, dan memperbaiki kerentanan software langsung dalam repositori sumber lokal.
Prasyarat
- Pemahaman dasar tentang kerentanan aplikasi web (OWASP Top 10, seperti Injeksi SQL dan XSS)
- Pemahaman dasar tentang aplikasi JavaScript/TypeScript dan Node.js
- Pemahaman dasar tentang alat antarmuka command line (CLI)
Yang akan Anda pelajari
- Cara menyiapkan, mengautentikasi, dan melakukan inisialisasi CLI CodeMender (
cm) di Google Cloud Shell. - Cara memindai repositori secara mandiri untuk menemukan kerentanan yang dapat dieksploitasi (
cm find). - Cara memvalidasi kerentanan di sandbox terisolasi dan memeriksa artefak verifikasi (
cm verify). - Cara menyintesis, menguji, dan menerapkan patch keamanan kontekstual secara mandiri (
cm fix). - Cara mengaudit telemetri token dan mengekspor laporan kepatuhan multi-format (
cm stats,cm report).
Yang Anda perlukan
- Project Google Cloud yang mengaktifkan penagihan
- Google Cloud Shell dengan koneksi project aktif (mencakup
gcloud,git, dan Node.js 18+ yang telah diinstal sebelumnya) - Repositori awal: Repositori GitHub OWASP Juice Shop
2. Pengantar arsitektur CodeMender
⏱️ Durasi: 04.00
Sebelum mempelajari pemindaian dan perbaikan kode, mari kita pahami cara kerja CodeMender di balik layar dalam Gemini Enterprise Agent Platform sesuai dengan standar arsitektur resmi Google Cloud.
Arsitektur sistem: Daemon agen dan klien

Dari perspektif pengguna, CodeMender terdiri dari dua komponen arsitektur utama:
Hosted Multi-Agent Platform: Sistem multi-agen yang dihosting dan berjalan di Google Cloud yang menjalankan logika bisnis keamanan inti, rekayasa perintah LLM, dan penalaran keamanan.
Local Client CLI & Sandbox Daemon (cm): Klien yang berjalan di Google Cloud Shell yang bertindak sebagai CLI (untuk mengeluarkan perintah seperti cm find, cm verify, cm fix) dan daemon lokal (untuk menjalankan perintah dengan aman atas nama agen di dalam sandbox tingkat proses yang terisolasi).
3 kemampuan perbaikan inti

CodeMender menangani keamanan kode melalui tiga tahap terintegrasi:
Menemukan Kerentanan (cm find): Memindai codebase menggunakan LLM yang dipandu oleh agen, memanfaatkan alat keamanan khusus dan rekayasa perintah untuk memfokuskan model pada kelemahan keamanan. (Atau, temuan dapat diimpor dari alat pemindaian keamanan eksternal).
Verify Vulnerabilities (cm verify): Mem-build kode secara lokal dan mencoba mengeksploitasi kelemahan yang ditemukan untuk memverifikasi apakah kelemahan tersebut dapat dieksploitasi. Hal ini menghilangkan positif palsu dan menghasilkan artefak verifikasi ruang kerja persisten di .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md).
Fix Vulnerabilities (cm fix): Menyintesis patch sumber yang memahami bahasa dan memverifikasinya dengan menjalankan build project dan suite pengujian regresi (npm test) di dalam sandbox lokal.
3. Menyiapkan lingkungan OWASP Juice Shop
⏱️ Durasi: 05.00
Pada langkah ini, Anda akan membuka lingkungan terminal Google Cloud dan mengambil repositori aplikasi target.
Langkah 1: Buka Cloud Shell di Konsol Google Cloud
Buka Konsol Google Cloud di browser Anda.
Di menu navigasi atas, klik tombol Activate Cloud Shell (ikon >_).
Cloud Shell menyediakan terminal Linux berbasis browser dengan gcloud, git, dan Node.js yang telah diinstal dan diautentikasi.
Langkah 2: Clone repositori OWASP Juice Shop
Di Cloud Shell atau terminal lokal Anda, clone repositori OWASP Juice Shop:
git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop
Langkah 3: Periksa file aplikasi utama
OWASP Juice Shop menggunakan Express.js di backend dengan modul TypeScript. Lihat sekilas struktur direktori:
ls -la routes/ lib/
Perhatikan file rute utama yang menangani autentikasi, kueri pengguna, dan administrasi keranjang:
routes/login.ts: Menangani autentikasi pengguna dan eksekusi kueri SQL mentah.
routes/search.ts: Menangani penelusuran produk dan rendering respons.
routes/basket.ts: Menangani pengambilan keranjang belanja pengguna.
routes/trackOrder.ts: Menangani pelacakan pesanan melalui kueri NoSQL.
lib/xml.ts: Menangani penguraian XML dan upload file.
lib/insecurity.ts: Utilitas bantuan untuk token sesi dan enkripsi.
4. Menginstal CodeMender CLI (cm) dan mengautentikasi kredensial GCP
⏱️ Durasi: 08.00
Pada langkah ini, Anda akan mengaktifkan Google Cloud API yang diperlukan, memberikan izin IAM menggunakan gcloud, mendownload dan menginstal biner cm CLI, serta mengonfigurasi Kredensial Default Aplikasi (ADC).
Langkah 1: Aktifkan Google Cloud API yang diperlukan melalui gcloud
CodeMender memerlukan Agent Platform API (aiplatform.googleapis.com) dan Cloud Resource Manager API (cloudresourcemanager.googleapis.com) di Gemini Enterprise Agent Platform.
Di Cloud Shell atau terminal Anda, ambil Project ID aktif Anda (atau periksa dropdown project di bagian atas Konsol Google Cloud) dan aktifkan API layanan yang diperlukan:
# 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}
Pastikan API diaktifkan:
gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"
Langkah 2: Berikan izin IAM melalui gcloud
Untuk berinteraksi dengan mesin penalaran cloud CodeMender, pengguna dan akun layanan harus diberi peran IAM roles/aiplatform.user (Agent Platform User).
Memberikan peran IAM ke akun pengguna Anda melalui 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"
Langkah 3: Download dan instal cm CLI di Cloud Shell
Di Google Cloud Shell, data pengguna disimpan secara persisten di direktori $HOME Anda. Jalankan perintah berikut untuk menginstal cm ke dalam ~/bin tanpa memerlukan sudo. Anda masih berada di ~/juice-shop dari bagian sebelumnya, sehingga perintah akan didownload ke direktori sementara dan dibersihkan setelahnya. Dengan begitu, tidak ada file penginstal yang berakhir di repositori 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
Langkah 4: Verifikasi penginstalan CLI cm
Jalankan cm --version untuk memverifikasi bahwa biner CLI telah diinstal dengan benar:
cm --version
Output yang diharapkan:
cm version 0.17.0
Langkah 5: Konfigurasikan Kredensial Default Aplikasi (ADC) Google Cloud
Konfigurasikan Kredensial Default Aplikasi (ADC) Google Cloud agar cm dapat mengautentikasi permintaan ke mesin penalaran cloud:
gcloud auth application-default login
Dialog modal otorisasi berlabel Authorize Cloud Shell akan muncul. Klik Authorize untuk memberikan akses.
5. Melakukan inisialisasi dan memverifikasi ruang kerja CodeMender
⏱️ Durasi: 03.00
Setelah cm diinstal dan diautentikasi, Anda akan melakukan inisialisasi ruang kerja CodeMender di dalam direktori project target dan memverifikasi penyiapan lingkungan Anda.
Langkah 1: Lakukan inisialisasi ruang kerja CodeMender (cm init)
Jalankan cm init dari root direktori project Anda untuk melakukan inisialisasi file pelacakan status lokal dan membuat konfigurasi dasar pengukuran:
cm init
Output:
✅ Initialized CodeMender workspace at /home/user/.codemender
Langkah 2: Jalankan diagnostik kondisi menyeluruh (cm health)
Sebelum meluncurkan sesi agen, jalankan cm health untuk memverifikasi kredensial, konfigurasi, jangkauan, dan otorisasi Anda:
cm health
Output:
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)
Langkah 3: Memahami parameter konfigurasi (config.yaml)
CodeMender membuat file konfigurasi ruang kerja di .codemender/config.yaml (atau ~/.codemender/config.yaml). File ini menentukan batasan kebijakan, aturan penyertaan file, dan hook verifikasi pengujian:
# 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. Menemukan kerentanan dengan cm find .
⏱️ Durasi: 07.00
Pada langkah ini, Anda akan menjalankan cm find . --quick untuk menjalankan pemindaian keamanan agentic di seluruh codebase Juice Shop.
Langkah 1: Jalankan cm find . --quick
Mulai CodeMender v0.16.0, cm find <path> ditetapkan secara default ke Deep Scan (
--deep
) untuk analisis file per file yang mendalam, sedangkan Quick Scan (
--quick
) menyediakan triase repositori yang cepat. Jalankan cm find . --quick untuk melakukan Pemindaian Cepat di seluruh repositori OWASP Juice Shop (Perkiraan waktu eksekusi: ~8 menit untuk triase codebase lengkap yang berisi 684 file):
cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash
cm meluncurkan sesi pemindaian di Gemini Enterprise Agent Platform, yang menganalisis file kode sumber di semua modul repositori:
⚠️ 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
Langkah 2: Tinjau temuan pemindaian melalui cm report
Jalankan cm report -f table untuk menampilkan semua temuan keamanan yang ditemukan dari database status SQLite lokal:
cm report -f table
Output:
┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐ │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
Langkah 3: Memahami status siklus proses temuan dan tingkat keparahan
CodeMender melacak kerentanan melalui siklus proses formal dengan empat status:
Status Temuan | Arti dan Penanganan Transisi |
| Kerentanan telah ditemukan (atau diimpor), tetapi belum diverifikasi, di-patch, atau ditutup. |
| CodeMender telah membuat patch, menerapkan perbedaan, dan memverifikasi bahwa suite build/pengujian lulus dan eksploitasi gagal. |
| Ditandai tidak aktif karena keyakinan rendah, di luar model ancaman, atau diverifikasi sebagai positif palsu. Menonaktifkan notifikasi mendatang. |
| Kelemahan yang sebelumnya |
Klasifikasi tingkat keparahan
🔴 CRITICAL: Risiko langsung dan parah (misalnya, Eksekusi Kode Jarak Jauh, Injeksi SQL yang tidak diautentikasi) yang dapat dijangkau langsung dari batas yang tidak tepercaya.
: HIGH: Kelemahan parah (misalnya, pembacaan database arbitrer, eskalasi hak istimewa) yang memerlukan konteks pengguna tertentu atau kondisi berantai.
🟡 MEDIUM: Risiko sedang dengan cakupan terbatas atau memerlukan interaksi pengguna (misalnya, Pengalihan Terbuka, CSRF).
🔵 LOW: Kelemahan kebersihan defense-in-depth atau vektor pengintaian dengan dampak langsung minimal.
7. Memverifikasi kerentanan dan mempelajari artefak verifikasi yang diambil
⏱️ Durasi: 10.00
Salah satu fitur utama CodeMender adalah pembuatan otomatis Artefak Verifikasi persisten setiap kali Anda menjalankan cm verify. Mari kita verifikasi temuan Injeksi SQL Kritis di routes/login.ts (diilustrasikan sebagai 43aa7446 dalam tutorial ini) dan pelajari artefak yang dibuat oleh agen.
Langkah 1: Jalankan cm verify <login-finding-id>
Temukan ID temuan untuk routes/login.ts dari tabel cm report (misalnya, 43aa7446), dan jalankan cm verify <finding-id> --sandbox=false --bypass-warning -y (Perkiraan waktu eksekusi: ~20 menit untuk menjalankan langkah-langkah alat otonom, memulai layanan latar belakang, dan menjalankan skrip eksploitasi PoC live):
# 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
Output:
⚠️ 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
Langkah 2: Ringkasan artefak verifikasi yang diambil
Mulai CodeMender v0.16.0, artefak verifikasi distandarkan di root repositori di bagian .exploit/, sekaligus mempertahankan salinan persisten di ~/.codemender/artifacts/<session-id>/. File ini adalah file kerja lokal, bukan bagian dari perbaikan Anda, jadi Anda akan mengecualikannya dari Git sebelum melakukan staging patch di bagian berikutnya. Jalankan ls -la .exploit/ untuk mencantumkannya:
ls -la .exploit/
Output:
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
File Artefak | Kategori | Tujuan |
| Manifes Metadata | YAML terstruktur yang menentukan UUID temuan, judul, tingkat keparahan ( |
| Strategi Agen | Rencana dan checklist verifikasi langkah demi langkah yang dijalankan secara mandiri oleh mesin penalaran CodeMender. |
| Log Rekaman Aktivitas Eksekusi | Jejak audit bertanda waktu yang mencatat setiap panggilan alat, endpoint permintaan HTTP, dan hasil pengujian. |
| Log Server/Runner Pembantu | Skrip bantuan yang dibuat agen untuk memulai Juice Shop untuk pengujian, dan output server yang diambil. |
| Wrapper Eksekusi/PoC Mandiri | Wrapper skrip shell yang meluncurkan layanan target dan memanggil klien PoC, yang memvalidasi respons HTTP 200. |
| Analisis Akar Masalah | Ringkasan eksekutif, analisis kerentanan baris demi baris, perincian SQL mentah, dan rekomendasi parameterisasi Sequelize. |
Langkah 3: Panduan mendalam tentang sorotan artefak verifikasi
Agen menulis artefak ini baru pada setiap operasi, sehingga konten persisnya berbeda setiap kali. Buka file tersebut di Cloud Shell Editor (atau dengan cat) dan cari hal berikut:
Artefak | Yang perlu diperhatikan |
| ID lengkap, judul, tingkat keparahan, keyakinan, dan tag temuan seperti |
| Checklist yang diikuti agen, mulai dari membaca file yang dilaporkan hingga menulis skrip reproduksi. |
| Tindakan dan hasil yang diberi stempel waktu, termasuk hasil dari setiap eksekusi skrip reproduksi. |
| Skrip reproduksi mandiri: cara skrip memulai aplikasi, endpoint yang ditargetkan, dan cara skrip menentukan keberhasilan (skrip mencetak |
| File bantuan yang dibuat agen untuk memulai Juice Shop untuk pengujian, dan output server tersebut. |
| Analisis akar masalah: baris yang rentan di |
8. Memperbaiki injeksi SQL dengan cm fix
⏱️ Durasi: 10.00
Setelah memverifikasi temuan injeksi SQL di routes/login.ts (ID contoh 43aa7446) dan memeriksa artefaknya, mari kita jalankan cm fix untuk menerapkan patch kueri berparameter otomatis.
Langkah 1: Jalankan cm fix <login-finding-id> -y
Jalankan cm fix <finding-id> --sandbox=false --bypass-warning -y (ganti 43aa7446 dengan ID temuan login Anda yang sebenarnya dari cm report) untuk menyintesis dan menerapkan perbaikan:
# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
Output:
⚠️ 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
Langkah 2: Periksa status dan perbedaan VCS menggunakan cm vcs
Jalankan cm vcs status dan cm vcs diff untuk melihat file ruang kerja yang diubah:
cm vcs status
cm vcs diff
Output:
📂 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
Dua entri yang tidak dilacak adalah file lokal CodeMender, bukan bagian dari perbaikan: .exploit/ menyimpan artefak verifikasi dari cm verify, dan .cm_project menandai root project untuk CodeMender. Anda akan mengecualikannya dari commit di langkah berikutnya.
Dan 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 !== '') {
Langkah 3: Tempatkan patch yang telah diverifikasi dengan cm vcs stage
Setelah Anda meninjau diff terpadu dan mengonfirmasi bahwa perbaikan memenuhi standar kualitas dan keamanan Anda, siapkan patch untuk commit. Karena cm vcs stage menjalankan git add -A, perintah ini akan men-stage setiap perubahan di hierarki kerja, termasuk entri .exploit/ dan .cm_project yang tidak dilacak dari Langkah 2. Pertama, tambahkan file tersebut ke .git/info/exclude, file pengabaian khusus lokal yang tidak pernah di-commit oleh Git, sehingga hanya patch yang di-stage:
# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude
Kemudian, siapkan perubahan menggunakan cm vcs stage:
cm vcs stage
Output:
📦 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.
Pastikan hanya patch yang di-stage di Git:
cm vcs status
Output:
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts
Jika Anda menjalankan cm vcs stage sebelum mengupdate .git/info/exclude, batalkan penahapan file CodeMender dengan git restore --staged .exploit .cm_project. File tetap berada di disk; file hanya dihapus dari area staging.
Langkah 4: Commit patch dan hapus artefak verifikasi
Commit patch yang di-stage sebelum Anda memperbaiki temuan berikutnya: setiap operasi cm fix dan cm verify dimulai dengan mereset ruang kerja (git checkout HEAD -- . && git clean -fd), yang akan menghapus perubahan yang belum di-commit. Kemudian, hapus folder .exploit/ lokal agar perbaikan berikutnya dimulai dari ruang kerja yang bersih. Karena .exploit/ kini diabaikan, git clean -fd tidak lagi menghapusnya untuk Anda. Salinan persisten artefak tetap ada di ~/.codemender/artifacts/<session-id>/.
git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/
Jika Git meminta identitas Anda, jalankan git config user.name "Your Name" dan git config user.email "you@example.com" di repositori, lalu lakukan commit lagi.
9. Memvalidasi patch, mengelola sesi, dan mengekspor laporan (laporan cm)
⏱️ Durasi: 08.00
Setelah menerapkan perbaikan keamanan yang dihasilkan AI, Anda harus mengelola sesi aktif, memeriksa statistik penggunaan token, dan membuat laporan kepatuhan keamanan perusahaan menggunakan cm report.
Langkah 1: Kelola sesi stateful (cm session list / resume / cancel)
CodeMender melacak setiap tugas pemindaian, verifikasi, dan remediasi sebagai sesi stateful dalam database SQLite lokalnya (~/.codemender/state.db). Jalankan cm session list untuk memeriksa sesi Anda:
cm session list
Output:
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
Langkah 2: Jalankan cm report untuk memverifikasi temuan yang telah diperbaiki
Jalankan cm report -f table untuk menampilkan status temuan yang diperbarui (perhatikan bahwa temuan yang telah diperbaiki kini menampilkan FIXED dengan ✅ applied di kolom Fix):
cm report -f table
Output:
┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐ │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
Langkah 3: Periksa penggunaan token menggunakan cm stats
Jalankan cm stats untuk memeriksa konsumsi token lokal di seluruh mode pemindaian (cm find --quick, cm verify, dan cm fix):
cm stats
Output:
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
Langkah 4: Buat dan lihat pratinjau laporan HTML interaktif (cm report -f html)
Ekspor temuan pemindaian dan patch yang diterapkan sebagai dasbor HTML interaktif mandiri:
cm report -f html
cp ~/.codemender/reports/report.html ./report.html
Untuk melihat report.html di Google Cloud Shell:
Mulai server web pratinjau lokal di terminal Cloud Shell Anda:
python3 -m http.server 8080
Di toolbar kanan atas Cloud Shell, klik tombol Web Preview (ikon dengan mata/layar) ➔ Preview on port 8080 untuk melihat dasbor kepatuhan interaktif di browser Anda.
(Alternatif) Di file explorer Cloud Shell Editor, klik kanan report.html dan klik Download untuk melihat file di browser lokal Anda.
Langkah 5: Fitur utama laporan HTML interaktif yang dihasilkan
Berikut adalah perincian komponen utama laporan HTML interaktif yang dihasilkan (report.html):

1. Header metrik eksekutif dan kartu postur
Metadata Header: Menampilkan detail repositori target (OWASP Juice Shop), total file sumber yang dipindai (684 files), dan stempel waktu pembuatan UTC.
Petak Kartu Metrik: Memberikan ringkasan tingkat tinggi instan tentang total temuan, distribusi tingkat keparahan (CRITICAL, HIGH, MEDIUM, LOW), dan total kerentanan yang telah diperbaiki (FIXED).
2. Tabel ringkasan temuan interaktif
Matriks Kerentanan: Menampilkan tabel yang dapat difilter yang berisi ID, Severity, Status (OPEN vs FIXED), CWE Type, File Location, Vulnerability Title, dan Confidence Score.
3. Analisis akar masalah yang mendalam dan cuplikan kode sumber yang rentan
Analisis yang Dapat Diciutkan (RCA): Mengklik baris temuan mana pun akan meluaskan Analisis Akar Masalah mendetail yang disintesis oleh model penalaran keamanan Gemini.
Cuplikan Kode Sumber yang Rentan: Menampilkan nomor baris yang tepat dan kode sumber yang ditandai sintaksisnya di sekitar sink yang rentan.
4. Diff patch perbaikan AI yang disintesis
Tampilan Diff Terpadu: Untuk kerentanan yang telah diperbaiki (FIXED), CodeMender merender blok diff terpadu yang menandai penambahan kode yang diterapkan dengan warna hijau (+) dan kode rentan yang dihapus dengan warna merah (-).
Langkah 6: (Opsional) Impor temuan SAST pihak ketiga (cm report import)
CodeMender tidak terbatas pada kelemahan yang ditemukan oleh pemindainya sendiri. Tim dapat mengimpor hasil SAST eksternal (misalnya dari Semgrep, Snyk, SonarQube, atau Fortify) menggunakan skema JSON standar atau wizard interaktif, sehingga CodeMender dapat segera memverifikasi dan menyintesis perbaikan untuk hasil tersebut:
# 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
Output:
Successfully imported 1 findings. 2026-10-22T02:27:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log
10. Membersihkan resource
⏱️ Durasi: 01:00
Untuk menghindari penggunaan disk yang tidak perlu di lingkungan Google Cloud Shell Anda dan membersihkan resource workshop sementara, ikuti langkah-langkah pembersihan berikut.
Langkah 1: Hapus total cache lokal CodeMender dan hapus repositori
CodeMender menyediakan perintah cm clean bawaan untuk menghapus total database temuan lokal (~/.codemender/state.db), laporan HTML, dan file cadangan sumber. Jalankan perintah berikut di Cloud Shell:
# Purge local SQLite findings cache, HTML reports, and backup files
cm clean
# Remove cloned repository
cd ~
rm -rf ~/juice-shop
Langkah 2: (Opsional) Nonaktifkan Google Cloud API
Jika Anda tidak berencana menggunakan CodeMender atau Agent Platform API dalam project ini untuk pengembangan lebih lanjut, Anda dapat menonaktifkan API layanan:
gcloud services disable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=${PROJECT_ID}
11. Selamat
⏱️ Durasi: 02.00
Selamat! Anda telah berhasil mengubah OWASP Juice Shop dari aplikasi yang sengaja dibuat rentan menjadi codebase yang diperkuat dan aman menggunakan CodeMender di Gemini Enterprise Agent Platform Google Cloud.
Yang telah Anda bahas
Perbaikan Loop Tertutup Otonom: CodeMender melampaui gangguan pemberitahuan statis pasif dengan menjalankan siklus proses keamanan yang lengkap dan mandiri—mulai dari penemuan repositori (cm find) hingga verifikasi eksploitasi sandbox (cm verify) dan sintesis patch yang diuji regresi (cm fix).
Bukti Eksploitasi Berbasis Bukti: Dengan menangkap artefak verifikasi nyata (PLAN.md, LOG.md, exploit.sh, REPORT.md), CodeMender menghilangkan positif palsu dan membuktikan eksploitabilitas di dunia nyata sebelum menulis kode apa pun.
Perbaikan Idiomatik yang Berorientasi Konteks: Daripada menerapkan penggantian teks generik, agen penalaran Gemini menganalisis arsitektur aplikasi, model data, dan ORM untuk menghasilkan patch yang bersih dan mudah dikelola (seperti kueri Sequelize berparameter) yang mempertahankan logika bisnis yang ada.
Guardrail Pengujian & Keamanan Bawaan: Setiap perbaikan yang diusulkan akan otomatis divalidasi terhadap suite pengujian project (npm test) dan pemeriksa jenis (tsc) di dalam sandbox ruang kerja yang terisolasi sebelum perubahan di-stage.
Perubahan pola pikir developer
Alur Kerja SAST Manual Tradisional | Perbaikan Mandiri dengan CodeMender (cm) |
Kejenuhan Pemberitahuan: Berjam-jam dihabiskan untuk melakukan triase laporan yang mengganggu dengan tingkat positif palsu yang tinggi. | Agentic Code Discovery ( |
Verifikasi PoC Manual: Membuat payload curl kustom dan skrip serangan untuk mengonfirmasi kerentanan. | Bukti Eksploitasi Otomatis ( |
Refaktorisasi Manual Berisiko Tinggi: Mem-patch kueri database yang kompleks secara manual, yang sering kali menyebabkan error sintaksis atau runtime. | Idiomatic Patch Synthesis ( |
Risiko Regresi Produksi: Patch keamanan sering kali merusak logika bisnis atau pengujian downstream. | Guardrail Pengujian Otomatis: Validasi berkelanjutan terhadap suite pengujian lokal dan sandbox proses yang terisolasi. |
Kompilasi Kepatuhan Manual: Menggabungkan temuan secara manual ke dalam dokumen statis untuk peninjauan audit. | Telemetri & SARIF Terstandardisasi ( |
Langkah berikutnya
🚀 Lanjutkan Trilogi CodeMender:
Bagian 2: Amankan Pipeline CI/CD Anda dengan CodeMender — Otomatiskan pemindaian headless berkelanjutan, integrasi dasbor SARIF, dan permintaan pull yang dapat memperbaiki diri sendiri di GitHub Actions.
Bagian 3: Secure Vibe-Coding with Antigravity and CodeMender — Padukan pengembangan AI generatif dengan asisten keamanan otonom.
📖 Pelajari Dokumentasi:
CodeMender di Dokumentasi Google Cloud
💡 Terapkan ke Project Anda Sendiri:
Jalankan cm find . dan cm fix di repositori Node.js, Python, Go, Java, Rust, atau C/C++ Anda sendiri.