Bảo mật ứng dụng bằng CodeMender

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, git và 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

Quy trình công việc của Công cụ khắc phục tự động CodeMender

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

Quy trình khắc phục tự động của CodeMender

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

OPEN

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ỏ.

FIXED

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.

DISMISSED

Đượ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.

REOPENED

Một lỗ hổng bảo mật đã được FIXED hoặc DISMISSED trước đó được phát hiện lại trong lần quét sau (cho thấy sự hồi quy mã).

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

info.yaml

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 (CRITICAL), độ tin cậy (certain) và thẻ CWE (cwe-89) của kết quả.

PLAN.md

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.

LOG.md

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ử.

server_runner.js/server.log

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ủ.

exploit.sh

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.

REPORT.md

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ú ý

info.yaml

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ư cwe-89.

PLAN.md

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.

LOG.md

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.

exploit.sh

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 EXPLOIT SUCCESSFUL).

server_runner.js/server.log

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ủ đó.

REPORT.md

Phân tích nguyên nhân gốc: dòng dễ bị tấn công trong routes/login.ts, lý do có thể khai thác được và cách khắc phục được đề xuất (truy vấn có tham số).

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

Tổng quan về Trang tổng quan tuân thủ bảo mật của CodeMender

1. Thẻ trạng thái và tiêu đề chỉ số điều hành

Thẻ trạng thái và tiêu đề chỉ số điều hành của CodeMenderSiê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

Bảng tóm tắt kết quả của CodeMenderMa 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ăn nguyên và đoạn mã của CodeMenderPhâ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

Sự khác biệt giữa bản vá khắc phục được tổng hợp bằng CodeMenderChế độ 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 (cm find .): Quét kho lưu trữ sâu, nhận biết theo bối cảnh, dựa trên các mô hình Gemini.

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 (cm verify ): Tự động tổng hợp các kế hoạch xác thực, nhật ký và tập lệnh shell có thể thực thi.

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ữ (cm fix ): Tạo khác biệt theo bối cảnh, phù hợp với các tiêu chuẩn khung và ORM hiện có.

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á (cm report -f sarif): Xuất ngay lập tức OASIS SARIF phiên bản 2.1.0, trang tổng quan HTML và số liệu phân tích mã thông báo.

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!