1. Trước khi bắt đầu
⏱️ Thời lượng: 3 phút
Chào mừng bạn đến với lớp học lập trình thực hành về Bảo mật ứng dụng bằng CodeMender trên Nền tảng tác nhân Gemini Enterprise của Google Cloud.
Trong hội thảo này, bạn sẽ đóng vai một Kỹ sư bảo mật đám mây có nhiệm vụ kiểm tra và bảo mật OWASP Juice Shop – ứng dụng web theo tiêu chuẩn ngành, được thiết kế có chủ đích để chứa lỗ hổng bảo mật và được xây dựng bằng Node.js, Express, TypeScript và Angular.
Các công cụ quét bảo mật truyền thống (SAST/DAST) cung cấp cho nhóm phát triển hàng nghìn kết quả bảo mật tĩnh, tỷ lệ dương tính giả cao và không có bản sửa lỗi mã nào có thể thực hiện được. Nhà phát triển dành hàng giờ để phân loại nhật ký, theo dõi luồng dữ liệu và viết bản vá theo cách thủ công, thường làm hỏng hành vi hiện có của ứng dụng.
CodeMender cách mạng hoá khả năng bảo mật mã bằng cách tích hợp một khung vận hành tác nhân được tinh chỉnh vào các mô hình ngôn ngữ lớn Gemini của Google. Sử dụng các câu lệnh do Google DeepMind thiết kế, kỹ năng bảo mật chuyên biệt và khả năng điều phối nhiều tác nhân, CodeMender đóng vai trò là một Đồng phát triển bảo mật AI tự chủ, giúp tìm, xác minh và khắc phục các lỗ hổng phần mềm ngay trong kho lưu trữ nguồn cục bộ.
Điều kiện tiên quyết
- Hiểu biết cơ bản về các lỗ hổng bảo mật của ứng dụng web (OWASP Top 10, chẳng hạn như SQL Injection và XSS)
- Hiểu biết cơ bản về các ứng dụng JavaScript/TypeScript và Node.js
- Hiểu biết cơ bản về các công cụ giao diện dòng lệnh (CLI)
Kiến thức bạn sẽ học được
- Cách thiết lập, xác thực và khởi động CLI CodeMender (
cm) trong Google Cloud Shell. - Cách tự động quét kho lưu trữ để phát hiện các lỗ hổng bảo mật có thể khai thác (
cm find). - Cách xác thực lỗ hổng bảo mật trong hộp cát tách biệt và kiểm tra cấu phần phần mềm xác minh (
cm verify). - Cách tự động tổng hợp, kiểm thử và áp dụng các bản vá bảo mật dựa trên bối cảnh (
cm fix). - Cách kiểm tra dữ liệu đo từ xa của mã thông báo và xuất báo cáo tuân thủ ở nhiều định dạng (
cm stats,cm report).
Những gì bạn cần
- Một dự án trên Google Cloud đã bật tính năng thanh toán
- Google Cloud Shell có kết nối dự án đang hoạt động (bao gồm
gcloud,gitvà Node.js 18 trở lên được cài đặt sẵn) - Kho lưu trữ khởi đầu: Kho lưu trữ OWASP Juice Shop trên GitHub
2. Giới thiệu về cấu trúc của CodeMender
⏱️ Thời lượng: 4 phút
Trước khi tìm hiểu kỹ về quy trình quét và khắc phục mã, hãy cùng tìm hiểu cách CodeMender hoạt động trong Nền tảng tác nhân Gemini Enterprise theo các tiêu chuẩn kiến trúc chính thức của Google Cloud.
Kiến trúc hệ thống: Tác nhân và trình nền máy khách

Từ góc độ người dùng, CodeMender bao gồm hai thành phần kiến trúc chính:
Nền tảng đa tác nhân được lưu trữ: Một hệ thống đa tác nhân được lưu trữ chạy trên Google Cloud, thực thi logic kinh doanh bảo mật cốt lõi, thiết kế câu lệnh LLM và suy luận bảo mật.
Local Client CLI & Sandbox Daemon (cm): Một ứng dụng khách chạy trong Google Cloud Shell, đóng vai trò vừa là CLI (để đưa ra các lệnh như cm find, cm verify, cm fix) vừa là trình nền cục bộ (để thực thi các lệnh một cách an toàn thay mặt cho tác nhân bên trong hộp cát cấp quy trình tách biệt).
3 tính năng khắc phục chính

CodeMender xử lý vấn đề bảo mật mã thông qua ba giai đoạn tích hợp:
Tìm lỗ hổng bảo mật (cm find): Quét toàn bộ mã nguồn bằng một LLM (mô hình ngôn ngữ lớn) do tác nhân hướng dẫn, tận dụng các công cụ bảo mật chuyên biệt và thiết kế câu lệnh để giúp mô hình tập trung vào các lỗ hổng bảo mật. (Ngoài ra, bạn có thể nhập kết quả từ các công cụ quét bảo mật bên ngoài).
Xác minh lỗ hổng bảo mật (cm verify): Tạo mã cục bộ và cố gắng khai thác các lỗ hổng đã phát hiện để xác minh xem có thể khai thác các lỗ hổng đó hay không. Điều này giúp loại bỏ kết quả dương tính giả và tạo ra các cấu phần phần mềm xác minh không gian làm việc ổn định trong .exploit/ (info.yaml, PLAN.md, LOG.md, exploit.sh, REPORT.md).
Khắc phục lỗ hổng bảo mật (cm fix): Tổng hợp các bản vá nguồn nhận biết ngôn ngữ và xác minh các bản vá đó bằng cách chạy các bộ kiểm thử hồi quy và bản dựng dự án (npm test) bên trong hộp cát cục bộ.
3. Thiết lập môi trường OWASP Juice Shop
⏱️ Thời lượng: 5 phút
Trong bước này, bạn sẽ mở môi trường dòng lệnh Google Cloud và tìm nạp kho lưu trữ ứng dụng mục tiêu.
Bước 1: Mở Cloud Shell trong Google Cloud Console
Chuyển đến Google Cloud Console trong trình duyệt.
Trong thanh điều hướng trên cùng, hãy nhấp vào nút Kích hoạt Cloud Shell (biểu tượng >_).
Cloud Shell cung cấp một cửa sổ dòng lệnh Linux dựa trên trình duyệt, trong đó gcloud, git và Node.js đã được cài đặt trước và xác thực.
Bước 2: Sao chép kho lưu trữ OWASP Juice Shop
Trong Cloud Shell hoặc thiết bị đầu cuối cục bộ, hãy sao chép kho lưu trữ OWASP Juice Shop:
git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop
Bước 3: Kiểm tra các tệp chính của ứng dụng
OWASP Juice Shop sử dụng Express.js trên phần phụ trợ với các mô-đun TypeScript. Hãy xem nhanh cấu trúc thư mục:
ls -la routes/ lib/
Hãy lưu ý các tệp định tuyến chính xử lý việc xác thực, truy vấn của người dùng và quản trị giỏ hàng:
routes/login.ts: Xử lý việc xác thực người dùng và thực thi truy vấn SQL thô.
routes/search.ts: Xử lý việc tìm kiếm sản phẩm và kết xuất phản hồi.
routes/basket.ts: Xử lý việc truy xuất giỏ hàng của người dùng.
routes/trackOrder.ts: Xử lý việc theo dõi đơn đặt hàng thông qua các truy vấn NoSQL.
lib/xml.ts: Xử lý việc phân tích cú pháp XML và tải tệp lên.
lib/insecurity.ts: Các tiện ích trợ giúp cho mã thông báo phiên và mã hoá.
4. Cài đặt CodeMender CLI (cm) và xác thực thông tin đăng nhập GCP
⏱️ Thời lượng: 8 phút
Trong bước này, bạn sẽ bật các Cloud APIs cần thiết của Google, cấp quyền IAM bằng gcloud, tải xuống và cài đặt tệp nhị phân CLI cm, đồng thời định cấu hình Thông tin xác thực mặc định của ứng dụng (ADC).
Bước 1: Bật các Cloud API của Google Cloud cần thiết thông qua gcloud
CodeMender yêu cầu API Nền tảng tác nhân (aiplatform.googleapis.com) và API Cloud Resource Manager (cloudresourcemanager.googleapis.com) trên Nền tảng tác nhân Gemini Enterprise.
Trong Cloud Shell hoặc thiết bị đầu cuối, hãy truy xuất Mã dự án đang hoạt động (hoặc kiểm tra trình đơn thả xuống của dự án ở đầu Google Cloud Console) và bật các API dịch vụ cần thiết:
# 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}
Xác minh rằng các API đã được bật:
gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"
Bước 2: Cấp quyền IAM thông qua gcloud
Để tương tác với công cụ suy luận trên đám mây của CodeMender, người dùng và tài khoản dịch vụ phải được chỉ định vai trò IAM roles/aiplatform.user (Người dùng nền tảng tác nhân).
Cấp vai trò IAM cho tài khoản người dùng của bạn thông qua 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"
Bước 3: Tải xuống và cài đặt cm CLI trong Cloud Shell
Trong Google Cloud Shell, dữ liệu người dùng được lưu trữ liên tục trong thư mục $HOME. Thực thi các lệnh sau để cài đặt cm vào ~/bin mà không cần sudo. Bạn vẫn đang ở trong ~/juice-shop từ phần trước, vì vậy, các lệnh sẽ tải xuống một thư mục tạm thời và dọn dẹp thư mục đó sau đó. Bằng cách đó, không có tệp trình cài đặt nào được đưa vào kho lưu trữ 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
Bước 4: Xác minh cm quá trình cài đặt CLI
Chạy cm --version để xác minh rằng tệp nhị phân CLI đã được cài đặt đúng cách:
cm --version
Kết quả đầu ra dự kiến:
cm version 0.17.0
Bước 5: Thiết lập Thông tin xác thực mặc định của ứng dụng (ADC) trên Google Cloud
Định cấu hình Thông tin xác thực mặc định của ứng dụng (ADC) trên Google Cloud để cm có thể xác thực các yêu cầu gửi đến công cụ suy luận trên đám mây:
gcloud auth application-default login
Hộp thoại phương thức uỷ quyền có nhãn Authorize Cloud Shell (Uỷ quyền cho Cloud Shell) sẽ xuất hiện. Nhấp vào Uỷ quyền để cấp quyền truy cập.
5. Khởi chạy và xác minh không gian làm việc của CodeMender
⏱️ Thời lượng: 3 phút
Giờ đây, khi cm đã được cài đặt và xác thực, bạn sẽ khởi động không gian làm việc của CodeMender trong thư mục dự án mục tiêu và xác minh chế độ thiết lập môi trường.
Bước 1: Khởi động không gian làm việc của CodeMender (cm init)
Chạy cm init từ thư mục gốc của dự án để khởi động các tệp theo dõi trạng thái cục bộ và thiết lập cấu hình đường cơ sở:
cm init
Kết quả:
✅ Initialized CodeMender workspace at /home/user/.codemender
Bước 2: Chạy quy trình chẩn đoán tình trạng từ đầu đến cuối (cm health)
Trước khi khởi chạy phiên tác nhân, hãy chạy cm health để xác minh thông tin xác thực, cấu hình, khả năng kết nối và quyền uỷ quyền:
cm health
Kết quả:
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)
Bước 3: Tìm hiểu các thông số cấu hình (config.yaml)
CodeMender tạo một tệp cấu hình không gian làm việc tại .codemender/config.yaml (hoặc ~/.codemender/config.yaml). Tệp này xác định ranh giới chính sách, quy tắc bao gồm tệp và trình kích hoạt xác minh kiểm thử:
# 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. Phát hiện lỗ hổng bảo mật bằng lệnh cm find .
⏱️ Thời lượng: 07:00
Trong bước này, bạn sẽ chạy cm find . --quick để thực hiện quy trình quét bảo mật dựa trên tác nhân trên toàn bộ mã nguồn của Juice Shop.
Bước 1: Thực thi cm find . --quick
Kể từ CodeMender phiên bản 0.16.0, cm find <path> mặc định là Quét sâu (
--deep
) để phân tích kỹ lưỡng từng tệp, còn Quét nhanh (
--quick
) giúp phân loại nhanh kho lưu trữ. Chạy cm find . --quick để thực hiện Quét nhanh trên kho lưu trữ OWASP Juice Shop (Thời gian thực thi ước tính: ~8 phút để phân loại toàn bộ mã nguồn gồm 684 tệp):
cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash
cm khởi chạy một phiên quét trên Nền tảng Tác nhân Gemini Enterprise, phân tích các tệp mã nguồn trên tất cả các mô-đun kho lưu trữ:
⚠️ 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
Bước 2: Xem kết quả quét qua cm report
Chạy cm report -f table để hiển thị tất cả kết quả bảo mật được phát hiện từ cơ sở dữ liệu trạng thái SQLite cục bộ:
cm report -f table
Kết quả:
┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐ │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
Bước 3: Tìm hiểu các trạng thái trong vòng đời và mức độ nghiêm trọng của kết quả phát hiện
CodeMender theo dõi các lỗ hổng bảo mật thông qua một vòng đời chính thức gồm 4 trạng thái:
Trạng thái tìm kiếm | Ý nghĩa và cách xử lý chuyển đổi |
| Lỗ hổng bảo mật đã được phát hiện (hoặc nhập) nhưng chưa được xác minh, vá hoặc loại bỏ. |
| CodeMender đã tạo một bản vá, áp dụng bản vá đó và xác minh rằng các bộ kiểm thử/bản dựng đều thành công và các hành vi khai thác đều thất bại. |
| Được đánh dấu là không hoạt động do mức độ tin cậy thấp, nằm ngoài mô hình mối đe doạ hoặc được xác minh là dương tính giả. Tắt tiếng các cảnh báo trong tương lai. |
| Một lỗ hổng bảo mật đã được |
Phân loại mức độ nghiêm trọng
🔴 CRITICAL: Rủi ro nghiêm trọng, tức thì (ví dụ: Thực thi mã từ xa, Chèn SQL không được xác thực) có thể truy cập trực tiếp từ các ranh giới không đáng tin cậy.
HIGH: Lỗi nghiêm trọng (ví dụ: đọc cơ sở dữ liệu tuỳ ý, leo thang đặc quyền) cần có bối cảnh người dùng cụ thể hoặc các điều kiện liên kết.
🟡 MEDIUM: Rủi ro ở mức trung bình, có phạm vi hạn chế hoặc cần người dùng tương tác (ví dụ: Chuyển hướng mở, CSRF).
🔵 LOW: Lỗi vệ sinh trong chiến lược phòng thủ theo chiều sâu hoặc vectơ do thám có tác động trực tiếp ở mức tối thiểu.
7. Xác minh lỗ hổng bảo mật và xem xét các cấu phần phần mềm xác minh đã thu thập được
⏱️ Thời lượng: 10:00
Một trong những tính năng chính của CodeMender là tự động tạo Cấu phần xác minh cố định mỗi khi bạn chạy cm verify. Hãy xác minh kết quả phát hiện lỗi Chèn mã SQL nghiêm trọng trong routes/login.ts (được minh hoạ là 43aa7446 trong hướng dẫn này) và xem các cấu phần phần mềm do tác nhân tạo.
Bước 1: Thực thi cm verify <login-finding-id>
Tìm mã kết quả cho routes/login.ts trong bảng cm report (ví dụ: 43aa7446) rồi chạy cm verify <finding-id> --sandbox=false --bypass-warning -y (Thời gian thực thi ước tính: ~20 phút để chạy các bước của công cụ tự động, khởi động dịch vụ nền và thực thi tập lệnh khai thác PoC trực tiếp):
# 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
Kết quả:
⚠️ 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
Bước 2: Tổng quan về các cấu phần xác minh đã thu thập
Kể từ CodeMender phiên bản 0.16.0, các cấu phần phần mềm xác minh được chuẩn hoá tại thư mục gốc của kho lưu trữ trong .exploit/, đồng thời giữ lại một bản sao cố định trong ~/.codemender/artifacts/<session-id>/. Đây là các tệp đang hoạt động trên máy chứ không phải là một phần của bản sửa lỗi, vì vậy, bạn sẽ loại trừ các tệp này khỏi Git trước khi chuyển bản vá sang trạng thái "staged" (đã chuẩn bị) trong phần tiếp theo. Chạy ls -la .exploit/ để liệt kê các thiết bị:
ls -la .exploit/
Kết quả:
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
Tệp cấu phần phần mềm | Danh mục | Mục đích |
| Tệp kê khai siêu dữ liệu | YAML có cấu trúc xác định UUID, tiêu đề, mức độ nghiêm trọng ( |
| Chiến lược về nhân viên hỗ trợ | Kế hoạch xác minh từng bước và danh sách kiểm tra do công cụ suy luận của CodeMender thực hiện một cách tự động. |
| Nhật ký theo dõi quá trình thực thi | Nhật ký kiểm tra có dấu thời gian ghi lại từng lệnh gọi công cụ, điểm cuối yêu cầu HTTP và kết quả kiểm thử. |
| Trình chạy trợ giúp/Nhật ký máy chủ | Tập lệnh trợ giúp mà tác nhân đã tạo để khởi động Juice Shop cho mục đích kiểm thử và kết quả thu thập được từ máy chủ. |
| Trình bao bọc thực thi/PoC độc lập | Trình bao bọc tập lệnh shell khởi chạy dịch vụ mục tiêu và gọi ứng dụng PoC, xác thực phản hồi HTTP 200. |
| Phân tích nguyên nhân gốc | Bản tóm tắt, phân tích lỗ hổng bảo mật theo từng dòng, phân tích SQL thô và đề xuất tham số hoá Sequelize. |
Bước 3: Tìm hiểu sâu về các điểm nổi bật của cấu phần xác minh
Tác nhân sẽ ghi lại các cấu phần phần mềm này mỗi khi chạy, vì vậy, nội dung chính xác của các cấu phần phần mềm này sẽ khác nhau mỗi lần. Mở các tệp này trong Trình chỉnh sửa Cloud Shell (hoặc bằng cat) rồi tìm những nội dung sau:
Tạo tác | Những điểm cần chú ý |
| Mã nhận dạng đầy đủ, tiêu đề, mức độ nghiêm trọng, độ tin cậy và thẻ của kết quả phát hiện, chẳng hạn như |
| Danh sách kiểm tra mà nhân viên hỗ trợ đã làm theo, từ việc đọc tệp được báo cáo đến việc viết tập lệnh tái hiện. |
| Các hành động và kết quả có dấu thời gian, bao gồm cả kết quả của mỗi lần chạy tập lệnh tái hiện. |
| Tập lệnh tái hiện độc lập: cách tập lệnh này khởi động ứng dụng, điểm cuối mà tập lệnh này nhắm đến và cách tập lệnh này quyết định thành công (tập lệnh này in |
| Các tệp trợ giúp mà tác nhân đã tạo để khởi động Juice Shop cho mục đích thử nghiệm và kết quả của máy chủ đó. |
| Phân tích nguyên nhân gốc: dòng dễ bị tấn công trong |
8. Khắc phục lỗi chèn SQL bằng cách sửa đổi mã
⏱️ Thời lượng: 10:00
Giờ đây, khi đã xác minh kết quả về lỗi chèn SQL trong routes/login.ts (mã nhận dạng ví dụ: 43aa7446) và kiểm tra các cấu phần phần mềm của lỗi này, hãy thực thi cm fix để áp dụng bản vá truy vấn có tham số tự động.
Bước 1: Thực thi cm fix <login-finding-id> -y
Chạy cm fix <finding-id> --sandbox=false --bypass-warning -y (thay thế 43aa7446 bằng mã nhận dạng thông tin đăng nhập thực tế của bạn từ cm report) để tổng hợp và áp dụng bản sửa lỗi:
# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash
Kết quả:
⚠️ 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
Bước 2: Kiểm tra trạng thái VCS và sự khác biệt bằng cm vcs
Chạy cm vcs status và cm vcs diff để xem các tệp không gian làm việc đã sửa đổi:
cm vcs status
cm vcs diff
Kết quả:
📂 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
Hai mục không được theo dõi là các tệp cục bộ của CodeMender, không phải là một phần của bản sửa lỗi: .exploit/ lưu giữ các cấu phần phần mềm xác minh từ cm verify và .cm_project đánh dấu thư mục gốc của dự án cho CodeMender. Bạn sẽ loại bỏ các tệp này khỏi lệnh xác nhận ở bước tiếp theo.
Và 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 !== '') {
Bước 3: Đưa bản vá đã xác minh vào giai đoạn thử nghiệm bằng cm vcs stage
Sau khi bạn xem xét bản vá khác biệt hợp nhất và xác nhận rằng biện pháp khắc phục đáp ứng các tiêu chuẩn về chất lượng và bảo mật, hãy đưa bản vá vào giai đoạn chuẩn bị để cam kết. Vì cm vcs stage chạy git add -A, nên lệnh này sẽ đưa mọi thay đổi trong cây đang hoạt động vào khu vực tổ chức, bao gồm cả các mục .exploit/ và .cm_project chưa được theo dõi từ Bước 2. Trước tiên, hãy thêm các tệp đó vào .git/info/exclude, một tệp bỏ qua chỉ có trên thiết bị mà Git không bao giờ cam kết, để chỉ có bản vá được đưa vào khu vực tổ chức:
# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude
Sau đó, hãy sắp xếp các thay đổi bằng cm vcs stage:
cm vcs stage
Kết quả:
📦 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.
Xác minh rằng chỉ có bản vá được đưa vào Git:
cm vcs status
Kết quả:
📂 CodeMender VCS Status ────────────────────────────────────────────────── Directory: /home/user/juice-shop Command: git status --short ────────────────────────────────────────────────── M routes/login.ts
Nếu bạn đã chạy cm vcs stage trước khi cập nhật .git/info/exclude, hãy huỷ giai đoạn cho các tệp CodeMender bằng git restore --staged .exploit .cm_project. Các tệp vẫn nằm trên ổ đĩa; chúng chỉ bị xoá khỏi khu vực thử nghiệm.
Bước 4: Cam kết bản vá và xoá cấu phần phần mềm xác minh
Xác nhận bản vá đã chuẩn bị trước khi bạn khắc phục kết quả tiếp theo: mỗi lần chạy cm fix và cm verify đều bắt đầu bằng việc đặt lại không gian làm việc (git checkout HEAD -- . && git clean -fd), thao tác này sẽ loại bỏ các thay đổi chưa được xác nhận. Sau đó, hãy xoá thư mục .exploit/ trên máy để bản sửa lỗi tiếp theo bắt đầu từ một không gian làm việc mới. Vì .exploit/ hiện đã bị bỏ qua, nên git clean -fd không còn xoá tệp này cho bạn nữa. Bản sao cố định của cấu phần phần mềm vẫn còn trong ~/.codemender/artifacts/<session-id>/.
git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/
Nếu Git yêu cầu bạn cung cấp danh tính, hãy chạy git config user.name "Your Name" và git config user.email "you@example.com" trong kho lưu trữ, sau đó cam kết lại.
9. Xác thực bản vá, quản lý phiên và xuất báo cáo (báo cáo cm)
⏱️ Thời lượng: 8 phút
Sau khi áp dụng bản sửa lỗi bảo mật do AI tạo, bạn cần quản lý các phiên hoạt động, kiểm tra số liệu thống kê về mức sử dụng mã thông báo và tạo báo cáo tuân thủ bảo mật của doanh nghiệp bằng cm report.
Bước 1: Quản lý phiên có trạng thái (cm session list / resume / cancel)
CodeMender theo dõi mọi tác vụ quét, xác minh và khắc phục dưới dạng một phiên có trạng thái trong cơ sở dữ liệu SQLite cục bộ (~/.codemender/state.db). Chạy cm session list để kiểm tra các phiên của bạn:
cm session list
Kết quả:
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
Bước 2: Chạy cm report để xác minh các kết quả đã khắc phục
Chạy cm report -f table để hiển thị trạng thái mới nhất của kết quả phát hiện (lưu ý rằng kết quả phát hiện đã được khắc phục hiện hiển thị FIXED với ✅ applied trong cột Fix):
cm report -f table
Kết quả:
┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐ │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
Bước 3: Kiểm tra mức sử dụng mã thông báo bằng cm stats
Chạy cm stats để kiểm tra mức tiêu thụ mã thông báo cục bộ trên các chế độ quét (cm find --quick, cm verify và cm fix):
cm stats
Kết quả:
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
Bước 4: Tạo và xem trước báo cáo HTML tương tác (cm report -f html)
Xuất kết quả quét và các bản vá đã áp dụng dưới dạng trang tổng quan HTML độc lập, có tính tương tác:
cm report -f html
cp ~/.codemender/reports/report.html ./report.html
Cách xem report.html trong Google Cloud Shell:
Khởi động máy chủ web xem trước cục bộ trong dòng lệnh Cloud Shell:
python3 -m http.server 8080
Trong thanh công cụ trên cùng bên phải của Cloud Shell, hãy nhấp vào nút Xem trước trên web (biểu tượng có mắt/màn hình) ➔ Xem trước trên cổng 8080 để xem trang tổng quan về việc tuân thủ có tính tương tác trong trình duyệt của bạn.
(Cách khác) Trong trình khám phá tệp của Trình chỉnh sửa Cloud Shell, hãy nhấp chuột phải vào report.html rồi nhấp vào Tải xuống để xem tệp trong trình duyệt cục bộ.
Bước 5: Các tính năng chính của báo cáo HTML tương tác được tạo
Dưới đây là thông tin chi tiết về các thành phần chính của báo cáo HTML tương tác được tạo (report.html):

1. Thẻ trạng thái và tiêu đề chỉ số điều hành
Siêu dữ liệu tiêu đề: Cho biết thông tin chi tiết về kho lưu trữ mục tiêu (OWASP Juice Shop), tổng số tệp nguồn được quét (684 files) và dấu thời gian tạo theo giờ UTC.
Lưới thẻ chỉ số: Cung cấp thông tin tổng quan nhanh chóng và khái quát về tổng số phát hiện, mức độ phân bổ mức độ nghiêm trọng (CRITICAL, HIGH, MEDIUM, LOW) và tổng số lỗ hổng bảo mật đã khắc phục (FIXED).
2. Bảng tóm tắt kết quả tương tác
Ma trận lỗ hổng bảo mật: Hiển thị một bảng có thể lọc chứa ID, Severity, Status (OPEN so với FIXED), CWE Type, File Location, Vulnerability Title và Confidence Score.
3. Phân tích chuyên sâu về nguyên nhân gốc rễ và đoạn mã nguồn dễ bị tấn công
Phân tích có thể thu gọn (RCA): Khi bạn nhấp vào bất kỳ hàng phát hiện nào, thông tin chi tiết về Phân tích nguyên nhân gốc do mô hình suy luận bảo mật của Gemini tổng hợp sẽ mở rộng.
Đoạn mã nguồn có lỗ hổng bảo mật: Hiển thị chính xác số dòng và mã nguồn được làm nổi bật cú pháp xung quanh điểm tiếp nhận có lỗ hổng bảo mật.
4. Sự khác biệt giữa các bản vá khắc phục do AI tổng hợp
Chế độ xem khác biệt hợp nhất: Đối với các lỗ hổng bảo mật đã được khắc phục (FIXED), CodeMender sẽ hiển thị một khối khác biệt hợp nhất, trong đó phần mã xử lý ứng dụng được thêm vào sẽ được làm nổi bật bằng màu xanh lục (+) và phần mã xử lý ứng dụng dễ bị tấn công đã bị xoá sẽ được làm nổi bật bằng màu đỏ (-).
Bước 6: (Không bắt buộc) Nhập kết quả SAST của bên thứ ba (cm report import)
CodeMender không chỉ xử lý những lỗi do trình quét của chính công cụ này phát hiện. Các nhóm có thể nhập kết quả SAST bên ngoài (ví dụ: từ Semgrep, Snyk, SonarQube hoặc Fortify) bằng cách sử dụng giản đồ JSON chuẩn hoá hoặc trình hướng dẫn tương tác, cho phép CodeMender xác minh và tổng hợp các bản sửa lỗi ngay lập tức:
# 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
Kết quả:
Successfully imported 1 findings. 2026-10-22T02:27:10Z [INFO] 📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log
10. Dọn dẹp tài nguyên
⏱️ Thời lượng: 01:00
Để tránh sử dụng ổ đĩa không cần thiết trong môi trường Google Cloud Shell và dọn dẹp tài nguyên tạm thời của hội thảo, hãy làm theo các bước dọn dẹp sau.
Bước 1: Xoá bộ nhớ đệm cục bộ của CodeMender và xoá kho lưu trữ
CodeMender cung cấp lệnh cm clean tích hợp sẵn để xoá cơ sở dữ liệu kết quả cục bộ (~/.codemender/state.db), báo cáo HTML và tệp sao lưu nguồn. Thực thi các lệnh sau trong Cloud Shell:
# Purge local SQLite findings cache, HTML reports, and backup files
cm clean
# Remove cloned repository
cd ~
rm -rf ~/juice-shop
Bước 2: (Không bắt buộc) Tắt các API Google Cloud
Nếu không định sử dụng API CodeMender hoặc Agent Platform trong dự án này để phát triển thêm, bạn có thể tắt các API dịch vụ:
gcloud services disable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=${PROJECT_ID}
11. Xin chúc mừng
⏱️ Thời lượng: 2 phút
Xin chúc mừng! Bạn đã chuyển đổi thành công OWASP Juice Shop từ một ứng dụng có lỗ hổng bảo mật có chủ đích thành một toàn bộ mã nguồn bảo mật, được tăng cường bảo mật bằng cách sử dụng CodeMender trên Nền tảng tác nhân Gemini Enterprise của Google Cloud.
Nội dung bạn đã học
Khắc phục sự cố theo vòng lặp khép kín tự động: CodeMender không chỉ dừng lại ở việc cảnh báo tĩnh thụ động mà còn thực hiện một vòng đời bảo mật hoàn chỉnh, tự định hướng – từ việc phát hiện kho lưu trữ (cm find) đến xác minh lỗ hổng bảo mật trong hộp cát (cm verify) và tổng hợp bản vá đã được kiểm thử hồi quy (cm fix).
Bằng chứng khai thác dựa trên bằng chứng: Bằng cách thu thập các cấu phần phần mềm xác minh hữu hình (PLAN.md, LOG.md, exploit.sh, REPORT.md), CodeMender loại bỏ các kết quả dương tính giả và chứng minh khả năng khai thác trong thực tế trước khi viết bất kỳ mã nào.
Bản sửa lỗi phù hợp với ngữ cảnh và đặc thù: Thay vì áp dụng các thay thế văn bản chung chung, các tác nhân suy luận của Gemini sẽ phân tích cấu trúc ứng dụng, mô hình dữ liệu và ORM để tạo ra các bản vá rõ ràng, dễ bảo trì (chẳng hạn như các truy vấn Sequelize có tham số) giúp giữ nguyên logic kinh doanh hiện có.
Các biện pháp bảo vệ và kiểm thử tích hợp sẵn: Mọi bản sửa lỗi được đề xuất đều được tự động xác thực dựa trên bộ kiểm thử dự án (npm test) và trình kiểm tra kiểu (tsc) bên trong hộp cát không gian làm việc tách biệt trước khi các thay đổi được đưa vào giai đoạn thử nghiệm.
Thay đổi tư duy của nhà phát triển
Quy trình SAST thủ công truyền thống | Tự động khắc phục bằng CodeMender (cm) |
Mệt mỏi vì cảnh báo: Mất nhiều giờ để phân loại các báo cáo gây nhiễu có tỷ lệ dương tính giả cao. | Khám phá mã dựa trên tác nhân ( |
Xác minh PoC thủ công: Tạo tải trọng curl tuỳ chỉnh và tập lệnh tấn công để xác nhận lỗ hổng bảo mật. | Bằng chứng khai thác tự động ( |
Tái cấu trúc thủ công có rủi ro cao: Vá các truy vấn cơ sở dữ liệu phức tạp theo cách thủ công, thường gây ra lỗi cú pháp hoặc lỗi thời gian chạy. | Tổng hợp bản vá theo thành ngữ ( |
Rủi ro hồi quy trong môi trường thực tế: Các bản vá bảo mật thường làm hỏng logic kinh doanh hoặc các bài kiểm thử ở hạ nguồn. | Hàng rào bảo vệ kiểm thử tự động: Xác thực liên tục đối với các bộ kiểm thử cục bộ và hộp cát quy trình tách biệt. |
Tổng hợp thông tin tuân thủ theo cách thủ công: Tổng hợp kết quả theo cách thủ công vào các tài liệu tĩnh để xem xét kiểm tra. | Dữ liệu đo từ xa và SARIF được chuẩn hoá ( |
Các bước tiếp theo
🚀 Tiếp tục khám phá bộ ba video về CodeMender:
Phần 2: Bảo mật quy trình CI/CD bằng CodeMender — Tự động hoá quy trình quét không giao diện người dùng liên tục, tích hợp trang tổng quan SARIF và các yêu cầu tự khắc phục trong GitHub Actions.
Phần 3: Lập trình theo cảm hứng một cách an toàn bằng Antigravity và CodeMender — Kết hợp phát triển AI tạo sinh với trợ lý bảo mật tự động.
📖 Khám phá tài liệu:
Tài liệu về CodeMender trên Google Cloud
Các giải pháp bảo mật của Google Cloud
💡 Áp dụng cho dự án của riêng bạn:
Chạy cm find . và cm fix trên kho lưu trữ Node.js, Python, Go, Java, Rust hoặc C/C++ của riêng bạn!