1. ก่อนเริ่มต้น
⏱️ ระยะเวลา: 03:00
ยินดีต้อนรับสู่ Codelab แบบลงมือปฏิบัติจริงสำหรับการรักษาความปลอดภัยแอปพลิเคชันด้วย CodeMender บนแพลตฟอร์ม Agent ของ Gemini Enterprise ของ Google Cloud
ในเวิร์กช็อปนี้ คุณจะได้สวมบทบาทเป็นวิศวกรด้านความปลอดภัยในระบบคลาวด์ที่มีหน้าที่ตรวจสอบและรักษาความปลอดภัยให้กับ OWASP Juice Shop ซึ่งเป็นเว็บแอปพลิเคชันที่สร้างขึ้นโดยตั้งใจให้มีช่องโหว่ตามมาตรฐานอุตสาหกรรม โดยใช้ Node.js, Express, TypeScript และ Angular
เครื่องมือสแกนความปลอดภัยแบบดั้งเดิม (SAST/DAST) จะส่งผลการสแกนความปลอดภัยแบบคงที่หลายพันรายการ อัตราผลบวกลวงสูง และไม่มีการแก้ไขโค้ดที่นำไปใช้ได้จริงให้กับทีมพัฒนา นักพัฒนาแอปใช้เวลาหลายชั่วโมงในการคัดแยกล็อก ติดตามการไหลของข้อมูล และเขียนแพตช์ด้วยตนเองซึ่งมักจะทำให้ลักษณะการทำงานของแอปพลิเคชันที่มีอยู่เสียหาย
CodeMender ปฏิวัติความปลอดภัยของโค้ดด้วยการรวมระบบควบคุมการทำงานของ Agent ที่ปรับแต่งมาอย่างดีเข้ากับ LLM ของ Gemini จาก Google CodeMender ใช้พรอมต์ที่ออกแบบโดย Google DeepMind, ทักษะด้านความปลอดภัยเฉพาะทาง และการจัดการหลาย Agent เพื่อทำหน้าที่เป็นผู้ร่วมพัฒนาด้านความปลอดภัยด้วย AI แบบอัตโนมัติที่ค้นหา ยืนยัน และแก้ไขช่องโหว่ของซอฟต์แวร์โดยตรงภายในที่เก็บซอร์สโค้ดในเครื่อง
ข้อกำหนดเบื้องต้น
- มีความเข้าใจพื้นฐานเกี่ยวกับช่องโหว่ของเว็บแอปพลิเคชัน (รายการความเสี่ยงด้านความปลอดภัย 10 อันดับสูงสุดของ OWASP เช่น การแทรก SQL และ XSS)
- มีความคุ้นเคยเบื้องต้นกับแอปพลิเคชัน JavaScript/TypeScript และ Node.js
- ความคุ้นเคยพื้นฐานกับเครื่องมืออินเทอร์เฟซบรรทัดคำสั่ง (CLI)
สิ่งที่คุณจะได้เรียนรู้
- วิธีตั้งค่า ตรวจสอบสิทธิ์ และเริ่มต้น CodeMender (
cm) CLI ใน Google Cloud Shell - วิธีสแกนที่เก็บข้อมูลโดยอัตโนมัติเพื่อค้นหาช่องโหว่ที่ใช้ประโยชน์ได้ (
cm find) - วิธีตรวจสอบช่องโหว่ในแซนด์บ็อกซ์ที่แยกต่างหากและตรวจสอบอาร์ติแฟกต์การยืนยัน (
cm verify) - วิธีสังเคราะห์ ทดสอบ และใช้แพตช์ด้านความปลอดภัยที่คำนึงถึงบริบทโดยอัตโนมัติ (
cm fix) - วิธีตรวจสอบการส่งข้อมูลทางไกลของโทเค็นและส่งออกรายงานการปฏิบัติตามข้อกำหนดแบบหลายรูปแบบ (
cm stats,cm report)
สิ่งที่ต้องมี
- โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
- Google Cloud Shell ที่มีการเชื่อมต่อโปรเจ็กต์ที่ใช้งานอยู่ (รวมถึง
gcloud,gitและ Node.js 18 ขึ้นไปที่ติดตั้งไว้ล่วงหน้า) - ที่เก็บเริ่มต้น: ที่เก็บ OWASP Juice Shop GitHub
2. ข้อมูลเบื้องต้นเกี่ยวกับสถาปัตยกรรม CodeMender
⏱️ ระยะเวลา: 04:00
ก่อนที่จะเจาะลึกเรื่องการสแกนและการแก้ไขโค้ด เรามาทำความเข้าใจวิธีการทำงานเบื้องหลังของ CodeMender ภายในแพลตฟอร์ม Gemini Enterprise Agent ตามมาตรฐานสถาปัตยกรรมอย่างเป็นทางการของ Google Cloud กันก่อน
สถาปัตยกรรมระบบ: Agent และ Daemon ของไคลเอ็นต์

จากมุมมองของผู้ใช้ CodeMender ประกอบด้วยองค์ประกอบทางสถาปัตยกรรมหลัก 2 ส่วน ได้แก่
แพลตฟอร์มแบบหลาย Agent ที่โฮสต์: ระบบแบบหลาย Agent ที่โฮสต์ซึ่งทำงานบน Google Cloud ซึ่งจะดำเนินการตรรกะทางธุรกิจด้านความปลอดภัยหลัก, วิศวกรรมพรอมต์ (Prompt Engineering) ของ LLM และการให้เหตุผลด้านความปลอดภัย
Local Client CLI & Sandbox Daemon (cm): ไคลเอ็นต์ที่ทำงานใน Google Cloud Shell ซึ่งทำหน้าที่เป็นทั้ง CLI (เพื่อออกคำสั่ง เช่น cm find, cm verify, cm fix) และ Daemon ในเครื่อง (เพื่อเรียกใช้คำสั่งอย่างปลอดภัยในนามของ Agent ภายในแซนด์บ็อกซ์ระดับกระบวนการที่แยกต่างหาก)
ความสามารถหลัก 3 ประการในการแก้ไข

CodeMender จัดการความปลอดภัยของโค้ดผ่าน 3 ขั้นตอนแบบผสานรวม ดังนี้
ค้นหาช่องโหว่ (cm find): สแกนฐานของโค้ดโดยใช้ LLM ที่ได้รับคำแนะนำจาก Agent โดยใช้เครื่องมือรักษาความปลอดภัยเฉพาะทางและวิศวกรรมพรอมต์ (Prompt Engineering) เพื่อมุ่งเน้นโมเดลไปที่ข้อบกพร่องด้านความปลอดภัย (หรือจะนำเข้าผลการตรวจพบจากเครื่องมือสแกนความปลอดภัยภายนอกก็ได้)
ยืนยันช่องโหว่ (cm verify): สร้างโค้ดในเครื่องและพยายามใช้ประโยชน์จากข้อบกพร่องที่พบเพื่อยืนยันว่าสามารถใช้ประโยชน์ได้หรือไม่ ซึ่งจะช่วยขจัดผลบวกลวงและสร้างอาร์ติแฟกต์การยืนยันพื้นที่ทำงานแบบถาวรใน .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md)
แก้ไขช่องโหว่ (cm fix): สังเคราะห์แพตช์ต้นทางที่รับรู้ภาษาและยืนยันแพตช์โดยเรียกใช้ชุดโปรแกรมทดสอบการถดถอยและบิลด์โปรเจ็กต์ (npm test) ภายในแซนด์บ็อกซ์ในเครื่อง
3. ตั้งค่าสภาพแวดล้อม OWASP Juice Shop
⏱️ ระยะเวลา: 05:00
ในขั้นตอนนี้ คุณจะเปิดสภาพแวดล้อมเทอร์มินัล Google Cloud และดึงข้อมูลที่เก็บแอปพลิเคชันเป้าหมาย
ขั้นตอนที่ 1: เปิด Cloud Shell ในคอนโซล Google Cloud
ไปที่คอนโซล Google Cloud ในเบราว์เซอร์
ในแถบนำทางด้านบน ให้คลิกปุ่มเปิดใช้งาน Cloud Shell (ไอคอน >_)
Cloud Shell มีเทอร์มินัล Linux บนเบราว์เซอร์ที่ติดตั้งและตรวจสอบสิทธิ์ gcloud, git และ Node.js ไว้ล่วงหน้า
โคลนที่เก็บ OWASP Juice Shop
โคลนที่เก็บ OWASP Juice Shop ใน Cloud Shell หรือเทอร์มินัลในเครื่องโดยทำดังนี้
git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop
ขั้นตอนที่ 3: ตรวจสอบไฟล์แอปพลิเคชันที่สำคัญ
OWASP Juice Shop ใช้ Express.js ในแบ็กเอนด์ที่มีโมดูล TypeScript ดูโครงสร้างไดเรกทอรีโดยย่อ
ls -la routes/ lib/
สังเกตไฟล์เส้นทางหลักที่จัดการการตรวจสอบสิทธิ์ คำค้นหาของผู้ใช้ และการดูแลระบบรถเข็น
routes/login.ts: จัดการการตรวจสอบสิทธิ์ผู้ใช้และการดำเนินการค้นหา SQL แบบข้อมูลดิบ
routes/search.ts: จัดการการค้นหาผลิตภัณฑ์และการแสดงผลการตอบกลับ
routes/basket.ts: จัดการการดึงข้อมูลรถเข็นช็อปปิ้งของผู้ใช้
routes/trackOrder.ts: จัดการการติดตามคำสั่งซื้อผ่านการค้นหา NoSQL
lib/xml.ts: จัดการการแยกวิเคราะห์ XML และการอัปโหลดไฟล์
lib/insecurity.ts: ยูทิลิตีตัวช่วยสำหรับโทเค็นของเซสชันและการเข้ารหัส
4. ติดตั้ง CodeMender CLI (cm) และตรวจสอบสิทธิ์ข้อมูลเข้าสู่ระบบ GCP
⏱️ ระยะเวลา: 08:00
ในขั้นตอนนี้ คุณจะเปิดใช้ Cloud APIs ที่จำเป็น ให้สิทธิ์ IAM โดยใช้ gcloud ดาวน์โหลดและติดตั้งไบนารี CLI ของ cm และกำหนดค่าข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน (ADC)
ขั้นตอนที่ 1: เปิดใช้ Google Cloud API ที่จำเป็นผ่าน gcloud
CodeMender ต้องใช้ Agent Platform API (aiplatform.googleapis.com) และ Cloud Resource Manager API (cloudresourcemanager.googleapis.com) ในแพลตฟอร์ม Agent ของ Gemini Enterprise
ใน Cloud Shell หรือเทอร์มินัล ให้ดึงรหัสโปรเจ็กต์ที่ใช้งานอยู่ (หรือตรวจสอบเมนูแบบเลื่อนลงของโปรเจ็กต์ที่ด้านบนของคอนโซล Google Cloud) แล้วเปิดใช้ API บริการที่จำเป็น ดังนี้
# Automatically retrieve and set your active Google Cloud project ID
export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project ${PROJECT_ID}
# Enable required Google Cloud APIs
gcloud services enable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
serviceusage.googleapis.com \
--project=${PROJECT_ID}
ตรวจสอบว่าเปิดใช้ API แล้ว โดยทำดังนี้
gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"
ขั้นตอนที่ 2: ให้สิทธิ์ IAM ผ่าน gcloud
หากต้องการโต้ตอบกับเครื่องมือการให้เหตุผลในระบบคลาวด์ของ CodeMender ผู้ใช้และบัญชีบริการต้องได้รับมอบหมายบทบาท IAM roles/aiplatform.user (ผู้ใช้แพลตฟอร์ม Agent)
ให้สิทธิ์บทบาท IAM แก่บัญชีผู้ใช้ผ่าน CLI
# Get your active authenticated gcloud account email
USER_EMAIL=$(gcloud config get-value account)
# Add IAM policy binding for user account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="user:${USER_EMAIL}" \
--role="roles/aiplatform.user"
ขั้นตอนที่ 3: ดาวน์โหลดและติดตั้ง cm CLI ใน Cloud Shell
ใน Google Cloud Shell ข้อมูลผู้ใช้จะจัดเก็บไว้อย่างถาวรในไดเรกทอรี $HOME เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้ง cm ลงใน ~/bin โดยไม่ต้องใช้ sudo คุณยังอยู่ใน ~/juice-shop จากส่วนก่อนหน้า ดังนั้นคำสั่งจะดาวน์โหลดลงในไดเรกทอรีชั่วคราวและล้างข้อมูลหลังจากนั้น ด้วยวิธีนี้ ไฟล์โปรแกรมติดตั้งจะไม่ไปอยู่ในที่เก็บ Juice Shop
# Download into a temporary directory so nothing lands in the Juice Shop repository
CM_TMP=$(mktemp -d)
curl -L -o "${CM_TMP}/cm-linux-amd64.zip" "https://artifactregistry.googleapis.com/download/v1/projects/cmoc-prod/locations/us/repositories/codemender-cli-production/files/cm:stable:cm-linux-amd64.zip:download?alt=media"
unzip -o "${CM_TMP}/cm-linux-amd64.zip" -d "${CM_TMP}"
# Install into your persistent ~/bin directory and clean up
mkdir -p ~/bin
install -m 0755 "${CM_TMP}/cm" ~/bin/cm
rm -rf "${CM_TMP}"
# Add ~/bin to PATH for this session and future Cloud Shell sessions
export PATH="$HOME/bin:$PATH"
grep -qxF 'export PATH="$HOME/bin:$PATH"' ~/.bashrc || echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
ขั้นตอนที่ 4: ยืนยันการติดตั้ง CLI ของ cm
เรียกใช้ cm --version เพื่อยืนยันว่าติดตั้งไบนารี CLI อย่างถูกต้องแล้ว
cm --version
ผลลัพธ์ที่คาดหวัง:
cm version 0.17.0
ขั้นตอนที่ 5: กำหนดค่าข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน (ADC) ของ Google Cloud
กำหนดค่าข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน (ADC) ของ Google Cloud เพื่อให้ cm สามารถตรวจสอบสิทธิ์คำขอที่ส่งไปยังเครื่องมือการให้เหตุผลในระบบคลาวด์ได้ โดยทำดังนี้
gcloud auth application-default login
กล่องโต้ตอบโมดัลการให้สิทธิ์ที่มีป้ายกำกับว่าให้สิทธิ์ Cloud Shell จะปรากฏขึ้น คลิกให้สิทธิ์เพื่อให้สิทธิ์เข้าถึง
5. เริ่มต้นและยืนยันพื้นที่ทำงาน CodeMender
⏱️ ระยะเวลา: 03:00
เมื่อติดตั้งและตรวจสอบสิทธิ์ cm แล้ว คุณจะเริ่มต้นพื้นที่ทำงาน CodeMender ภายในไดเรกทอรีโปรเจ็กต์เป้าหมายและยืนยันการตั้งค่าสภาพแวดล้อม
ขั้นตอนที่ 1: เริ่มต้นพื้นที่ทำงาน CodeMender (cm init)
เรียกใช้ cm init จากรูทของไดเรกทอรีโปรเจ็กต์เพื่อเริ่มต้นไฟล์ติดตามสถานะในเครื่องและสร้างการกำหนดค่าพื้นฐาน โดยทำดังนี้
cm init
เอาต์พุต:
✅ Initialized CodeMender workspace at /home/user/.codemender
ขั้นตอนที่ 2: เรียกใช้การวินิจฉัยประสิทธิภาพตั้งแต่ต้นจนจบ (cm health)
ก่อนเปิดเซสชัน Agent ให้เรียกใช้ cm health เพื่อยืนยันข้อมูลเข้าสู่ระบบ การกำหนดค่า ความสามารถในการเข้าถึง และการให้สิทธิ์ ดังนี้
cm health
เอาต์พุต:
CodeMender Health Check ─────────────────────── Backend: iapi Endpoint: https://aiplatform.googleapis.com Location: global Project: my-gcp-project ✓ credentials passed (0ms) Token acquired for project "my-gcp-project" ✓ config passed (0ms) Configuration valid (backend "iapi") ✓ reachability passed (250ms) Endpoint https://aiplatform.googleapis.com responded ✓ authorization passed (68ms) Caller authorized for project "my-gcp-project" Status: HEALTHY (exit code 0, 319ms)
ขั้นตอนที่ 3: ทำความเข้าใจพารามิเตอร์การกำหนดค่า (config.yaml)
CodeMender จะสร้างไฟล์การกำหนดค่าพื้นที่ทำงานที่ .codemender/config.yaml (หรือ ~/.codemender/config.yaml) ไฟล์นี้จะกำหนดขอบเขตของนโยบาย กฎการรวมไฟล์ และฮุกการยืนยันการทดสอบ ดังนี้
# CodeMender CLI configuration.
# The server endpoint is baked in at build time (see build profiles).
# Override it here only if you need a different endpoint.
server: {}
location: "global" # Service location: "global" (default), "us", "eu", or "us-central1" (overridden by $CM_LOCATION)
# Customer-supplied team identifier sent as the X-CodeMender-Team-Id
# telemetry header. Overridden by --team-id flag or $CM_TEAM_ID env var.
# Max 63 chars, must match [A-Za-z0-9._-]. Omit to skip the header.
# team_id: "acme-security"
scan:
extensions:
include: [".py", ".java", ".go", ".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".c", ".cc", ".cpp", ".cxx", ".h", ".hh", ".hpp", ".hxx", ".inl", ".ipp", ".cs", ".rs", ".kt", ".kts", ".rb", ".php", ".sol", ".tf", ".hcl"]
exclude: [".min.js", ".generated.go", ".pb.go"]
# A leading "/" matches only that directory at the scan root.
exclude_dirs: ["node_modules", "vendor", "dist", "/target", "/obj", "/build", ".gradle"]
max_file_size_kb: 2048 # Maximum file size for discovery (2048 KB / 2 MiB)
incremental: true
# Restrict agent file access to these directories (all commands).
# When empty, the scan target directory is used as the boundary.
# project_paths: []
output:
format: table # "table", "json", "sarif"
tools:
confirm_commands: true # Prompt Y/N before running shell commands (default: true)
confirm_writes: true # Prompt Y/N before writing/modifying files (default: true)
# cleanup_candidate_branches: true # Auto-delete temporary candidate branches on completion (default: true)
# Use --yes flag on find/fix/session resume to skip all confirmations
# Version Control and Automated Testing Guardrails
vcs:
type: "" # VCS type: "git", "mercurial", "custom", or "" (auto-detect)
commands:
reset: "" # Shell command to reset codebase (auto-populated for known VCS)
diff: "" # Shell command to show changes (auto-populated for known VCS)
status: "" # Shell command to list modified files (auto-populated for known VCS)
stage: "" # Shell command to stage changes (auto-populated for known VCS)
build:
command: "npm test" # Shell command to build/verify changes from the agent
sandbox:
enabled: true # Process-level OS sandbox (default: true)
mounts:
target_dir: "."
network:
profile: "permissive-closed" # Complete network isolation; set to "permissive-open" if build requires internet
security:
protected_files: [] # Files mounted read-only inside sandbox (e.g. ["~/.ssh/*"])
6. ค้นพบช่องโหว่ด้วย cm find
⏱️ ระยะเวลา: 07:00
ในขั้นตอนนี้ คุณจะเรียกใช้ cm find . --quick เพื่อทำการสแกนความปลอดภัยแบบ Agentic ในฐานของโค้ด Juice Shop
ขั้นตอนที่ 1: ดำเนินการ cm find . --quick
ตั้งแต่ CodeMender v0.16.0 เป็นต้นไป cm find <path> จะมีค่าเริ่มต้นเป็นการสแกนเชิงลึก (
--deep
) สำหรับการวิเคราะห์ไฟล์อย่างละเอียดทีละไฟล์ ส่วนการสแกนด่วน (
--quick
) ช่วยให้คัดแยกที่เก็บได้อย่างรวดเร็ว เรียกใช้ cm find . --quick เพื่อทำการสแกนแบบเร็วในที่เก็บ OWASP Juice Shop (เวลาดำเนินการโดยประมาณ: ~8 นาทีสำหรับการคัดแยกฐานของโค้ด 684 ไฟล์ทั้งหมด)
cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash
cm เปิดเซสชันการสแกนบนแพลตฟอร์ม Agent ของ Gemini Enterprise เพื่อวิเคราะห์ไฟล์ซอร์สโค้ดในโมดูลที่เก็บทั้งหมด ดังนี้
⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository. 🔍 Discovering files in /home/user/juice-shop... Found 684 source files 🚀 Starting FIND session (mode: QUICK)... Server: https://aiplatform.googleapis.com Session: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu Operation: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu 📂 Scan target: /home/user/juice-shop 🔒 Sandbox roots (agent can only access these directories): • /home/user/juice-shop 📡 Waiting for server (https://aiplatform.googleapis.com)... ──────────────────────────────────────────────────────────── 2026-10-29T03:01:47Z [INFO] 🔧 [Step 1] list_dir → /home/user/juice-shop 2026-10-29T03:01:56Z [INFO] 🔧 [Step 2] list_dir → .../juice-shop/routes 2026-10-29T03:02:08Z [INFO] 🔧 [Step 3] read_file → .../juice-shop/server.ts 2026-10-29T03:02:47Z [INFO] 🔧 [Step 7] read_file → .../juice-shop/routes/login.ts 2026-10-29T03:02:56Z [INFO] 🔧 [Step 8] read_file → .../juice-shop/routes/search.ts 2026-10-29T03:03:48Z [INFO] 🔧 [Step 13] read_file → .../juice-shop/routes/fileUpload.ts 2026-10-29T03:04:30Z [INFO] 🔧 [Step 16] read_file → .../juice-shop/routes/userProfile.ts 2026-10-29T03:06:11Z [INFO] 🔧 [Step 25] read_file → .../juice-shop/routes/trackOrder.ts 2026-10-29T03:07:57Z [INFO] 🔧 [Step 33] read_file → .../juice-shop/routes/order.ts 2026-10-29T03:09:30Z [INFO] ✅ Completed 33 tool steps in 7m48s | Tokens: 2.6M in / 8k out / 2.7M total ──────────────────────────────────────────────────────────── 🔒 Found 12 vulnerabilities: ID SEVERITY TYPE FILE TITLE CONFIDENCE ──────── ──────── ──── ──── ───── ────────── 43aa7446 🔴 CRITICAL SQL INJECTION routes/login.ts SQL Injection in User Login Handler Allows Authentication Bypass 100% dd83d0a4 🟠 HIGH SQL INJECTION routes/search.ts UNION-Based SQL Injection in Product Search Allows Database Exfiltration 100% 4dfe2409 🟠 HIGH CODE INJECTION routes/userProfile.ts Remote Code Execution via Eval in User Profile Template Handler 100% 79d490b0 🟠 HIGH PATH TRAVERSAL routes/fileUpload.ts Path Traversal (Zip Slip) in Zip File Upload Allows Arbitrary File Overwrite 100% 4f2b050c 🟠 HIGH XML EXTERNAL ENTITY (XXE) routes/fileUpload.ts XML External Entity (XXE) Injection in File Upload Route Leaks System Files 100% 1ece0e25 🟠 HIGH IMPROPER ACCESS CONTROL server.ts Missing Authorization on Product Update Endpoint Allows Unauthorized Product Tampering 100% 757fd438 🟠 HIGH CWE-943 routes/trackOrder.ts NoSQL / JavaScript Injection in Order Tracking Allows Database Record Exfiltration 100% 349bac9f 🟡 MEDIUM SERVER-SIDE REQUEST FORGERY (SSRF) routes/profileImageUrlUpload.ts Server-Side Request Forgery (SSRF) in Profile Image URL Upload Route 100% be5e1459 🟡 MEDIUM OPEN REDIRECT routes/redirect.ts Open Redirect via Inadequate Allowlist Substring Match 100% 06ecf8a5 🟡 MEDIUM INSECURE DIRECT OBJECT REFERENCE (IDOR) routes/basket.ts Insecure Direct Object Reference (IDOR) Allows Access to Arbitrary User Baskets 100% 02f6a293 🟡 MEDIUM PATH TRAVERSAL routes/dataErasure.ts Local File Read via Insecure Template Layout Parameter in Data Erasure Route 100% 95ee59a3 🟡 MEDIUM CWE-943 routes/updateProductReviews.ts NoSQL Injection in Product Review Update Endpoint Allows Mass Modification 100% Summary: 1 CRITICAL, 6 HIGH, 5 MEDIUM Run 'cm report' for detailed analysis, 'cm verify <finding-id>' to validate, or 'cm fix <finding-id>' to generate a patch. 2026-10-29T03:09:30Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T030140Z_ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu.log
ขั้นตอนที่ 2: ตรวจสอบผลการสแกนผ่าน cm report
เรียกใช้ cm report -f table เพื่อแสดงผลการตรวจสอบความปลอดภัยที่พบทั้งหมดจากฐานข้อมูลสถานะ SQLite ในเครื่อง
cm report -f table
เอาต์พุต:
┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐ │ID │Severity │Status│Fix│File │Title │ ├──────────┼───────────┼──────┼───┼──────────────────────────────┼────────────────────────────────────────┤ │ 43aa7446 │🔴 CRITICAL│OPEN │— │routes/login.ts │SQL Injection in User Login Handler A...│ │ dd83d0a4 │🟠 HIGH │OPEN │— │routes/search.ts │UNION-Based SQL Injection in Product ...│ │ 4dfe2409 │🟠 HIGH │OPEN │— │routes/userProfile.ts │Remote Code Execution via Eval in Use...│ │ 79d490b0 │🟠 HIGH │OPEN │— │routes/fileUpload.ts │Path Traversal (Zip Slip) in Zip File...│ │ 4f2b050c │🟠 HIGH │OPEN │— │routes/fileUpload.ts │XML External Entity (XXE) Injection i...│ │ 1ece0e25 │🟠 HIGH │OPEN │— │server.ts │Missing Authorization on Product Upda...│ │ 757fd438 │🟠 HIGH │OPEN │— │routes/trackOrder.ts │NoSQL / JavaScript Injection in Order...│ │ 349bac9f │🟡 MEDIUM │OPEN │— │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│ │ be5e1459 │🟡 MEDIUM │OPEN │— │routes/redirect.ts │Open Redirect via Inadequate Allowlis...│ │ 06ecf8a5 │🟡 MEDIUM │OPEN │— │routes/basket.ts │Insecure Direct Object Reference (IDO...│ │ 02f6a293 │🟡 MEDIUM │OPEN │— │routes/dataErasure.ts │Local File Read via Insecure Template...│ │ 95ee59a3 │🟡 MEDIUM │OPEN │— │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│ └──────────┴───────────┴──────┴───┴──────────────────────────────┴────────────────────────────────────────┘ 12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 0 fixed, 🔴 12 open 📋 Report generated at 2026-10-29 03:10:05 UTC 2026-10-29T03:10:05Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T031005Z_pending.log
ขั้นตอนที่ 3: ทำความเข้าใจสถานะวงจรการค้นพบและระดับความรุนแรง
CodeMender จะติดตามช่องโหว่ผ่านวงจร 4 สถานะอย่างเป็นทางการ ดังนี้
สถานะการค้นพบ | ความหมายและการจัดการการเปลี่ยนผ่าน |
| พบ (หรือนำเข้า) ช่องโหว่แล้ว แต่ยังไม่ได้รับการยืนยัน แพตช์ หรือปิดไป |
| CodeMender ได้สร้างแพตช์ ใช้ Diff และยืนยันว่าชุดบิลด์/ชุดโปรแกรมทดสอบผ่านและการเจาะช่องโหว่ไม่สำเร็จ |
| ทำเครื่องหมายว่าไม่ทำงานเนื่องจากมีความเชื่อมั่นต่ำ อยู่นอกโมเดลภัยคุกคาม หรือได้รับการยืนยันว่าเป็นผลบวกลวง ปิดเสียงการแจ้งเตือนในอนาคต |
| ตรวจพบข้อบกพร่องที่ |
การจัดประเภทความรุนแรง
🔴 CRITICAL: ความเสี่ยงร้ายแรงที่เกิดขึ้นทันที (เช่น การเรียกใช้โค้ดจากระยะไกล, การแทรก SQL ที่ไม่ได้รับการตรวจสอบสิทธิ์) ซึ่งเข้าถึงได้โดยตรงจากขอบเขตที่ไม่น่าเชื่อถือ
🟠 HIGH: ข้อบกพร่องร้ายแรง (เช่น การอ่านฐานข้อมูลที่กำหนดเอง การโจมตีเพื่อยกระดับสิทธิ์) ที่ต้องใช้บริบทของผู้ใช้ที่เฉพาะเจาะจงหรือเงื่อนไขที่เชื่อมโยงกัน
🟡 MEDIUM: ความเสี่ยงปานกลางที่มีขอบเขตจำกัดหรือต้องมีการโต้ตอบของผู้ใช้ (เช่น Open Redirect, CSRF)
🔵 LOW: ข้อบกพร่องด้านสุขอนามัยในการป้องกันหลายชั้นหรือเวกเตอร์การสอดแนมที่มีผลกระทบโดยตรงน้อยที่สุด
7. ยืนยันช่องโหว่และตรวจสอบอาร์ติแฟกต์การยืนยันที่บันทึกไว้
⏱️ ระยะเวลา: 10:00
ฟีเจอร์หลักอย่างหนึ่งของ CodeMender คือการสร้างอาร์ติแฟกต์การยืนยันแบบถาวรโดยอัตโนมัติทุกครั้งที่คุณเรียกใช้ cm verify มาตรวจสอบผลการค้นหาการแทรก SQL ที่สำคัญใน routes/login.ts (แสดงเป็น 43aa7446 ในบทแนะนำนี้) และดูอาร์ติแฟกต์ที่ Agent สร้างขึ้นกัน
ขั้นตอนที่ 1: ดำเนินการ cm verify <login-finding-id>
ค้นหารหัสการค้นพบสำหรับ routes/login.ts จากตาราง cm report (เช่น 43aa7446) แล้วเรียกใช้ cm verify <finding-id> --sandbox=false --bypass-warning -y (เวลาดำเนินการโดยประมาณ: ประมาณ 20 นาทีในการเรียกใช้ขั้นตอนของเครื่องมืออัตโนมัติ เริ่มบริการที่ทำงานอยู่เบื้องหลัง และเรียกใช้สคริปต์การเจาะช่องโหว่ PoC แบบสด)
# Replace 43aa7446 with your actual login.ts finding ID
# --sandbox=false turns off only the OS-level sandbox; the path boundary and command policy stay enforced
cm verify 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
เอาต์พุต:
⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository. 🔬 Verifying finding: SQL Injection in User Login Handler Allows Authentication Bypass ID: 43aa7446-40de-467d-8ca4-8571dca16036 File: /home/user/juice-shop/routes/login.ts Severity: 🔴 CRITICAL Type: SQL INJECTION Resetting workspace at /home/user/juice-shop 🔧 Running: git checkout HEAD -- . && git clean -fd Removing .cm_project ✅ Reset complete. Ready for vulnerability research. 🚀 Starting VERIFY session... Server: https://aiplatform.googleapis.com Session: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu Operation: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu 📂 Scan target: /home/user/juice-shop/routes 🔒 Sandbox boundary (agent can explore within): • /home/user/juice-shop 📡 Waiting for verification agent (https://aiplatform.googleapis.com)... ──────────────────────────────────────────────────────────── 2026-10-29T03:11:31Z [INFO] 🔧 [Step 1] run_command → mkdir -p /home/user/juice-shop/.exploit 2026-10-29T03:11:42Z [INFO] 🔧 [Step 2] read_file → .../juice-shop/routes/login.ts 2026-10-29T03:12:03Z [INFO] 🔧 [Step 4] read_file → .../juice-shop/package.json 2026-10-29T03:12:14Z [INFO] 🔧 [Step 5] write_to_file → .../juice-shop/.exploit/PLAN.md 2026-10-29T03:19:00Z [INFO] 🔧 [Step 25] run_command → npm run build:server 2026-10-29T03:29:20Z [INFO] 🔧 [Step 61] write_to_file → .../juice-shop/.exploit/info.yaml 2026-10-29T03:29:53Z [INFO] 🔧 [Step 63] write_to_file → .../juice-shop/.exploit/LOG.md 2026-10-29T03:30:17Z [INFO] 🔧 [Step 64] write_to_file → .../juice-shop/.exploit/REPORT.md 2026-10-29T03:30:55Z [INFO] 🔧 [Step 66] run_command → git status --short 2026-10-29T03:31:46Z [INFO] ✅ Completed 66 tool steps in 20m23s | Tokens: 2.8M in / 7k out / 2.8M total ──────────────────────────────────────────────────────────── 2026-10-29T03:31:46Z [INFO] Artifacts manifest written: /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu/manifest.json (7 artifacts) 📦 Captured 7 agent artifacts in /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu Resetting workspace at /home/user/juice-shop 🔧 Running: git checkout HEAD -- . && git clean -fd Removing .cm_project Removing .exploit/LOG.md Removing .exploit/PLAN.md Removing .exploit/REPORT.md Removing .exploit/exploit.sh Removing .exploit/info.yaml Removing .exploit/server_runner.js ✅ Reset complete. Ready for vulnerability research. 📥 Copying 7 finding artifact(s) to workspace... • /home/user/juice-shop/.exploit/LOG.md • /home/user/juice-shop/.exploit/PLAN.md • /home/user/juice-shop/.exploit/REPORT.md • /home/user/juice-shop/.exploit/exploit.sh • /home/user/juice-shop/.exploit/info.yaml • /home/user/juice-shop/.exploit/server.log • /home/user/juice-shop/.exploit/server_runner.js 🚀 Programmatically running exploit script to confirm: /home/user/juice-shop/.exploit/exploit.sh EXPLOIT SUCCESSFUL ✅ Exploit execution succeeded. Finding VERIFIED (confidence: 100%) Run 'cm report' to see updated findings. 2026-10-29T03:31:52Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T031121Z_ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu.log
ขั้นตอนที่ 2: ภาพรวมของอาร์ติแฟกต์การยืนยันที่บันทึกไว้
ตั้งแต่ CodeMender v0.16.0 เป็นต้นไป อาร์ติแฟกต์การยืนยันจะได้รับการกำหนดมาตรฐานที่รูทของที่เก็บใน .exploit/ ขณะที่ยังคงเก็บสำเนาถาวรไว้ใน ~/.codemender/artifacts/<session-id>/ ไฟล์เหล่านี้เป็นไฟล์ที่ใช้งานในเครื่อง ไม่ใช่ส่วนหนึ่งของการแก้ไข ดังนั้นคุณจะต้องยกเว้นไฟล์เหล่านี้จาก Git ก่อนที่จะจัดเตรียมแพตช์ในส่วนถัดไป เรียกใช้ ls -la .exploit/ เพื่อแสดงรายการดังนี้
ls -la .exploit/
เอาต์พุต:
total 40 drwxrwxr-x 2 user user 4096 Oct 29 03:31 . drwxrwxr-x 35 user user 4096 Oct 29 03:31 .. -rwxr-xr-x 1 user user 3272 Oct 29 03:31 exploit.sh -rw-r--r-- 1 user user 313 Oct 29 03:31 info.yaml -rw-r--r-- 1 user user 2196 Oct 29 03:31 LOG.md -rw-r--r-- 1 user user 771 Oct 29 03:31 PLAN.md -rw-r--r-- 1 user user 6387 Oct 29 03:31 REPORT.md -rw-rw-r-- 1 user user 2438 Oct 29 03:31 server.log -rw-rw-r-- 1 user user 462 Oct 29 03:31 server_runner.js
ไฟล์อาร์ติแฟกต์ | หมวดหมู่ | Purpose |
| ไฟล์ Manifest ของข้อมูลเมตา | YAML ที่มีโครงสร้างซึ่งกำหนด UUID, ชื่อ, ความรุนแรง ( |
| กลยุทธ์ตัวแทน | แผนการยืนยันและรายการตรวจสอบทีละขั้นตอนที่ดำเนินการโดยอัตโนมัติโดยเครื่องมือการให้เหตุผลของ CodeMender |
| บันทึกการติดตามการดำเนินการ | บันทึกการตรวจสอบที่มีการประทับเวลาซึ่งบันทึกการเรียกใช้เครื่องมือแต่ละครั้ง ปลายทางคำขอ HTTP และผลการทดสอบ |
| Helper Runner / บันทึกของเซิร์ฟเวอร์ | สคริปต์ตัวช่วยที่ Agent สร้างขึ้นเพื่อเริ่ม Juice Shop สำหรับการทดสอบ และเอาต์พุตของเซิร์ฟเวอร์ที่บันทึกไว้ |
| Execution Wrapper / Standalone PoC | Wrapper สคริปต์ของ Shell ที่เปิดบริการเป้าหมายและเรียกใช้ไคลเอ็นต์ PoC เพื่อตรวจสอบการตอบกลับ HTTP 200 |
| การวิเคราะห์สาเหตุของปัญหา | ข้อมูลสรุป, การวิเคราะห์ช่องโหว่แบบบรรทัดต่อบรรทัด, รายละเอียด SQL ดิบ และคำแนะนำในการกำหนดพารามิเตอร์ Sequelize |
ขั้นตอนที่ 3: คำแนะนำแบบเจาะลึกเกี่ยวกับไฮไลต์ของอาร์ติแฟกต์การยืนยัน
Agent จะเขียนอาร์ติแฟกต์เหล่านี้ใหม่ทุกครั้งที่เรียกใช้ ดังนั้นเนื้อหาที่แน่นอนจึงแตกต่างกันในแต่ละครั้ง เปิดไฟล์ใน Cloud Shell Editor (หรือด้วย cat) แล้วมองหาสิ่งต่อไปนี้
Artifact | สิ่งที่ควรตรวจสอบ |
| รหัสแบบเต็ม ชื่อ ความรุนแรง ความเชื่อมั่น และแท็กของผลการตรวจพบ เช่น |
| รายการตรวจสอบที่ Agent ทำตาม ตั้งแต่การอ่านไฟล์ที่รายงานไปจนถึงการเขียนสคริปต์การจำลองสถานการณ์ |
| การดำเนินการและผลลัพธ์ที่มีการประทับเวลา รวมถึงผลลัพธ์ของการเรียกใช้สคริปต์การจำลองแต่ละครั้ง |
| สคริปต์การจำลองแบบสแตนด์อโลน: วิธีเริ่มแอป ปลายทางที่กำหนดเป้าหมาย และวิธีตัดสินความสำเร็จ (พิมพ์ |
| ไฟล์ตัวช่วยที่ Agent สร้างขึ้นเพื่อเริ่ม Juice Shop สำหรับการทดสอบ และเอาต์พุตของเซิร์ฟเวอร์นั้น |
| การวิเคราะห์สาเหตุของปัญหา: บรรทัดที่มีช่องโหว่ใน |
8. แก้ไขการแทรก SQL ด้วยการแก้ไข CM
⏱️ ระยะเวลา: 10:00
เมื่อเรายืนยันการค้นพบการแทรก SQL ใน routes/login.ts (รหัสตัวอย่าง 43aa7446) และตรวจสอบอาร์ติแฟกต์แล้ว ให้เรียกใช้ cm fix เพื่อใช้แพตช์การค้นหาที่มีพารามิเตอร์อัตโนมัติ
ขั้นตอนที่ 1: ดำเนินการ cm fix <login-finding-id> -y
เรียกใช้ cm fix <finding-id> --sandbox=false --bypass-warning -y (แทนที่ 43aa7446 ด้วยรหัสการค้นพบการเข้าสู่ระบบจริงจาก cm report) เพื่อสังเคราะห์และใช้การแก้ไข
# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
เอาต์พุต:
⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🩹 Fixing finding: SQL Injection in User Login Handler Allows Authentication Bypass
File: /home/user/juice-shop/routes/login.ts
Severity: CRITICAL
🔒 Sandbox roots (agent can only access these directories):
• /home/user/juice-shop
Found latest VERIFY session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu for finding 43aa7446-40de-467d-8ca4-8571dca16036
Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Resetting workspace at /home/user/juice-shop
🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project
Removing .exploit/LOG.md
Removing .exploit/PLAN.md
Removing .exploit/REPORT.md
Removing .exploit/exploit.sh
Removing .exploit/info.yaml
Removing .exploit/server_runner.js
✅ Reset complete. Ready for vulnerability research.
📥 Copying 7 finding artifact(s) to workspace...
• /home/user/juice-shop/.exploit/LOG.md
• /home/user/juice-shop/.exploit/PLAN.md
• /home/user/juice-shop/.exploit/REPORT.md
• /home/user/juice-shop/.exploit/exploit.sh
• /home/user/juice-shop/.exploit/info.yaml
• /home/user/juice-shop/.exploit/server.log
• /home/user/juice-shop/.exploit/server_runner.js
Session: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu
Operation: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu
📡 Waiting for fix agent (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:41:30Z [INFO] 🔧 [Step 4] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:41:58Z [INFO] 🔧 [Step 6] run_command → npm run test:server
2026-10-29T03:43:11Z [INFO] 🔧 [Step 9] grep_search → pattern="sequelize\\.query" path=.../juice-shop/routes
2026-10-29T03:43:54Z [INFO] 🔧 [Step 12] read_file → .../juice-shop/routes/vulnCodeSnippet.ts
2026-10-29T03:44:41Z [INFO] 🔧 [Step 13] read_file → .../juice-shop/routes/vulnCodeFixes.ts
2026-10-29T03:53:14Z [INFO] 🔧 [Step 31] search_and_replace → .../juice-shop/routes/login.ts
2026-10-29T03:53:52Z [INFO] 🔧 [Step 33] run_command → npm run build:server
2026-10-29T03:55:23Z [INFO] 🔧 [Step 37] run_command → npm run test:server
2026-10-29T03:55:49Z [INFO] 🔧 [Step 38] run_command → git diff
2026-10-29T03:57:18Z [INFO] ✅ Completed 43 tool steps in 16m54s | Tokens: 1.6M in / 4k out / 1.6M total
────────────────────────────────────────────────────────────
✨ Patch generated successfully!
diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {
return (req: Request, res: Response, next: NextFunction) => {
verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
- models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+ models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+ replacements: {
+ email: typeof req.body?.email === 'string' ? req.body.email : '',
+ password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+ },
+ model: UserModel,
+ plain: true
+ }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
.then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
const user = utils.queryResultToJson(authenticatedUser)
if (user.data?.id && user.data.totpSecret !== '') {
────────────────────────────────────────────────────────────
2026-10-29T03:57:18Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T034021Z_ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu.log
ขั้นตอนที่ 2: ตรวจสอบสถานะ VCS และความแตกต่างโดยใช้ cm vcs
เรียกใช้ cm vcs status และ cm vcs diff เพื่อดูไฟล์พื้นที่ทำงานที่แก้ไขแล้ว
cm vcs status
cm vcs diff
เอาต์พุต:
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts ?? .cm_project ?? .exploit/ 2026-10-29T03:59:47Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T035947Z_pending.log
รายการที่ไม่ได้ติดตาม 2 รายการเป็นไฟล์ในเครื่องของ CodeMender ไม่ใช่ส่วนหนึ่งของการแก้ไข โดย .exploit/ จะเก็บอาร์ติแฟกต์การยืนยันจาก cm verify และ .cm_project จะทำเครื่องหมายรูทของโปรเจ็กต์สำหรับ CodeMender คุณจะเก็บไฟล์เหล่านี้ไว้นอกคอมมิตในขั้นตอนถัดไป
และ cm vcs diff:
🔍 Running diff in /home/user/juice-shop: git diff
diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {
return (req: Request, res: Response, next: NextFunction) => {
verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
- models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+ models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+ replacements: {
+ email: typeof req.body?.email === 'string' ? req.body.email : '',
+ password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+ },
+ model: UserModel,
+ plain: true
+ }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
.then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
const user = utils.queryResultToJson(authenticatedUser)
if (user.data?.id && user.data.totpSecret !== '') {
ขั้นตอนที่ 3: จัดเตรียมแพตช์ที่ยืนยันแล้วด้วย cm vcs stage
เมื่อคุณตรวจสอบ Unified Diff และยืนยันว่าการแก้ไขเป็นไปตามมาตรฐานด้านคุณภาพและความปลอดภัยแล้ว ให้จัดเตรียมแพตช์สำหรับการคอมมิต เนื่องจาก cm vcs stage เรียกใช้ git add -A จึงจัดเตรียมการเปลี่ยนแปลงทุกรายการในแผนผังการทำงาน รวมถึงรายการ .exploit/ และ .cm_project ที่ไม่ได้ติดตามจากขั้นตอนที่ 2 ก่อนอื่น ให้เพิ่มไฟล์เหล่านั้นลงใน .git/info/exclude ซึ่งเป็นไฟล์ละเว้นเฉพาะในเครื่องที่ Git ไม่เคยคอมมิต เพื่อให้มีการจัดเตรียมเฉพาะแพตช์เท่านั้น
# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude
จากนั้นจัดเตรียมการเปลี่ยนแปลงโดยใช้ cm vcs stage:
cm vcs stage
เอาต์พุต:
📦 CodeMender VCS Stage ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git add -A ────────────────────────────────────────────────── 2026-10-29T04:00:06Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T040006Z_pending.log ✅ Changes staged successfully.
ตรวจสอบว่ามีการจัดเตรียมเฉพาะแพตช์ใน Git โดยทำดังนี้
cm vcs status
เอาต์พุต:
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts
หากคุณเรียกใช้ cm vcs stage ก่อนอัปเดต .git/info/exclude ให้ยกเลิกการสเตจไฟล์ CodeMender ด้วย git restore --staged .exploit .cm_project ไฟล์จะยังคงอยู่ในดิสก์ โดยระบบจะนำไฟล์ออกจากพื้นที่ทดลองเท่านั้น
ขั้นตอนที่ 4: คอมมิตแพตช์และล้างอาร์ติแฟกต์การยืนยัน
คอมมิตแพตช์ที่จัดเตรียมไว้ก่อนที่จะแก้ไขผลการค้นพบถัดไป: การเรียกใช้ cm fix และ cm verify ทุกครั้งจะเริ่มต้นด้วยการรีเซ็ตพื้นที่ทำงาน (git checkout HEAD -- . && git clean -fd) ซึ่งจะทิ้งการเปลี่ยนแปลงที่ไม่ได้คอมมิต จากนั้นลบโฟลเดอร์ .exploit/ ในเครื่องเพื่อให้การแก้ไขครั้งถัดไปเริ่มจากพื้นที่ทำงานที่ล้างข้อมูลขยะแล้ว เนื่องจากระบบละเว้น .exploit/ แล้ว git clean -fd จึงจะไม่นำรายการดังกล่าวออกให้คุณอีกต่อไป สำเนาถาวรของอาร์ติแฟกต์จะยังคงอยู่ใน ~/.codemender/artifacts/<session-id>/
git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/
หาก Git ขอข้อมูลระบุตัวตน ให้เรียกใช้ git config user.name "Your Name" และ git config user.email "you@example.com" ในที่เก็บ แล้วคอมมิตอีกครั้ง
9. ตรวจสอบแพตช์ จัดการเซสชัน และส่งออกรายงาน (รายงาน cm)
⏱️ ระยะเวลา: 08:00
หลังจากใช้การแก้ไขด้านความปลอดภัยที่ AI สร้างขึ้น คุณจำเป็นต้องจัดการเซสชันที่ใช้งานอยู่ ตรวจสอบสถิติการใช้งานโทเค็น และสร้างรายงานการปฏิบัติตามข้อกำหนดด้านความปลอดภัยขององค์กรโดยใช้ cm report
ขั้นตอนที่ 1: จัดการเซสชันที่มีการเก็บสถานะ (cm session list / resume / cancel)
CodeMender จะติดตามงานสแกน การยืนยัน และการแก้ไขทุกงานเป็นเซสชันแบบเก็บสถานะในฐานข้อมูล SQLite ในเครื่อง (~/.codemender/state.db) เรียกใช้ cm session list เพื่อตรวจสอบเซสชันของคุณ
cm session list
เอาต์พุต:
SESSION_ID TYPE STATUS TARGET CREATED RESUMABLE ────────── ──── ────── ────── ─────── ───────── ChA0Yjll FIX ✅ COMPLETED ...40de-467d-8ca4-8571dca16036 2026-10-29T03:40:21 — ChBkZTRh VERIFY ✅ COMPLETED ...40de-467d-8ca4-8571dca16036 2026-10-29T03:11:21 — ChBjMjI4 FIND ✅ COMPLETED /home/user/juice-shop 2026-10-29T03:01:40 — 3 session(s) total 2026-10-22T02:24:43Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022443Z_pending.log
ขั้นตอนที่ 2: เรียกใช้ cm report เพื่อยืนยันผลการตรวจสอบที่แก้ไขแล้ว
เรียกใช้ cm report -f table เพื่อแสดงสถานะการค้นพบที่อัปเดต (โปรดทราบว่าการค้นพบที่แก้ไขแล้วจะแสดง FIXED พร้อม ✅ applied ในคอลัมน์ Fix)
cm report -f table
เอาต์พุต:
┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐ │ID │Severity │Status│Fix │File │Title │ ├──────────┼───────────┼──────┼──────────┼──────────────────────────────┼────────────────────────────────────────┤ │ 43aa7446 │🔴 CRITICAL│FIXED │✅ applied│routes/login.ts │SQL Injection in User Login Handler A...│ │ dd83d0a4 │🟠 HIGH │OPEN │— │routes/search.ts │UNION-Based SQL Injection in Product ...│ │ 4dfe2409 │🟠 HIGH │OPEN │— │routes/userProfile.ts │Remote Code Execution via Eval in Use...│ │ 79d490b0 │🟠 HIGH │OPEN │— │routes/fileUpload.ts │Path Traversal (Zip Slip) in Zip File...│ │ 4f2b050c │🟠 HIGH │OPEN │— │routes/fileUpload.ts │XML External Entity (XXE) Injection i...│ │ 1ece0e25 │🟠 HIGH │OPEN │— │server.ts │Missing Authorization on Product Upda...│ │ 757fd438 │🟠 HIGH │OPEN │— │routes/trackOrder.ts │NoSQL / JavaScript Injection in Order...│ │ 349bac9f │🟡 MEDIUM │OPEN │— │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│ │ be5e1459 │🟡 MEDIUM │OPEN │— │routes/redirect.ts │Open Redirect via Inadequate Allowlis...│ │ 06ecf8a5 │🟡 MEDIUM │OPEN │— │routes/basket.ts │Insecure Direct Object Reference (IDO...│ │ 02f6a293 │🟡 MEDIUM │OPEN │— │routes/dataErasure.ts │Local File Read via Insecure Template...│ │ 95ee59a3 │🟡 MEDIUM │OPEN │— │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│ └──────────┴───────────┴──────┴──────────┴──────────────────────────────┴────────────────────────────────────────┘ 12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 1 fixed, 🔴 11 open 📋 Report generated at 2026-10-29 04:01:10 UTC 2026-10-29T04:01:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261029T040110Z_pending.log
ขั้นตอนที่ 3: ตรวจสอบการใช้โทเค็นโดยใช้ cm stats
เรียกใช้ cm stats เพื่อตรวจสอบการใช้โทเค็นในเครื่องในโหมดการสแกนต่างๆ (cm find --quick, cm verify และ cm fix)
cm stats
เอาต์พุต:
COMMAND REQUESTS POLLS INPUT OUTPUT CACHED THOUGHT TOOL_CALLS TOTAL CACHE_HIT% THINK_RATIO% DURATION ─────── ──────── ───── ───── ────── ────── ─────── ────────── ───── ────────── ──────────── ──────── total 3 186 10.7M 23.1k 9.9M 55.5k 0 10.8M 91.8% 70.7% 35m 54s cm find --quick 1 33 2.0M 9.4k 1.8M 15.2k 0 2.1M 90.6% 61.8% 05m 44s cm fix 1 33 870.9k 908 678.6k 20.3k 0 892.2k 77.9% 95.7% 04m 40s cm verify 1 120 7.8M 12.7k 7.3M 20.0k 0 7.9M 93.6% 61.1% 25m 31s 3 turn(s) across 3 command type(s) in the last 7 days 2026-10-22T02:24:46Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022446Z_pending.log
ขั้นตอนที่ 4: สร้างและดูตัวอย่างรายงาน HTML แบบอินเทอร์แอกทีฟ (cm report -f html)
ส่งออกผลการสแกนและแพตช์ที่ใช้เป็นแดชบอร์ด HTML แบบอินเทอร์แอกทีฟสแตนด์อโลน โดยทำดังนี้
cm report -f html
cp ~/.codemender/reports/report.html ./report.html
วิธีดู report.html ใน Google Cloud Shell
เริ่มเว็บเซิร์ฟเวอร์ตัวอย่างในเครื่องในเทอร์มินัล Cloud Shell โดยทำดังนี้
python3 -m http.server 8080
ในแถบเครื่องมือด้านขวาบนของ Cloud Shell ให้คลิกปุ่มแสดงตัวอย่างบนเว็บ (ไอคอนที่มีรูปตา/หน้าจอ) ➔ แสดงตัวอย่างบนพอร์ต 8080 เพื่อดูแดชบอร์ดการปฏิบัติตามข้อกำหนดแบบอินเทอร์แอกทีฟในเบราว์เซอร์
(ทางเลือก) ใน File Explorer ของเครื่องมือแก้ไข Cloud Shell ให้คลิกขวาที่ report.html แล้วคลิกดาวน์โหลดเพื่อดูไฟล์ในเบราว์เซอร์ในเครื่อง
ขั้นตอนที่ 5: ฟีเจอร์หลักของรายงาน HTML แบบอินเทอร์แอกทีฟที่สร้างขึ้น
ด้านล่างนี้คือรายละเอียดขององค์ประกอบหลักในรายงาน HTML แบบอินเทอร์แอกทีฟที่สร้างขึ้น (report.html)

1. ส่วนหัวของเมตริกสำหรับผู้บริหารและการ์ดสถานะ
ข้อมูลเมตาของส่วนหัว: แสดงรายละเอียดที่เก็บเป้าหมาย (OWASP Juice Shop) ไฟล์ต้นฉบับทั้งหมดที่สแกน (684 files) และการประทับเวลาการสร้าง UTC
ตารางกริดการ์ดเมตริก: แสดงภาพรวมระดับสูงแบบทันทีของการค้นพบทั้งหมด การกระจายความรุนแรง (CRITICAL, HIGH, MEDIUM, LOW) และช่องโหว่ที่แก้ไขแล้วทั้งหมด (FIXED)
2. ตารางสรุปผลการค้นพบแบบอินเทอร์แอกทีฟ
เมทริกซ์ช่องโหว่: แสดงตารางที่กรองได้ซึ่งมี ID, Severity, Status (OPEN เทียบกับ FIXED), CWE Type, File Location, Vulnerability Title และ Confidence Score
3. การวิเคราะห์สาเหตุของปัญหาเชิงลึกและข้อมูลโค้ดต้นฉบับที่มีช่องโหว่
การวิเคราะห์แบบยุบได้ (RCA): การคลิกแถวผลการค้นหาใดๆ จะขยายการวิเคราะห์สาเหตุของปัญหาโดยละเอียดซึ่งสังเคราะห์โดยโมเดลการให้เหตุผลด้านความปลอดภัยของ Gemini
ข้อมูลโค้ดของซอร์สโค้ดที่มีช่องโหว่: แสดงหมายเลขบรรทัดที่แน่นอนและซอร์สโค้ดที่ไฮไลต์ไวยากรณ์รอบๆ ซิงก์ที่มีช่องโหว่
4. ความแตกต่างของแพตช์การแก้ไขที่ AI สังเคราะห์ขึ้น
มุมมอง Diff แบบรวม: สำหรับช่องโหว่ที่ได้รับการแก้ไข (FIXED) CodeMender จะแสดงบล็อก Diff แบบรวมที่ไฮไลต์โค้ดของแอปพลิเคชันที่เพิ่มเข้ามาเป็นสีเขียว (+) และโค้ดที่มีช่องโหว่ซึ่งถูกนำออกเป็นสีแดง (-)
ขั้นตอนที่ 6: (ไม่บังคับ) นำเข้าผลการค้นหา SAST ของบุคคลที่สาม (cm report import)
CodeMender ไม่ได้จำกัดอยู่เพียงข้อบกพร่องที่เครื่องสแกนของตนเองค้นพบ ทีมสามารถนำเข้าผลลัพธ์ SAST ภายนอก (เช่น จาก Semgrep, Snyk, SonarQube หรือ Fortify) โดยใช้สคีมา JSON ที่ได้มาตรฐานหรือวิซาร์ดแบบอินเทอร์แอกทีฟ ซึ่งช่วยให้ CodeMender ตรวจสอบและสังเคราะห์การแก้ไขได้ทันที
# Create a sample third-party findings JSON file
cat << 'EOF' > ./findings.json
[
{
"file_path": "routes/basket.ts",
"line": 18,
"title": "SQL Injection in Basket Handler",
"message": "Raw basket ID concatenated in query",
"severity": "HIGH",
"vuln_type": "CWE-89"
}
]
EOF
# Ingest findings into CodeMender state database
cm report import --file ./findings.json
เอาต์พุต:
Successfully imported 1 findings. 2026-10-22T02:27:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log
10. ล้างทรัพยากร
⏱️ ระยะเวลา: 01:00
หากต้องการหลีกเลี่ยงการใช้ดิสก์โดยไม่จำเป็นในสภาพแวดล้อมของ Shell ใน Google Cloud Shell และล้างทรัพยากรเวิร์กช็อปชั่วคราว ให้ทำตามขั้นตอนการล้างข้อมูลต่อไปนี้
ขั้นตอนที่ 1: ล้างแคชในเครื่องของ CodeMender และนำที่เก็บออก
CodeMender มีคำสั่ง cm clean ในตัวเพื่อล้างฐานข้อมูลการค้นพบในเครื่อง (~/.codemender/state.db) รายงาน HTML และไฟล์ข้อมูลสำรองของแหล่งที่มา เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell
# Purge local SQLite findings cache, HTML reports, and backup files
cm clean
# Remove cloned repository
cd ~
rm -rf ~/juice-shop
ขั้นตอนที่ 2: (ไม่บังคับ) ปิดใช้ Google Cloud API
หากคุณไม่ได้วางแผนที่จะใช้ CodeMender หรือ API ของ Agent Platform ในโปรเจ็กต์นี้เพื่อการพัฒนาเพิ่มเติม คุณสามารถปิดใช้ API ของบริการได้โดยทำดังนี้
gcloud services disable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=${PROJECT_ID}
11. ขอแสดงความยินดี
⏱️ ระยะเวลา: 02:00
ยินดีด้วย คุณได้เปลี่ยน OWASP Juice Shop จากแอปพลิเคชันที่มีช่องโหว่โดยเจตนาให้เป็นฐานของโค้ดที่ปลอดภัยและได้รับการเสริมความปลอดภัยโดยใช้ CodeMender บน Gemini Enterprise Agent Platform ของ Google Cloud เรียบร้อยแล้ว
สิ่งที่คุณได้พูดถึง
การแก้ไขแบบ Closed-Loop อัตโนมัติ: CodeMender ก้าวข้ามการแจ้งเตือนแบบคงที่ที่ไม่มีการตอบสนองด้วยการดำเนินการตามวงจรการรักษาความปลอดภัยแบบกำหนดเองที่สมบูรณ์ ตั้งแต่การค้นพบคลังเก็บ (cm find) ไปจนถึงการตรวจสอบการเจาะช่องโหว่ในแซนด์บ็อกซ์ (cm verify) และการสังเคราะห์แพตช์ที่ผ่านการทดสอบการถดถอย (cm fix)
การพิสูจน์การเจาะระบบตามหลักฐาน: CodeMender จะบันทึกอาร์ติแฟกต์การยืนยันที่จับต้องได้ (PLAN.md, LOG.md, exploit.sh, REPORT.md) เพื่อกำจัดผลบวกลวงและพิสูจน์ความสามารถในการเจาะระบบในโลกจริงก่อนที่จะเขียนโค้ดใดๆ
การแก้ไขตามบริบทและสำนวน: แทนที่จะใช้การแทนที่ข้อความทั่วไป ตัวแทนการให้เหตุผลของ Gemini จะวิเคราะห์สถาปัตยกรรมแอปพลิเคชัน โมเดลข้อมูล และ ORM เพื่อสร้างแพตช์ที่สะอาดและดูแลรักษาได้ (เช่น การค้นหา Sequelize ที่กำหนดพารามิเตอร์) ซึ่งจะคงตรรกะทางธุรกิจที่มีอยู่ไว้
การป้องกันความปลอดภัยและการทดสอบในตัว: การแก้ไขที่เสนอทุกรายการจะได้รับการตรวจสอบโดยอัตโนมัติเทียบกับชุดโปรแกรมทดสอบของโปรเจ็กต์ (npm test) และเครื่องมือตรวจสอบประเภท (tsc) ภายในแซนด์บ็อกซ์พื้นที่ทำงานที่แยกต่างหากก่อนที่จะมีการจัดเตรียมการเปลี่ยนแปลง
การเปลี่ยนแนวคิดของนักพัฒนาแอป
เวิร์กโฟลว์ SAST แบบดั้งเดิมที่ดำเนินการด้วยตนเอง | การแก้ไขอัตโนมัติด้วย CodeMender (cm) |
ความเหนื่อยล้าจากการแจ้งเตือน: ใช้เวลาหลายชั่วโมงในการคัดแยกรวมถึงจัดลำดับความสำคัญของรายงานที่มีการแจ้งเตือนจำนวนมากซึ่งมีอัตราผลบวกลวงสูง | Agentic Code Discovery ( |
การยืนยัน PoC ด้วยตนเอง: การสร้างเพย์โหลด Curl และสคริปต์การโจมตีที่กำหนดเองเพื่อยืนยันช่องโหว่ | Automated Exploit Proofs ( |
การเปลี่ยนโครงสร้างภายในโค้ดด้วยตนเองที่มีความเสี่ยงสูง: การแก้ไขการค้นหาฐานข้อมูลที่ซับซ้อนด้วยตนเอง ซึ่งมักทำให้เกิดข้อผิดพลาดทางไวยากรณ์หรือข้อผิดพลาดขณะรันไทม์ | Idiomatic Patch Synthesis ( |
ความเสี่ยงจากการถดถอยในเวอร์ชันที่ใช้งานจริง: แพตช์ด้านความปลอดภัยมักจะทำให้ตรรกะทางธุรกิจหรือการทดสอบที่อยู่ปลายน้ำเสียหาย | Automated Test Guardrails: การตรวจสอบอย่างต่อเนื่องกับชุดโปรแกรมทดสอบในเครื่องและแซนด์บ็อกซ์กระบวนการที่แยกต่างหาก |
การรวบรวมข้อมูลการปฏิบัติตามข้อกำหนดด้วยตนเอง: การรวบรวมข้อมูลที่พบลงในเอกสารแบบคงที่ด้วยตนเองเพื่อตรวจสอบการตรวจสอบบัญชี | Telemetry และ SARIF ที่ได้มาตรฐาน ( |
ขั้นตอนถัดไป
🚀 ดูไตรภาค CodeMender ต่อ
ส่วนที่ 2: รักษาความปลอดภัยให้ไปป์ไลน์ CI/CD ด้วย CodeMender - สแกนแบบ Headless อย่างต่อเนื่องโดยอัตโนมัติ, ผสานรวมแดชบอร์ด SARIF และ Pull Request ที่แก้ไขด้วยตนเองใน GitHub Actions
ส่วนที่ 3: การเขียนโค้ดแบบ Vibe Coding อย่างปลอดภัยด้วย Antigravity และ CodeMender — จับคู่การพัฒนา Generative AI กับผู้ช่วยด้านความปลอดภัยแบบอัตโนมัติ
📖 สำรวจเอกสารประกอบ
เอกสารประกอบของ CodeMender ใน Google Cloud
โซลูชันด้านความปลอดภัยของ Google Cloud
💡 นำไปใช้กับโปรเจ็กต์ของคุณเอง
เรียกใช้ cm find . และ cm fix ในที่เก็บ Node.js, Python, Go, Java, Rust หรือ C/C++ ของคุณเอง