Mengamankan Aplikasi Anda dengan CodeMender

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

Alur Kerja Mesin Remediasi Otonom CodeMender

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

Alur Perbaikan Mandiri CodeMender

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

OPEN

Kerentanan telah ditemukan (atau diimpor), tetapi belum diverifikasi, di-patch, atau ditutup.

FIXED

CodeMender telah membuat patch, menerapkan perbedaan, dan memverifikasi bahwa suite build/pengujian lulus dan eksploitasi gagal.

DISMISSED

Ditandai tidak aktif karena keyakinan rendah, di luar model ancaman, atau diverifikasi sebagai positif palsu. Menonaktifkan notifikasi mendatang.

REOPENED

Kelemahan yang sebelumnya FIXED atau DISMISSED terdeteksi ulang dalam pemindaian berikutnya (menunjukkan regresi kode).

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

info.yaml

Manifes Metadata

YAML terstruktur yang menentukan UUID temuan, judul, tingkat keparahan (CRITICAL), keyakinan (certain), dan tag CWE (cwe-89).

PLAN.md

Strategi Agen

Rencana dan checklist verifikasi langkah demi langkah yang dijalankan secara mandiri oleh mesin penalaran CodeMender.

LOG.md

Log Rekaman Aktivitas Eksekusi

Jejak audit bertanda waktu yang mencatat setiap panggilan alat, endpoint permintaan HTTP, dan hasil pengujian.

server_runner.js / server.log

Log Server/Runner Pembantu

Skrip bantuan yang dibuat agen untuk memulai Juice Shop untuk pengujian, dan output server yang diambil.

exploit.sh

Wrapper Eksekusi/PoC Mandiri

Wrapper skrip shell yang meluncurkan layanan target dan memanggil klien PoC, yang memvalidasi respons HTTP 200.

REPORT.md

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

info.yaml

ID lengkap, judul, tingkat keparahan, keyakinan, dan tag temuan seperti cwe-89.

PLAN.md

Checklist yang diikuti agen, mulai dari membaca file yang dilaporkan hingga menulis skrip reproduksi.

LOG.md

Tindakan dan hasil yang diberi stempel waktu, termasuk hasil dari setiap eksekusi skrip reproduksi.

exploit.sh

Skrip reproduksi mandiri: cara skrip memulai aplikasi, endpoint yang ditargetkan, dan cara skrip menentukan keberhasilan (skrip mencetak EXPLOIT SUCCESSFUL).

server_runner.js / server.log

File bantuan yang dibuat agen untuk memulai Juice Shop untuk pengujian, dan output server tersebut.

REPORT.md

Analisis akar masalah: baris yang rentan di routes/login.ts, alasan baris tersebut dapat dieksploitasi, dan perbaikan yang direkomendasikan (kueri berparameter).

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

Ringkasan Dasbor Kepatuhan Keamanan CodeMender

1. Header metrik eksekutif dan kartu postur

Header Metrik Eksekutif dan Kartu Postur CodeMenderMetadata 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

Tabel Ringkasan Temuan CodeMenderMatriks 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 Akar Masalah dan Cuplikan Kode CodeMenderAnalisis 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

Diff Patch Perbaikan yang Disintesis CodeMenderTampilan 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 (cm find .): Pemindaian repositori yang mendalam dan peka konteks yang didukung oleh model Gemini.

Verifikasi PoC Manual: Membuat payload curl kustom dan skrip serangan untuk mengonfirmasi kerentanan.

Bukti Eksploitasi Otomatis (cm verify ): Sintesis otomatis rencana validasi, log, dan skrip shell yang dapat dieksekusi.

Refaktorisasi Manual Berisiko Tinggi: Mem-patch kueri database yang kompleks secara manual, yang sering kali menyebabkan error sintaksis atau runtime.

Idiomatic Patch Synthesis (cm fix ): Pembuatan diff berbasis konteks yang disesuaikan dengan ORM dan standar framework yang ada.

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 (cm report -f sarif): Ekspor instan OASIS SARIF v2.1.0, dasbor HTML, dan analisis token.

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

Solusi Keamanan 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.