รักษาความปลอดภัยให้แอปพลิเคชันด้วย CodeMender

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

จากมุมมองของผู้ใช้ 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

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 สถานะอย่างเป็นทางการ ดังนี้

สถานะการค้นพบ

ความหมายและการจัดการการเปลี่ยนผ่าน

OPEN

พบ (หรือนำเข้า) ช่องโหว่แล้ว แต่ยังไม่ได้รับการยืนยัน แพตช์ หรือปิดไป

FIXED

CodeMender ได้สร้างแพตช์ ใช้ Diff และยืนยันว่าชุดบิลด์/ชุดโปรแกรมทดสอบผ่านและการเจาะช่องโหว่ไม่สำเร็จ

DISMISSED

ทำเครื่องหมายว่าไม่ทำงานเนื่องจากมีความเชื่อมั่นต่ำ อยู่นอกโมเดลภัยคุกคาม หรือได้รับการยืนยันว่าเป็นผลบวกลวง ปิดเสียงการแจ้งเตือนในอนาคต

REOPENED

ตรวจพบข้อบกพร่องที่FIXEDหรือDISMISSEDก่อนหน้านี้อีกครั้งในการสแกนครั้งต่อมา (ซึ่งบ่งชี้ถึงการถดถอยของโค้ด)

การจัดประเภทความรุนแรง

🔴 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

info.yaml

ไฟล์ Manifest ของข้อมูลเมตา

YAML ที่มีโครงสร้างซึ่งกำหนด UUID, ชื่อ, ความรุนแรง (CRITICAL), ความเชื่อมั่น (certain) และแท็ก CWE (cwe-89) ของการค้นพบ

PLAN.md

กลยุทธ์ตัวแทน

แผนการยืนยันและรายการตรวจสอบทีละขั้นตอนที่ดำเนินการโดยอัตโนมัติโดยเครื่องมือการให้เหตุผลของ CodeMender

LOG.md

บันทึกการติดตามการดำเนินการ

บันทึกการตรวจสอบที่มีการประทับเวลาซึ่งบันทึกการเรียกใช้เครื่องมือแต่ละครั้ง ปลายทางคำขอ HTTP และผลการทดสอบ

server_runner.js / server.log

Helper Runner / บันทึกของเซิร์ฟเวอร์

สคริปต์ตัวช่วยที่ Agent สร้างขึ้นเพื่อเริ่ม Juice Shop สำหรับการทดสอบ และเอาต์พุตของเซิร์ฟเวอร์ที่บันทึกไว้

exploit.sh

Execution Wrapper / Standalone PoC

Wrapper สคริปต์ของ Shell ที่เปิดบริการเป้าหมายและเรียกใช้ไคลเอ็นต์ PoC เพื่อตรวจสอบการตอบกลับ HTTP 200

REPORT.md

การวิเคราะห์สาเหตุของปัญหา

ข้อมูลสรุป, การวิเคราะห์ช่องโหว่แบบบรรทัดต่อบรรทัด, รายละเอียด SQL ดิบ และคำแนะนำในการกำหนดพารามิเตอร์ Sequelize

ขั้นตอนที่ 3: คำแนะนำแบบเจาะลึกเกี่ยวกับไฮไลต์ของอาร์ติแฟกต์การยืนยัน

Agent จะเขียนอาร์ติแฟกต์เหล่านี้ใหม่ทุกครั้งที่เรียกใช้ ดังนั้นเนื้อหาที่แน่นอนจึงแตกต่างกันในแต่ละครั้ง เปิดไฟล์ใน Cloud Shell Editor (หรือด้วย cat) แล้วมองหาสิ่งต่อไปนี้

Artifact

สิ่งที่ควรตรวจสอบ

info.yaml

รหัสแบบเต็ม ชื่อ ความรุนแรง ความเชื่อมั่น และแท็กของผลการตรวจพบ เช่น cwe-89

PLAN.md

รายการตรวจสอบที่ Agent ทำตาม ตั้งแต่การอ่านไฟล์ที่รายงานไปจนถึงการเขียนสคริปต์การจำลองสถานการณ์

LOG.md

การดำเนินการและผลลัพธ์ที่มีการประทับเวลา รวมถึงผลลัพธ์ของการเรียกใช้สคริปต์การจำลองแต่ละครั้ง

exploit.sh

สคริปต์การจำลองแบบสแตนด์อโลน: วิธีเริ่มแอป ปลายทางที่กำหนดเป้าหมาย และวิธีตัดสินความสำเร็จ (พิมพ์ EXPLOIT SUCCESSFUL)

server_runner.js / server.log

ไฟล์ตัวช่วยที่ Agent สร้างขึ้นเพื่อเริ่ม Juice Shop สำหรับการทดสอบ และเอาต์พุตของเซิร์ฟเวอร์นั้น

REPORT.md

การวิเคราะห์สาเหตุของปัญหา: บรรทัดที่มีช่องโหว่ใน routes/login.ts เหตุใดจึงถูกโจมตีได้ และการแก้ไขที่แนะนำ (การค้นหาที่มีพารามิเตอร์)

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)

ภาพรวมแดชบอร์ดการปฏิบัติตามข้อกำหนดด้านความปลอดภัยของ CodeMender

1. ส่วนหัวของเมตริกสำหรับผู้บริหารและการ์ดสถานะ

ส่วนหัวของเมตริกสำหรับผู้บริหารและการ์ดสถานะของ CodeMenderข้อมูลเมตาของส่วนหัว: แสดงรายละเอียดที่เก็บเป้าหมาย (OWASP Juice Shop) ไฟล์ต้นฉบับทั้งหมดที่สแกน (684 files) และการประทับเวลาการสร้าง UTC

ตารางกริดการ์ดเมตริก: แสดงภาพรวมระดับสูงแบบทันทีของการค้นพบทั้งหมด การกระจายความรุนแรง (CRITICAL, HIGH, MEDIUM, LOW) และช่องโหว่ที่แก้ไขแล้วทั้งหมด (FIXED)

2. ตารางสรุปผลการค้นพบแบบอินเทอร์แอกทีฟ

ตารางสรุปผลการค้นพบของ CodeMenderเมทริกซ์ช่องโหว่: แสดงตารางที่กรองได้ซึ่งมี ID, Severity, Status (OPEN เทียบกับ FIXED), CWE Type, File Location, Vulnerability Title และ Confidence Score

3. การวิเคราะห์สาเหตุของปัญหาเชิงลึกและข้อมูลโค้ดต้นฉบับที่มีช่องโหว่

การวิเคราะห์สาเหตุของปัญหาและข้อมูลโค้ดของ CodeMenderการวิเคราะห์แบบยุบได้ (RCA): การคลิกแถวผลการค้นหาใดๆ จะขยายการวิเคราะห์สาเหตุของปัญหาโดยละเอียดซึ่งสังเคราะห์โดยโมเดลการให้เหตุผลด้านความปลอดภัยของ Gemini

ข้อมูลโค้ดของซอร์สโค้ดที่มีช่องโหว่: แสดงหมายเลขบรรทัดที่แน่นอนและซอร์สโค้ดที่ไฮไลต์ไวยากรณ์รอบๆ ซิงก์ที่มีช่องโหว่

4. ความแตกต่างของแพตช์การแก้ไขที่ AI สังเคราะห์ขึ้น

ความแตกต่างของแพตช์การแก้ไขที่สังเคราะห์โดย CodeMenderมุมมอง 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 (cm find .): การสแกนที่เก็บโค้ดแบบเจาะลึกและคำนึงถึงบริบทซึ่งขับเคลื่อนโดยโมเดล Gemini

การยืนยัน PoC ด้วยตนเอง: การสร้างเพย์โหลด Curl และสคริปต์การโจมตีที่กำหนดเองเพื่อยืนยันช่องโหว่

Automated Exploit Proofs (cm verify ): การสังเคราะห์แผนการตรวจสอบที่เรียกใช้ได้ บันทึก และสคริปต์ของ Shell โดยอัตโนมัติ

การเปลี่ยนโครงสร้างภายในโค้ดด้วยตนเองที่มีความเสี่ยงสูง: การแก้ไขการค้นหาฐานข้อมูลที่ซับซ้อนด้วยตนเอง ซึ่งมักทำให้เกิดข้อผิดพลาดทางไวยากรณ์หรือข้อผิดพลาดขณะรันไทม์

Idiomatic Patch Synthesis (cm fix ): การสร้าง Diff ที่คำนึงถึงบริบทซึ่งปรับให้เหมาะกับ ORM และมาตรฐานเฟรมเวิร์กที่มีอยู่

ความเสี่ยงจากการถดถอยในเวอร์ชันที่ใช้งานจริง: แพตช์ด้านความปลอดภัยมักจะทำให้ตรรกะทางธุรกิจหรือการทดสอบที่อยู่ปลายน้ำเสียหาย

Automated Test Guardrails: การตรวจสอบอย่างต่อเนื่องกับชุดโปรแกรมทดสอบในเครื่องและแซนด์บ็อกซ์กระบวนการที่แยกต่างหาก

การรวบรวมข้อมูลการปฏิบัติตามข้อกำหนดด้วยตนเอง: การรวบรวมข้อมูลที่พบลงในเอกสารแบบคงที่ด้วยตนเองเพื่อตรวจสอบการตรวจสอบบัญชี

Telemetry และ SARIF ที่ได้มาตรฐาน (cm report -f sarif): ส่งออก OASIS SARIF v2.1.0, แดชบอร์ด HTML และการวิเคราะห์โทเค็นได้ทันที

ขั้นตอนถัดไป

🚀 ดูไตรภาค 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++ ของคุณเอง