ایمن کردن برنامه با CodeMender

۱. قبل‌از شروع

⏱️ مدت: ۰۳:۰۰

به codelab عملی برای ایمن‌سازی برنامه با CodeMender در پلاتفرم Gemini Enterprise Agent در Google Cloud خوش آمدید.

در این کارگاه، شما در نقش یک مهندس امنیت ابری قرار می‌گیرید که وظیفه دارد OWASP Juice Shop را ممیزی و ایمن کند—یک برنامه وب استاندارد صنعتی که به‌طور عمدی آسیب‌پذیر ساخته شده و با Node.js،‏ Express،‏ TypeScript، و Angular توسعه یافته است.

ابزارهای سنتی اسکن امنیتی (SAST/DAST) تیم‌های توسعه را با هزاران یافته امنیتی ایستا، نرخ‌های مثبت کاذب بالا، و صفر اصلاح کد قابل‌اجرا غرق می‌کنند. توسعه‌دهندگان ساعت‌ها وقت صرف اولویت‌بندی گزارش‌ها، ردیابی جریان‌های داده، و نوشتن دستی وصله‌هایی می‌کنند که اغلب رفتار برنامه موجود را مختل می‌کند.

CodeMender با پیچیدن یک زیرساخت عامل تنظیم‌شده در اطراف مدل‌های زبانی بزرگ Gemini از Google، امنیت کد را متحول می‌کند. CodeMender بااستفاده از پیام‌واره‌های مهندسی‌شده Google DeepMind، مهارت‌های امنیتی تخصصی، و هماهنگ‌سازی چندعاملی، به‌عنوان یک «توسعه‌دهنده مشترک امنیتی هوش مصنوعی» مستقل عمل می‌کند که آسیب‌پذیری‌های نرم‌افزاری را مستقیماً در مخازن منبع محلی پیدا، تأیید، و اصلاح می‌کند.

پیش‌نیازها

  • درک اولیه از آسیب‌پذیری‌های برنامه وب (OWASP Top 10، مانند تزریق SQL و XSS)
  • آشنایی پایه با برنامه‌های JavaScript/TypeScript و Node.js
  • آشنایی اولیه با ابزارهای میانای خط فرمان (CLI)

آنچه خواهید آموخت

  • نحوه راه‌اندازی، اصالت‌سنجی، و مقداردهی اولیه CodeMender (cm) CLI در Google Cloud Shell.
  • نحوه اسکن خودکار مخزن برای کشف آسیب‌پذیری‌های قابل‌سوءاستفاده (cm find).
  • نحوه اعتبارسنجی آسیب‌پذیری‌ها در جعبه‌های شنی مجزا و بازرسی کردن مصنوعات درستی‌سنجی (cm verify).
  • نحوه ترکیب، آزمایش، و اعمال خودکار وصله‌های امنیتی متناسب با بافتار (cm fix).
  • نحوه ممیزی کردن دورسنجی توکن و صادر کردن گزارش‌های رعایت مقررات چندقالبی (cm stats، cm report).

آنچه نیاز دارید

  • پروژه Google Cloud با صورت‌حساب فعال‌شده
  • Google Cloud Shell با اتصال پروژه فعال (شامل gcloud، git، و Node.js 18+‎ ازپیش نصب‌شده)
  • مخزن آغازگر: مخزن OWASP Juice Shop GitHub

۲. مقدمه‌ای بر معماری CodeMender

⏱️ مدت: ۰۴:۰۰

قبل‌از اینکه به اسکن و اصلاح کد بپردازیم، بیایید ببینیم CodeMender چگونه طبق استانداردهای رسمی معماری Google Cloud در «پلاتفرم عامل Gemini Enterprise» عمل می‌کند.

معماری سیستم: عامل و دیمون کارخواه

CodeMender Autonomous Remediation Engine Workflow

از دیدگاه کاربر، CodeMender از دو مؤلفه معماری اصلی تشکیل شده است:

پلاتفرم چندعاملی میزبانی‌شده: سیستم چندعاملی میزبانی‌شده‌ای که روی Google Cloud اجرا می‌شود و منطق کسب‌وکار امنیتی اصلی، مهندسی پیام‌واره مدل زبانی بزرگ، و استدلال امنیتی را اجرا می‌کند.

رابط خط فرمان کارخواه محلی و Daemon جعبه امن (cm): کارخواهی که در Google Cloud Shell اجرا می‌شود و هم به‌عنوان رابط خط فرمان (برای صدور فرمان‌هایی مثل cm find، cm verify، cm fix) و هم به‌عنوان daemon محلی (برای اجرای ایمن فرمان‌ها ازطرف عامل در جعبه امن سطح فرایند مجزا) عمل می‌کند.

‫۳ قابلیت اصلی اصلاح

جریان اصلاح خودکار CodeMender

CodeMender امنیت کد را ازطریق سه مرحله یکپارچه مدیریت می‌کند:

یافتن آسیب‌پذیری‌ها (cm find): پایگاه‌های کد را بااستفاده از «مدل زبانی بزرگ» تحت هدایت عامل اسکن می‌کند و از ابزارهای امنیتی تخصصی و مهندسی پیام‌واره برای متمرکز کردن مدل روی نقص‌های امنیتی بهره می‌برد. (یا می‌توان یافته‌ها را از ابزارهای اسکن امنیتی خارجی وارد کرد).

درستی‌سنجی آسیب‌پذیری‌ها (cm verify): کد را به‌صورت محلی می‌سازد و تلاش می‌کند از نقص‌های کشف‌شده سوءاستفاده کند تا بررسی کند که آیا قابل‌سوءاستفاده هستند یا نه. این کار موارد مثبت کاذب را حذف می‌کند و مصنوعات درستی‌سنجی فضای کاری دائمی در .exploit/ (info.yaml، PLAN.md، LOG.md، exploit.sh، REPORT.md) ایجاد می‌کند.

رفع آسیب‌پذیری‌ها (cm fix): وصله‌های منبع آگاه از زبان را ترکیب می‌کند و آن‌ها را با اجرای مجموعه‌های آزمون رگرسیون و ساخت پروژه (npm test) در جعبه امن محلی تأیید می‌کند.

۳. راه‌اندازی محیط OWASP Juice Shop

⏱️ مدت: ۰۵:۰۰

در این مرحله، محیط پایانه Google Cloud را باز می‌کنید و مخزن برنامه هدف را واکشی می‌کنید.

مرحله ۱: باز کردن Cloud Shell در کنسول Google Cloud

در مرورگرتان به کنسول Google Cloud بروید.

در نوار پیمایش بالا، روی دکمه فعال کردن Cloud Shell (نماد >_) کلیک کنید.

‫Cloud Shell یک پایانه Linux مبتنی بر مرورگر با gcloud،‏ git، و Node.js ازپیش نصب‌شده و اصالت‌سنجی‌شده ارائه می‌دهد.

مرحله ۲: کلون کردن مخزن OWASP Juice Shop

در Cloud Shell یا پایانه محلی، مخزن OWASP Juice Shop را شبیه‌سازی کنید:

git clone https://github.com/juice-shop/juice-shop.git --depth 1
cd juice-shop

مرحله ۳: بررسی فایل‌های کلیدی برنامه

OWASP Juice Shop از Express.js در پس‌زمینه با ماژول‌های TypeScript استفاده می‌کند. نگاهی سریع به ساختار فهرست راهنما بیندازید:

ls -la routes/ lib/

به فایل‌های مسیر کلیدی که اصالت‌سنجی، پُرسمان‌های کاربر، و مدیریت سبد خرید را انجام می‌دهند توجه کنید:

routes/login.ts: اصالت‌سنجی کاربر و اجرای پُرسمان SQL خام را مدیریت می‌کند.

‫routes/search.ts: جستجوی محصول و ارائه پاسخ را مدیریت می‌کند.

‫routes/basket.ts: بازیابی سبد خرید کاربر را مدیریت می‌کند.

routes/trackOrder.ts: پیگیری سفارش را ازطریق پُرسمان‌های NoSQL مدیریت می‌کند.

lib/xml.ts: تجزیه XML و بارگذاری فایل را مدیریت می‌کند.

‫lib/insecurity.ts: برنامه‌های کمکی برای کد جلسه و رمزگذاری.

۴. نصب CodeMender CLI (cm) و اصالت‌سنجی اعتبارنامه‌های GCP

⏱️ مدت: ۰۸:۰۰

در این مرحله، Google Cloud APIهای لازم را فعال می‌کنید، بااستفاده از gcloud اجازه‌های IAM را اعطا می‌کنید، فایل دودویی cm CLI را بارگیری و نصب می‌کنید، و «اعتبارنامه‌های پیش‌فرض برنامه» (ADC) را پیکربندی می‌کنید.

مرحله ۱: میاناهای برنامه‌سازی کاربردی Google Cloud موردنیاز را ازطریق gcloud فعال کنید

CodeMender به Agent Platform API (aiplatform.googleapis.com) و Cloud Resource Manager API (cloudresourcemanager.googleapis.com) در Gemini Enterprise Agent Platform نیاز دارد.

در Cloud Shell یا پایانه خود، «شناسه پروژه» فعال خود را بازیابی کنید (یا منو کرکره‌ای پروژه را در بالای «کنسول Google Cloud» بررسی کنید) و میاناهای برنامه‌سازی کاربردی سرویس موردنیاز را فعال کنید:

# 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}

بررسی کنید که میاناهای برنامه‌سازی کاربردی فعال باشند:

gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"

مرحله ۲: اعطای اجازه‌های IAM ازطریق gcloud

برای تعامل با موتور استدلال ابری CodeMender، کاربران و حساب‌های سرویس باید نقش IAM roles/aiplatform.user (Agent Platform User) را داشته باشند.

اعطای نقش «مدیریت هویت و دسترسی» به حساب کاربری ازطریق 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"

مرحله ۳: بارگیری و نصب cm CLI در Cloud Shell

در Google Cloud Shell، داده‌های کاربر به‌طور دائم در فهرست راهنمای $HOME شما ذخیره می‌شود. فرمان‌های زیر را اجرا کنید تا cm را بدون نیاز به sudo در ~/bin نصب کنید. هنوز در ~/juice-shop از بخش قبلی هستید، بنابراین فرمان‌ها در دایرکتوری موقت بارگیری می‌شوند و سپس آن را پاک می‌کنند. به‌این‌ترتیب، هیچ فایل نصب‌کننده‌ای در مخزن Juice Shop قرار نمی‌گیرد:

# Download into a temporary directory so nothing lands in the Juice Shop repository
CM_TMP=$(mktemp -d)
curl -L -o "${CM_TMP}/cm-linux-amd64.zip" "https://artifactregistry.googleapis.com/download/v1/projects/cmoc-prod/locations/us/repositories/codemender-cli-production/files/cm:stable:cm-linux-amd64.zip:download?alt=media"
unzip -o "${CM_TMP}/cm-linux-amd64.zip" -d "${CM_TMP}"

# Install into your persistent ~/bin directory and clean up
mkdir -p ~/bin
install -m 0755 "${CM_TMP}/cm" ~/bin/cm
rm -rf "${CM_TMP}"

# Add ~/bin to PATH for this session and future Cloud Shell sessions
export PATH="$HOME/bin:$PATH"
grep -qxF 'export PATH="$HOME/bin:$PATH"' ~/.bashrc || echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc

مرحله ۴: درستی‌سنجی cm نصب CLI

cm --version را اجرا کنید تا مطمئن شوید که باینری CLI به‌درستی نصب شده است:

cm --version

خروجی موردانتظار:

cm version 0.17.0

مرحله ۵: پیکربندی «اعتبارنامه‌های پیش‌فرض برنامه» (ADC) در Google Cloud

«اطلاعات اعتباری پیش‌فرض برنامه Google Cloud»‏ (ADC) را پیکربندی کنید تا cm بتواند درخواست‌های ارسال‌شده به موتور استدلال ابری را اصالت‌سنجی کند:

gcloud auth application-default login

کادر گفتگوی مدال مجوزی با برچسب مجاز کردن Cloud Shell ظاهر خواهد شد. برای اعطای دسترسی، روی مجاز کردن کلیک کنید.

۵. مقداردهی اولیه و درستی‌سنجی فضای کاری CodeMender

⏱️ مدت: ۰۳:۰۰

اکنون که cm نصب و اصالت‌سنجی شده است، فضای کاری CodeMender را در دایرکتوری پروژه هدف مقداردهی اولیه خواهید کرد و راه‌اندازی محیط خود را درستی‌سنجی خواهید کرد.

مرحله ۱: مقداردهی اولیه فضای کاری CodeMender (cm init)

cm init را از ریشه فهرست راهنمای پروژه خود اجرا کنید تا فایل‌های ردیابی وضعیت محلی را مقداردهی اولیه کنید و پیکربندی‌های پایه را ایجاد کنید:

cm init

خروجی:

✅ Initialized CodeMender workspace at /home/user/.codemender

مرحله ۲: اجرای عیب‌یابی سلامت سرتاسری (cm health)

پیش‌از راه‌اندازی جلسه نماینده، cm health را اجرا کنید تا اعتبارنامه‌ها، پیکربندی، دسترس‌پذیری، و مجوز شما تأیید شود:

cm health

خروجی:

CodeMender Health Check
───────────────────────
 Backend:   iapi
 Endpoint:  https://aiplatform.googleapis.com
 Location:  global
 Project:   my-gcp-project

 ✓ credentials     passed   (0ms)  Token acquired for project "my-gcp-project"
 ✓ config          passed   (0ms)  Configuration valid (backend "iapi")
 ✓ reachability    passed   (250ms)  Endpoint https://aiplatform.googleapis.com responded
 ✓ authorization   passed   (68ms)  Caller authorized for project "my-gcp-project"

Status: HEALTHY (exit code 0, 319ms)

مرحله ۳: درک پارامترهای پیکربندی (config.yaml)

CodeMender یک فایل پیکربندی فضای کاری در .codemender/config.yaml (یا ~/.codemender/config.yaml) ایجاد می‌کند. این فایل مرزهای خط‌مشی، قوانین گنجاندن فایل، و قلاب‌های درستی‌سنجی آزمایش را تعریف می‌کند:

# CodeMender CLI configuration.
# The server endpoint is baked in at build time (see build profiles).
# Override it here only if you need a different endpoint.

server: {}
location: "global"         # Service location: "global" (default), "us", "eu", or "us-central1" (overridden by $CM_LOCATION)

# Customer-supplied team identifier sent as the X-CodeMender-Team-Id
# telemetry header. Overridden by --team-id flag or $CM_TEAM_ID env var.
# Max 63 chars, must match [A-Za-z0-9._-]. Omit to skip the header.
# team_id: "acme-security"

scan:
 extensions:
   include: [".py", ".java", ".go", ".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".c", ".cc", ".cpp", ".cxx", ".h", ".hh", ".hpp", ".hxx", ".inl", ".ipp", ".cs", ".rs", ".kt", ".kts", ".rb", ".php", ".sol", ".tf", ".hcl"]
   exclude: [".min.js", ".generated.go", ".pb.go"]
 # A leading "/" matches only that directory at the scan root.
 exclude_dirs: ["node_modules", "vendor", "dist", "/target", "/obj", "/build", ".gradle"]
 max_file_size_kb: 2048   # Maximum file size for discovery (2048 KB / 2 MiB)
 incremental: true

# Restrict agent file access to these directories (all commands).
# When empty, the scan target directory is used as the boundary.
# project_paths: []

output:
 format: table   # "table", "json", "sarif"

tools:
 confirm_commands: true   # Prompt Y/N before running shell commands (default: true)
 confirm_writes: true     # Prompt Y/N before writing/modifying files (default: true)
 # cleanup_candidate_branches: true # Auto-delete temporary candidate branches on completion (default: true)
 # Use --yes flag on find/fix/session resume to skip all confirmations

# Version Control and Automated Testing Guardrails
vcs:
 type: ""               # VCS type: "git", "mercurial", "custom", or "" (auto-detect)
 commands:
   reset: ""            # Shell command to reset codebase (auto-populated for known VCS)
   diff: ""             # Shell command to show changes (auto-populated for known VCS)
   status: ""           # Shell command to list modified files (auto-populated for known VCS)
   stage: ""            # Shell command to stage changes (auto-populated for known VCS)

build:
 command: "npm test"    # Shell command to build/verify changes from the agent

sandbox:
 enabled: true          # Process-level OS sandbox (default: true)
 mounts:
   target_dir: "."
 network:
   profile: "permissive-closed" # Complete network isolation; set to "permissive-open" if build requires internet
security:
 protected_files: []    # Files mounted read-only inside sandbox (e.g. ["~/.ssh/*"])

‫۶. آسیب‌پذیری‌ها را با cm find کاوش کنید .

⏱️ مدت: ۰۷:۰۰

در این مرحله، cm find . --quick را اجرا خواهید کرد تا اسکن امنیتی عاملی را در سراسر پایگاه کد Juice Shop اجرا کنید.

مرحله ۱: cm find . --quick را اجرا کنید

از CodeMender نسخه ۰.۱۶.۰، cm find <path> به‌طور پیش‌فرض روی اسکن عمیق ( تنظیم شده است

--deep

) برای تجزیه‌وتحلیل جامع فایل‌به‌فایل، درحالی‌که اسکن سریع (

--quick

) اولویت‌بندی سریع مخزن را ارائه می‌دهد. cm find . --quick را اجرا کنید تا «اسکن سریع» در سراسر مخزن OWASP Juice Shop انجام شود (زمان اجرای تخمینی: حدود ۸ دقیقه برای تریاژ کامل پایگاه کد ۶۸۴ فایلی):

cm find . --quick -y --sandbox=false --bypass-warning --model gemini-3.8-flash

‫cm یک جلسه اسکن را در پلاتفرم Gemini Enterprise Agent راه‌اندازی می‌کند و فایل‌های کد منبع را در همه ماژول‌های مخزن تجزیه‌وتحلیل می‌کند:

⚠️ 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

مرحله ۲: مرور یافته‌های اسکن ازطریق cm report

cm report -f table را اجرا کنید تا همه یافته‌های امنیتی کشف‌شده از پایگاه داده وضعیت SQLite محلی نمایش داده شود:

cm report -f table

خروجی:

┌──────────┬───────────┬──────┬───┬──────────────────────────────┬────────────────────────────────────────┐
│ID        │Severity   │Status│Fix│File                          │Title                                   │
├──────────┼───────────┼──────┼───┼──────────────────────────────┼────────────────────────────────────────┤
│ 43aa7446 │🔴 CRITICAL│OPEN  │—  │routes/login.ts               │SQL Injection in User Login Handler A...│
│ dd83d0a4 │🟠 HIGH    │OPEN  │—  │routes/search.ts              │UNION-Based SQL Injection in Product ...│
│ 4dfe2409 │🟠 HIGH    │OPEN  │—  │routes/userProfile.ts         │Remote Code Execution via Eval in Use...│
│ 79d490b0 │🟠 HIGH    │OPEN  │—  │routes/fileUpload.ts          │Path Traversal (Zip Slip) in Zip File...│
│ 4f2b050c │🟠 HIGH    │OPEN  │—  │routes/fileUpload.ts          │XML External Entity (XXE) Injection i...│
│ 1ece0e25 │🟠 HIGH    │OPEN  │—  │server.ts                     │Missing Authorization on Product Upda...│
│ 757fd438 │🟠 HIGH    │OPEN  │—  │routes/trackOrder.ts          │NoSQL / JavaScript Injection in Order...│
│ 349bac9f │🟡 MEDIUM  │OPEN  │—  │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│
│ be5e1459 │🟡 MEDIUM  │OPEN  │—  │routes/redirect.ts            │Open Redirect via Inadequate Allowlis...│
│ 06ecf8a5 │🟡 MEDIUM  │OPEN  │—  │routes/basket.ts              │Insecure Direct Object Reference (IDO...│
│ 02f6a293 │🟡 MEDIUM  │OPEN  │—  │routes/dataErasure.ts         │Local File Read via Insecure Template...│
│ 95ee59a3 │🟡 MEDIUM  │OPEN  │—  │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│
└──────────┴───────────┴──────┴───┴──────────────────────────────┴────────────────────────────────────────┘

12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 0 fixed, 🔴 12 open
📋 Report generated at 2026-10-29 03:10:05 UTC
2026-10-29T03:10:05Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T031005Z_pending.log

مرحله ۳: درک کردن وضعیت‌های چرخه حیات یافته‌ها و سطوح شدت

CodeMender آسیب‌پذیری‌ها را ازطریق یک چرخه حیات رسمی چهارحالته ردیابی می‌کند:

درحال پیدا کردن حالت

مدیریت معنی و انتقال

OPEN

آسیب‌پذیری کشف (یا وارد) شده است اما هنوز درستی‌سنجی، وصله، یا رد نشده است.

FIXED

CodeMender وصله‌ای تولید کرده، تفاوت را اعمال کرده، و تأیید کرده است که مجموعه‌های ساخت/آزمون با موفقیت انجام می‌شوند و بهره‌جویی‌ها ناموفق هستند.

DISMISSED

به‌دلیل اطمینان پایین، خارج از مدل تهدید، یا تأیید به‌عنوان مثبت کاذب، غیرفعال علامت‌گذاری شده است. هشدارهای بعدی را بی‌صدا می‌کند.

REOPENED

نقص FIXED یا DISMISSED که قبلاً وجود داشته است در اسکن بعدی دوباره شناسایی شده است (که نشان‌دهنده پس‌رفت کد است).

طبقه‌بندی‌های شدت

🔴 CRITICAL: خطر فوری و شدید (برای مثال، «اجرای کد از راه دور»، «تزریق SQL» تأییدنشده) که مستقیماً از مرزهای غیرقابل‌اعتماد قابل‌دسترسی است.

🟠 HIGH: نقص شدید (مثلاً خواندن پایگاه داده دلخواه، ارتقای امتیاز) که به بافت کاربر خاص یا شرایط زنجیره‌ای نیاز دارد.

🟡 MEDIUM: خطر متوسط با دامنه محدود یا نیازمند تعامل کاربر (مثلاً «تغییر مسیر باز»، «جعل درخواست بین‌سایتی»).

🔵 LOW: نقص‌های بهداشتی دفاع در عمق یا بردارهای شناسایی با حداقل تأثیر مستقیم.

‫۷. درستی‌سنجی آسیب‌پذیری‌ها و بررسی گام‌به‌گام مصنوعات درستی‌سنجی ضبط‌شده

⏱️ مدت: ۱۰:۰۰

یکی از ویژگی‌های کلیدی CodeMender تولید خودکار ساخته‌های درستی‌سنجی پایدار در هر بار اجرای cm verify است. بیایید یافته «تزریق SQL بحرانی» را در routes/login.ts (که در این آموزش به‌صورت 43aa7446 نشان داده شده است) درستی‌سنجی کنیم و مصنوعات ایجادشده توسط عامل را بررسی کنیم.

مرحله ۱: اجرای cm verify <login-finding-id>

شناسه یافته مربوط به routes/login.ts را در جدول cm report پیدا کنید (برای مثال، 43aa7446)، و cm verify <finding-id> --sandbox=false --bypass-warning -y را اجرا کنید (زمان اجرای تخمینی: حدود ۲۰ دقیقه برای اجرای مراحل ابزار خودکار، شروع سرویس‌های پس‌زمینه‌ای، و اجرای اسکریپت‌های بهره‌برداری اثبات مفهوم زنده):

# Replace 43aa7446 with your actual login.ts finding ID
# --sandbox=false turns off only the OS-level sandbox; the path boundary and command policy stay enforced
cm verify 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash

خروجی:

⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🔬 Verifying finding: SQL Injection in User Login Handler Allows Authentication Bypass
  ID: 43aa7446-40de-467d-8ca4-8571dca16036
  File: /home/user/juice-shop/routes/login.ts
  Severity: 🔴 CRITICAL
  Type: SQL INJECTION
Resetting workspace at /home/user/juice-shop

🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project

✅ Reset complete. Ready for vulnerability research.
🚀 Starting VERIFY session...
  Server: https://aiplatform.googleapis.com
  Session: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
  Operation: ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
📂 Scan target: /home/user/juice-shop/routes
🔒 Sandbox boundary (agent can explore within):
  • /home/user/juice-shop

📡 Waiting for verification agent (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:11:31Z [INFO]  🔧 [Step 1] run_command → mkdir -p /home/user/juice-shop/.exploit
2026-10-29T03:11:42Z [INFO]  🔧 [Step 2] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:12:03Z [INFO]  🔧 [Step 4] read_file → .../juice-shop/package.json
2026-10-29T03:12:14Z [INFO]  🔧 [Step 5] write_to_file → .../juice-shop/.exploit/PLAN.md
2026-10-29T03:19:00Z [INFO]  🔧 [Step 25] run_command → npm run build:server
2026-10-29T03:29:20Z [INFO]  🔧 [Step 61] write_to_file → .../juice-shop/.exploit/info.yaml
2026-10-29T03:29:53Z [INFO]  🔧 [Step 63] write_to_file → .../juice-shop/.exploit/LOG.md
2026-10-29T03:30:17Z [INFO]  🔧 [Step 64] write_to_file → .../juice-shop/.exploit/REPORT.md
2026-10-29T03:30:55Z [INFO]  🔧 [Step 66] run_command → git status --short
2026-10-29T03:31:46Z [INFO]  ✅ Completed 66 tool steps in 20m23s | Tokens: 2.8M in / 7k out / 2.8M total
────────────────────────────────────────────────────────────
2026-10-29T03:31:46Z [INFO]  Artifacts manifest written: /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu/manifest.json (7 artifacts)
📦 Captured 7 agent artifacts in /home/user/.codemender/artifacts/ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Resetting workspace at /home/user/juice-shop

🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project
Removing .exploit/LOG.md
Removing .exploit/PLAN.md
Removing .exploit/REPORT.md
Removing .exploit/exploit.sh
Removing .exploit/info.yaml
Removing .exploit/server_runner.js

✅ Reset complete. Ready for vulnerability research.
📥 Copying 7 finding artifact(s) to workspace...
  • /home/user/juice-shop/.exploit/LOG.md
  • /home/user/juice-shop/.exploit/PLAN.md
  • /home/user/juice-shop/.exploit/REPORT.md
  • /home/user/juice-shop/.exploit/exploit.sh
  • /home/user/juice-shop/.exploit/info.yaml
  • /home/user/juice-shop/.exploit/server.log
  • /home/user/juice-shop/.exploit/server_runner.js

🚀 Programmatically running exploit script to confirm: /home/user/juice-shop/.exploit/exploit.sh
EXPLOIT SUCCESSFUL

✅ Exploit execution succeeded. Finding VERIFIED (confidence: 100%)

Run 'cm report' to see updated findings.
2026-10-29T03:31:52Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T031121Z_ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu.log

مرحله ۲: نمای کلی از مدارک درستی‌سنجی ضبط‌شده

از CodeMender نسخه ۰.۱۶.۰، مصنوعات درستی‌سنجی در ریشه مخزن تحت .exploit/ استانداردسازی می‌شوند، درحالی‌که یک نسخه دائمی در ~/.codemender/artifacts/<session-id>/ حفظ می‌شود. این‌ها فایل‌های کاری محلی هستند و بخشی از اصلاحیه شما نیستند، بنابراین قبل‌از آماده‌سازی وصله در بخش بعدی، آن‌ها را از Git مستثنی خواهید کرد. ls -la .exploit/ را اجرا کنید تا آن‌ها را فهرست کنید:

ls -la .exploit/

خروجی:

total 40
drwxrwxr-x  2 user user 4096 Oct 29 03:31 .
drwxrwxr-x 35 user user 4096 Oct 29 03:31 ..
-rwxr-xr-x  1 user user 3272 Oct 29 03:31 exploit.sh
-rw-r--r--  1 user user  313 Oct 29 03:31 info.yaml
-rw-r--r--  1 user user 2196 Oct 29 03:31 LOG.md
-rw-r--r--  1 user user  771 Oct 29 03:31 PLAN.md
-rw-r--r--  1 user user 6387 Oct 29 03:31 REPORT.md
-rw-rw-r--  1 user user 2438 Oct 29 03:31 server.log
-rw-rw-r--  1 user user  462 Oct 29 03:31 server_runner.js

فایل داده‌های جلسه

دسته

هدف

info.yaml

مانیفست فراداده

YAML ساختاریافته که شناسه UUID، عنوان، شدت (CRITICAL)، اطمینان (certain)، و برچسب‌های CWE‏ (cwe-89) یافته را تعریف می‌کند.

PLAN.md

راهبرد عامل

طرح درستی‌سنجی گام‌به‌گام و بازبینه که به‌طور خودکار توسط موتور استدلال CodeMender اجرا می‌شود.

LOG.md

گزارش ردیابی اجرا

رد ممیزی مُهرزمان‌دار که هر فراخوانی ابزار، نقطه پایانی درخواست HTTP، و نتیجه آزمایش را ثبت می‌کند.

‫server_runner.js از server.log

Helper Runner / Server Log

اسکریپت کمکی که نماینده برای شروع Juice Shop برای آزمایش ایجاد کرده است، و برونداد سرور ضبط‌شده.

exploit.sh

پوشاننده اجرا / اثبات مفهوم مستقل

پوشاننده اسکریپت پوسته که سرویس هدف را راه‌اندازی می‌کند و کارخواه PoC را فراخوانی می‌کند، پاسخ‌های HTTP 200 را اعتبارسنجی می‌کند.

REPORT.md

تحلیل علت ریشه‌ای

خلاصه اجرایی، تجزیه‌وتحلیل آسیب‌پذیری خط‌به‌خط، تفکیک SQL خام، و توصیه‌های پارامترسازی Sequelize.

مرحله ۳: راهنمای گام‌به‌گام عمیق از نکات برجسته مصنوع درستی‌سنجی

نماینده این مصنوعات را در هر اجرا به‌صورت تازه می‌نویسد، بنابراین محتوای دقیق آن‌ها هر بار متفاوت است. آن‌ها را در «ویرایشگر Cloud Shell» (یا با cat) باز کنید و به‌دنبال موارد زیر بگردید:

مصنوع

به‌دنبال چه چیزی باید گشت

info.yaml

شناسه کامل، عنوان، شدت، اطمینان، و برچسب‌های یافته، مثل cwe-89.

PLAN.md

بازبینه‌ای که نماینده دنبال کرده است، از خواندن فایل گزارش‌شده تا نوشتن اسکریپت بازتولید.

LOG.md

کنش‌ها و نتایج دارای مُهر زمان، ازجمله نتیجه هر اجرای متن بازتولید.

exploit.sh

اسکریپت بازتولید مستقل: نحوه شروع برنامه، نقطه پایانی هدف، و نحوه تصمیم‌گیری درباره موفقیت (EXPLOIT SUCCESSFUL را چاپ می‌کند).

‫server_runner.js از server.log

فایل‌های کمکی که عامل برای شروع Juice Shop برای آزمایش ایجاد کرده است، و خروجی آن سرور.

REPORT.md

تحلیل علت ریشه‌ای: خط آسیب‌پذیر در routes/login.ts، دلیل قابل‌سوءاستفاده بودن آن، و اصلاحیه توصیه‌شده (پرسمان‌های پارامترشده).

‫۸. اصلاح تزریق SQL با اصلاح cm

⏱️ مدت: ۱۰:۰۰

اکنون که یافته تزریق SQL را در routes/login.ts (شناسه نمونه 43aa7446) درستی‌سنجی کرده‌ایم و آرتیفکت‌های آن را بررسی کرده‌ایم، بیایید cm fix را اجرا کنیم تا وصله پُرسمان پارامتری‌شده خودکار را اعمال کنیم.

مرحله ۱: اجرای cm fix <login-finding-id> -y

cm fix <finding-id> --sandbox=false --bypass-warning -y را اجرا کنید (43aa7446 را با شناسه یافته ورود به سیستم واقعی خود از cm report جایگزین کنید) تا اصلاحیه‌ای را ترکیب و اعمال کنید:

# Replace 43aa7446 with your actual login.ts finding ID
cm fix 43aa7446 --sandbox=false --bypass-warning -y --model gemini-3.8-flash

خروجی:

⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🩹 Fixing finding: SQL Injection in User Login Handler Allows Authentication Bypass
  File: /home/user/juice-shop/routes/login.ts
  Severity: CRITICAL
🔒 Sandbox roots (agent can only access these directories):
  • /home/user/juice-shop
Found latest VERIFY session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu for finding 43aa7446-40de-467d-8ca4-8571dca16036
Pulling artifacts for session ChBkZTRhMWU3YTI4MjU5ZDY0EAgaAmU4KgRtYWlu
Resetting workspace at /home/user/juice-shop

🔧 Running: git checkout HEAD -- . && git clean -fd
Removing .cm_project
Removing .exploit/LOG.md
Removing .exploit/PLAN.md
Removing .exploit/REPORT.md
Removing .exploit/exploit.sh
Removing .exploit/info.yaml
Removing .exploit/server_runner.js

✅ Reset complete. Ready for vulnerability research.
📥 Copying 7 finding artifact(s) to workspace...
  • /home/user/juice-shop/.exploit/LOG.md
  • /home/user/juice-shop/.exploit/PLAN.md
  • /home/user/juice-shop/.exploit/REPORT.md
  • /home/user/juice-shop/.exploit/exploit.sh
  • /home/user/juice-shop/.exploit/info.yaml
  • /home/user/juice-shop/.exploit/server.log
  • /home/user/juice-shop/.exploit/server_runner.js
  Session: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu
  Operation: ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu

📡 Waiting for fix agent (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:41:30Z [INFO]  🔧 [Step 4] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:41:58Z [INFO]  🔧 [Step 6] run_command → npm run test:server
2026-10-29T03:43:11Z [INFO]  🔧 [Step 9] grep_search → pattern="sequelize\\.query" path=.../juice-shop/routes
2026-10-29T03:43:54Z [INFO]  🔧 [Step 12] read_file → .../juice-shop/routes/vulnCodeSnippet.ts
2026-10-29T03:44:41Z [INFO]  🔧 [Step 13] read_file → .../juice-shop/routes/vulnCodeFixes.ts
2026-10-29T03:53:14Z [INFO]  🔧 [Step 31] search_and_replace → .../juice-shop/routes/login.ts
2026-10-29T03:53:52Z [INFO]  🔧 [Step 33] run_command → npm run build:server
2026-10-29T03:55:23Z [INFO]  🔧 [Step 37] run_command → npm run test:server
2026-10-29T03:55:49Z [INFO]  🔧 [Step 38] run_command → git diff
2026-10-29T03:57:18Z [INFO]  ✅ Completed 43 tool steps in 16m54s | Tokens: 1.6M in / 4k out / 1.6M total
────────────────────────────────────────────────────────────

✨ Patch generated successfully!

diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {

  return (req: Request, res: Response, next: NextFunction) => {
    verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
-    models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+    models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+      replacements: {
+        email: typeof req.body?.email === 'string' ? req.body.email : '',
+        password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+      },
+      model: UserModel,
+      plain: true
+    }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
      .then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
        const user = utils.queryResultToJson(authenticatedUser)
        if (user.data?.id && user.data.totpSecret !== '') {

────────────────────────────────────────────────────────────
2026-10-29T03:57:18Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T034021Z_ChA0YjllNzFkMTgyM2JmZDQ0EAgaAjdiKgRtYWlu.log

مرحله ۲: بررسی وضعیت VCS و تفاوت بااستفاده از cm vcs

cm vcs status و cm vcs diff را اجرا کنید تا فایل‌های فضای کاری اصلاح‌شده را ببینید:

cm vcs status
cm vcs diff

خروجی:

📂 CodeMender VCS Status
──────────────────────────────────────────────────
  Directory: /home/user/juice-shop
  Command:   git status --short
──────────────────────────────────────────────────

M routes/login.ts
?? .cm_project
?? .exploit/
2026-10-29T03:59:47Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T035947Z_pending.log

دو ورودی ردیابی‌نشده فایل‌های محلی CodeMender هستند و بخشی از اصلاحیه نیستند: .exploit/ حاوی داده‌های جلسه درستی‌سنجی از cm verify است و .cm_project ریشه پروژه را برای CodeMender علامت‌گذاری می‌کند. در مرحله بعد، آن‌ها را از commit خود خارج خواهید کرد.

و 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 !== '') {

مرحله ۳: آماده‌سازی وصله درستی‌سنجی‌شده با cm vcs stage

پس‌از بررسی تفاوت یکپارچه و تأیید اینکه اصلاحیه با استانداردهای کیفیت و امنیت شما مطابقت دارد، وصله را برای ثبت آماده کنید. چون cm vcs stage دستور git add -A را اجرا می‌کند، همه تغییرات را در درخت کاری آماده می‌کند، ازجمله ورودی‌های ردیابی‌نشده .exploit/ و .cm_project از مرحله ۲. ابتدا، آن‌ها را به .git/info/exclude اضافه کنید، یک فایل نادیده محلی که Git هرگز آن را ثبت نمی‌کند، تا فقط وصله آماده‌سازی شود:

# Keep CodeMender's local files out of Git (local-only; not committed)
printf '.exploit/\n.cm_project\n' >> .git/info/exclude

سپس تغییرات را بااستفاده از cm vcs stage آماده کنید:

cm vcs stage

خروجی:

📦 CodeMender VCS Stage
──────────────────────────────────────────────────
  Directory: /home/user/juice-shop
  Command:   git add -A
──────────────────────────────────────────────────

2026-10-29T04:00:06Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T040006Z_pending.log
✅ Changes staged successfully.

تأیید کنید که فقط وصله در Git آماده شده است:

cm vcs status

خروجی:

📂 CodeMender VCS Status
──────────────────────────────────────────────────
  Directory: /home/user/juice-shop
  Command:   git status --short
──────────────────────────────────────────────────

M  routes/login.ts

اگر cm vcs stage را قبل‌از به‌روزرسانی .git/info/exclude اجرا کرده‌اید، فایل‌های CodeMender را با git restore --staged .exploit .cm_project از حالت آماده‌سازی خارج کنید. فایل‌ها در دیسک باقی می‌مانند؛ فقط از ناحیه آماده‌سازی برداشته می‌شوند.

مرحله ۴: اعمال وصله و پاک کردن مصنوعات درستی‌سنجی

قبل‌از رفع کردن یافته بعدی، وصله مرحله‌ای را ثبت کنید: هر اجرای cm fix و cm verify با بازنشانی فضای کاری (git checkout HEAD -- . && git clean -fd) شروع می‌شود که تغییرات ثبت‌نشده را حذف می‌کند. سپس پوشه محلی .exploit/ را حذف کنید تا اصلاح بعدی از فضای کاری تمیز شروع شود. چون .exploit/ اکنون نادیده گرفته می‌شود، git clean -fd دیگر آن را برای شما برنمی‌دارد. نسخه دائمی از مصنوعات در ~/.codemender/artifacts/<session-id>/ باقی می‌ماند.

git commit -m "fix: use parameterized query in login route"
rm -rf .exploit/

اگر Git هویتتان را درخواست کرد، git config user.name "Your Name" و git config user.email "you@example.com" را در مخزن اجرا کنید و سپس دوباره ثبت کنید.

‫۹. اعتبارسنجی وصله‌ها، مدیریت جلسه‌ها، و صادر کردن گزارش‌ها (گزارش cm)

⏱️ مدت: ۰۸:۰۰

پس‌از اعمال وصله امنیتی تولیدشده با هوش مصنوعی، مدیریت جلسه‌های فعال، بازرسی آمار استفاده از کد، و تولید گزارش‌های رعایت امنیت سازمانی بااستفاده از cm report ضروری است.

مرحله ۱: مدیریت جلسه‌های باحالت (cm session list / resume / cancel)

CodeMender هر اسکن، درستی‌سنجی، و تکلیف اصلاح را به‌عنوان یک جلسه باحالت در پایگاه داده SQLite محلی خود (~/.codemender/state.db) ردیابی می‌کند. برای بازرسی جلسه‌هایتان، cm session list را اجرا کنید:

cm session list

خروجی:

SESSION_ID  TYPE    STATUS       TARGET                          CREATED              RESUMABLE
──────────  ────    ──────       ──────                          ───────              ─────────
ChA0Yjll    FIX     ✅ COMPLETED  ...40de-467d-8ca4-8571dca16036  2026-10-29T03:40:21  —
ChBkZTRh    VERIFY  ✅ COMPLETED  ...40de-467d-8ca4-8571dca16036  2026-10-29T03:11:21  —
ChBjMjI4    FIND    ✅ COMPLETED  /home/user/juice-shop           2026-10-29T03:01:40  —

3 session(s) total
2026-10-22T02:24:43Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261022T022443Z_pending.log

مرحله ۲: برای درستی‌سنجی یافته‌های اصلاح‌شده، cm report را اجرا کنید

cm report -f table را اجرا کنید تا وضعیت‌های به‌روزشده یافته‌ها نمایش داده شود (توجه داشته باشید که یافته‌های اصلاح‌شده اکنون FIXED را با ✅ applied در ستون Fix نمایش می‌دهند):

cm report -f table

خروجی:

┌──────────┬───────────┬──────┬──────────┬──────────────────────────────┬────────────────────────────────────────┐
│ID        │Severity   │Status│Fix       │File                          │Title                                   │
├──────────┼───────────┼──────┼──────────┼──────────────────────────────┼────────────────────────────────────────┤
│ 43aa7446 │🔴 CRITICAL│FIXED │✅ applied│routes/login.ts               │SQL Injection in User Login Handler A...│
│ dd83d0a4 │🟠 HIGH    │OPEN  │—         │routes/search.ts              │UNION-Based SQL Injection in Product ...│
│ 4dfe2409 │🟠 HIGH    │OPEN  │—         │routes/userProfile.ts         │Remote Code Execution via Eval in Use...│
│ 79d490b0 │🟠 HIGH    │OPEN  │—         │routes/fileUpload.ts          │Path Traversal (Zip Slip) in Zip File...│
│ 4f2b050c │🟠 HIGH    │OPEN  │—         │routes/fileUpload.ts          │XML External Entity (XXE) Injection i...│
│ 1ece0e25 │🟠 HIGH    │OPEN  │—         │server.ts                     │Missing Authorization on Product Upda...│
│ 757fd438 │🟠 HIGH    │OPEN  │—         │routes/trackOrder.ts          │NoSQL / JavaScript Injection in Order...│
│ 349bac9f │🟡 MEDIUM  │OPEN  │—         │routes/profileImageUrlUploa...│Server-Side Request Forgery (SSRF) in...│
│ be5e1459 │🟡 MEDIUM  │OPEN  │—         │routes/redirect.ts            │Open Redirect via Inadequate Allowlis...│
│ 06ecf8a5 │🟡 MEDIUM  │OPEN  │—         │routes/basket.ts              │Insecure Direct Object Reference (IDO...│
│ 02f6a293 │🟡 MEDIUM  │OPEN  │—         │routes/dataErasure.ts         │Local File Read via Insecure Template...│
│ 95ee59a3 │🟡 MEDIUM  │OPEN  │—         │routes/updateProductReviews.ts│NoSQL Injection in Product Review Upd...│
└──────────┴───────────┴──────┴──────────┴──────────────────────────────┴────────────────────────────────────────┘

12 finding(s): 1 CRITICAL, 6 HIGH, 5 MEDIUM · ✅ 1 fixed, 🔴 11 open
📋 Report generated at 2026-10-29 04:01:10 UTC
2026-10-29T04:01:10Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T040110Z_pending.log

مرحله ۳: بررسی مصرف نمانه بااستفاده از cm stats

cm stats را اجرا کنید تا مصرف محلی کد را در حالت‌های اسکن (cm find --quick، cm verify، و cm fix) بررسی کنید:

cm stats

خروجی:

COMMAND          REQUESTS  POLLS  INPUT   OUTPUT  CACHED  THOUGHT  TOOL_CALLS  TOTAL   CACHE_HIT%  THINK_RATIO%  DURATION
───────          ────────  ─────  ─────   ──────  ──────  ───────  ──────────  ─────   ──────────  ────────────  ────────
total            3         186    10.7M   23.1k   9.9M    55.5k    0           10.8M   91.8%       70.7%         35m 54s
cm find --quick  1         33     2.0M    9.4k    1.8M    15.2k    0           2.1M    90.6%       61.8%         05m 44s
cm fix           1         33     870.9k  908     678.6k  20.3k    0           892.2k  77.9%       95.7%         04m 40s
cm verify        1         120    7.8M    12.7k   7.3M    20.0k    0           7.9M    93.6%       61.1%         25m 31s

3 turn(s) across 3 command type(s) in the last 7 days
2026-10-22T02:24:46Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261022T022446Z_pending.log

مرحله ۴: تولید و پیش‌دید گزارش HTML تعاملی (cm report -f html)

یافته‌های اسکن و وصله‌های اعمال‌شده را به‌عنوان داشبورد HTML تعاملی و مستقل صادر کنید:

cm report -f html
cp ~/.codemender/reports/report.html ./report.html

برای مشاهده report.html در Google Cloud Shell:

سرور وب پیش‌نمایش محلی را در پایانه Cloud Shell خود راه‌اندازی کنید:

python3 -m http.server 8080

در نوارابزار بالا سمت چپ Cloud Shell، روی دکمه پیش‌نمایش وب (نماد چشم/صفحه) ➔ پیش‌نمایش در درگاه ۸۰۸۰ کلیک کنید تا داشبورد تعاملی رعایت مقررات را در مرورگرتان ببینید.

(جایگزین) در کاوشگر فایل Cloud Shell Editor، روی report.html کلیک راست کنید و روی بارگیری کلیک کنید تا فایل را در مرورگر محلی‌تان مشاهده کنید.

مرحله ۵: ویژگی‌های کلیدی گزارش HTML تعاملی تولیدشده

در زیر، تفکیک مؤلفه‌های کلیدی گزارش HTML تعاملی تولیدشده (report.html) ارائه شده است:

نمای کلی داشبورد رعایت امنیت CodeMender

۱. کارت‌های وضعیت و سرصفحه سنجه‌های اجرایی

CodeMender Executive Metrics Header and Posture Cardsفراداده سرصفحه: جزئیات مخزن هدف (OWASP Juice Shop)، تعداد کل فایل‌های منبع اسکن‌شده (684 files)، و مُهر زمان تولید UTC را نمایش می‌دهد.

شبکه کارت‌های سنجه: نمای کلی سطح بالا و فوری از کل یافته‌ها، توزیع‌های شدت (CRITICAL، HIGH، MEDIUM، LOW)، و کل آسیب‌پذیری‌های اصلاح‌شده (FIXED) ارائه می‌دهد.

۲. جدول خلاصه یافته‌های تعاملی

جدول خلاصه یافته‌های CodeMenderماتریس آسیب‌پذیری: جدولی قابل‌فیلتر کردن را نمایش می‌دهد که حاوی ID، Severity، Status (OPEN درمقابل FIXED)، CWE Type، File Location، Vulnerability Title، و Confidence Score است.

۳. تحلیل عمیق علت ریشه‌ای و تکه‌کد منبع آسیب‌پذیر

تکه‌کد و تحلیل علت ریشه‌ای CodeMenderتحلیل جمع‌شدنی (RCA): با کلیک کردن روی هر ردیف یافته، «تحلیل علت ریشه‌ای» مفصل که توسط مدل استدلال امنیتی Gemini ترکیب شده است ازهم باز می‌شود.

تکه‌کد منبع آسیب‌پذیر: شماره‌های دقیق خط و کد منبع با نحو برجسته‌شده را در اطراف سینک آسیب‌پذیر نمایش می‌دهد.

۴. تفاوت‌های وصله اصلاحی هوش مصنوعی ترکیبی

CodeMender Synthesized Remediation Patch Diffنمای تفاضلی یکپارچه: برای آسیب‌پذیری‌های اصلاح‌شده (FIXED)، CodeMender یک بلوک تفاضلی یکپارچه را ارائه می‌دهد که کدهای اضافه‌شده را به رنگ سبز (+) و کدهای آسیب‌پذیر حذف‌شده را به رنگ قرمز (-) برجسته می‌کند.

مرحله ۶: (اختیاری) وارد کردن یافته‌های SAST طرف سوم (cm report import)

CodeMender به نقص‌هایی که اسکنر خودش کشف می‌کند محدود نمی‌شود. تیم‌ها می‌توانند نتایج SAST خارجی (مثلاً از Semgrep،‏ Snyk،‏ SonarQube، یا Fortify) را بااستفاده از طرح‌واره JSON استانداردشده یا جادوی تعاملی وارد کنند، که به CodeMender اجازه می‌دهد فوراً اصلاحات را برای آن‌ها تأیید و ترکیب کند:

# Create a sample third-party findings JSON file
cat << 'EOF' > ./findings.json
[
 {
   "file_path": "routes/basket.ts",
   "line": 18,
   "title": "SQL Injection in Basket Handler",
   "message": "Raw basket ID concatenated in query",
   "severity": "HIGH",
   "vuln_type": "CWE-89"
 }
]
EOF

# Ingest findings into CodeMender state database
cm report import --file ./findings.json

خروجی:

Successfully imported 1 findings.
2026-10-22T02:27:10Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261022T022710Z_pending.log

‫۱۰. پاک‌سازی منابع

⏱️ مدت: ۰۱:۰۰

برای جلوگیری از استفاده غیرضروری از دیسک در محیط Google Cloud Shell و پاک‌سازی منابع موقت کارگاه، این مراحل پاک‌سازی را دنبال کنید.

مرحله ۱: پاک کردن حافظه نهان محلی CodeMender و برداشتن مخزن

CodeMender یک فرمان cm clean داخلی برای پاک‌سازی پایگاه داده یافته‌های محلی (~/.codemender/state.db)، گزارش‌های HTML، و فایل‌های پشتیبان منبع ارائه می‌دهد. فرمان‌های زیر را در Cloud Shell اجرا کنید:

# Purge local SQLite findings cache, HTML reports, and backup files
cm clean

# Remove cloned repository
cd ~
rm -rf ~/juice-shop

مرحله ۲: (اختیاری) غیرفعال کردن Google Cloud APIs

اگر قصد ندارید از CodeMender یا Agent Platform API در این پروژه برای توسعه بیشتر استفاده کنید، می‌توانید میاناهای برنامه‌سازی کاربردی سرویس را غیرفعال کنید:

gcloud services disable \
 aiplatform.googleapis.com \
 cloudresourcemanager.googleapis.com \
 --project=${PROJECT_ID}

‫۱۱. تبریک می‌گوییم

⏱️ مدت: ۰۲:۰۰

تبریک! شما بااستفاده از CodeMender در «پلاتفرم عامل Gemini Enterprise» در Google Cloud، OWASP Juice Shop را باموفقیت از یک برنامه آسیب‌پذیر عمدی به یک پایگاه کد امن و مقاوم تبدیل کرده‌اید.

آنچه پوشش داده‌اید

اصلاح حلقه بسته خودکار: CodeMender با اجرای یک چرخه حیات امنیتی کامل و خودگردان، از هشدار استاتیک غیرفعال فراتر می‌رود—از کشف مخزن (cm find) تا تأیید بهره‌برداری از محیط امن (cm verify) و ترکیب وصله آزمایش‌شده با رگرسیون (cm fix).

اثبات‌های بهره‌برداری مبتنی بر شواهد: CodeMender با ثبت مصنوعات درستی‌سنجی ملموس (PLAN.md، LOG.md، exploit.sh، REPORT.md)، موارد مثبت کاذب را حذف می‌کند و قابلیت بهره‌برداری در دنیای واقعی را قبل‌از نوشتن هر کدی اثبات می‌کند.

اصلاحات اصطلاحی بافت‌آگاه: عوامل استدلال Gemini به‌جای اعمال جایگزینی‌های نوشتاری عمومی، معماری برنامه، مدل‌های داده، و ORMها را تجزیه‌وتحلیل می‌کنند تا وصله‌های تمیز و قابل‌نگهداری (مانند پُرسمان‌های Sequelize پارامترشده) تولید کنند که منطق کسب‌وکار موجود را حفظ می‌کند.

حفاظ‌های ایمنی و آزمایشی داخلی: هر اصلاح پیشنهادی به‌طور خودکار دربرابر مجموعه‌های آزمایشی پروژه (npm test) و بررسی‌کننده‌های نوع (tsc) در محیط‌های امن فضای کاری مجزا اعتبارسنجی می‌شود، قبل‌از اینکه تغییرات آماده‌سازی شوند.

تغییر طرز فکر توسعه‌دهنده

گردش کار SAST دستی سنتی

Autonomous Remediation with CodeMender (cm)

خستگی از هشدار: ساعت‌ها صرف اولویت‌بندی گزارش‌های پرنوفه با نرخ‌های مثبت کاذب بالا می‌شود.

Agentic Code Discovery‏ (cm find .): اسکن عمیق و متناسب با بافتار مخزن با بهره‌گیری از مدل‌های Gemini.

درستی‌سنجی دستی اثبات مفهوم: ساختن بار داده‌های curl سفارشی و اسکریپت‌های حمله برای تأیید آسیب‌پذیری‌ها.

Automated Exploit Proofs‏ (cm verify ): ترکیب خودکار طرح‌های اعتبارسنجی اجرایی، گزارش‌ها، و اسکریپت‌های پوسته.

بازسازی کد دستی پرخطر: وصله کردن دستی پُرسمان‌های پیچیده پایگاه داده که اغلب باعث ایجاد خطاهای نحوی یا زمان اجرا می‌شود.

Idiomatic Patch Synthesis‏ (cm fix ): تولید تفاوت‌های بافت‌آگاه متناسب با ORMهای موجود و استانداردهای چارچوب.

خطرات پس‌رفت تولید: وصله‌های امنیتی اغلب منطق یا آزمایش‌های کسب‌وکار پایین‌دستی را مختل می‌کنند.

حفاظ‌های آزمایش خودکار: اعتبارسنجی مداوم دربرابر مجموعه آزمون‌های محلی و جعبه‌های شنی فرایند مجزا.

مجموعه‌های انطباق دستی: جمع‌آوری دستی یافته‌ها در اسناد ثابت برای بررسی‌های حسابرسی.

دور سنجی استانداردشده و SARIF (cm report -f sarif): صادر کردن فوری OASIS SARIF v2.1.0، داشبوردهای HTML، و تجزیه‌وتحلیل‌های توکن.

مراحل بعدی

🚀 ادامه سه‌گانه CodeMender:

بخش ۲: ایمن‌سازی خط لوله CI/CD با CodeMender — خودکارسازی اسکن مداوم بدون واسط، ادغام داشبورد SARIF، و درخواست‌های کشش خوداصلاحی در GitHub Actions.

بخش ۳: کدنویسی امن با Antigravity و CodeMender — توسعه هوش مصنوعی زایا را با دستیار امنیتی خودکار جفت کنید.

📖 کاوش اسناد:

CodeMender در اسناد Google Cloud

Google Cloud Security Solutions

💡 اعمال کردن بر پروژه‌های خودتان:

cm find . و cm fix را در مخازن Node.js،‏ Python،‏ Go،‏ Java،‏ Rust، یا C/C++‎ خودتان اجرا کنید!