تأمين تطبيقك باستخدام CodeMender

1. قبل البدء

⏱️ المدة: 03:00

مرحبًا بك في الدرس التطبيقي العملي حول الترميز تأمين تطبيقك باستخدام CodeMender على Gemini Enterprise Agent Platform في Google Cloud.

في ورشة العمل هذه، ستتقمّص دور مهندس أمان السحابة الإلكترونية المكلّف بمراجعة وتأمين OWASP Juice Shop، وهو تطبيق ويب يتضمّن ثغرات أمنية متعمّدة ويُعدّ معيارًا متّبعًا في المجال، تم إنشاؤه باستخدام Node.js وExpress وTypeScript وAngular.

تُغرق أدوات فحص الأمان التقليدية (SAST/DAST) فِرق التطوير بآلاف نتائج الأمان الثابتة، ومعدلات عالية من النتائج الموجبة الخاطئة، وبدون أي إصلاحات قابلة للتنفيذ في الرموز البرمجية. يقضي المطوّرون ساعات في فرز السجلّات وتتبُّع تدفقات البيانات وكتابة رموز التصحيح يدويًا، ما يؤدي في كثير من الأحيان إلى تعطُّل سلوك التطبيق الحالي.

يُحدث CodeMender ثورة في أمان الرموز البرمجية من خلال توفير نظام توجيه وكلاء دقيق حول نماذج Gemini اللغوية الكبيرة من Google. باستخدام الطلبات التي صمّمها فريق Google DeepMind، ومهارات الأمان المتخصّصة، والتنسيق بين عدة وكلاء، يعمل CodeMender كمطوّر مشارِك مستقل في مجال أمان الذكاء الاصطناعي، حيث يعثر على الثغرات الأمنية في البرامج ويتحقّق منها ويعالجها مباشرةً داخل مستودعات المصادر المحلية.

المتطلبات الأساسية

  • فهم أساسي للثغرات الأمنية في تطبيقات الويب (أهم 10 ثغرات أمنية في OWASP، مثل حقن SQL وXSS)
  • معرفة أساسية بتطبيقات JavaScript/TypeScript وNode.js
  • معرفة أساسية بأدوات واجهة سطر الأوامر (CLI)

ما ستتعلّمه

  • كيفية إعداد واجهة سطر الأوامر (CLI) في CodeMender (cm) والمصادقة عليها وبدء استخدامها في Google Cloud Shell
  • كيفية فحص مستودع بشكل مستقل لاكتشاف الثغرات الأمنية التي يمكن استغلالها (cm find)
  • كيفية التحقّق من الثغرات الأمنية في بيئات معزولة وفحص عناصر التحقّق (cm verify)
  • كيفية تجميع التصحيحات البرمجية الأمنية الذكية واختبارها وتطبيقها بشكل مستقل (cm fix)
  • كيفية تدقيق بيانات قياس الرموز المميّزة عن بُعد وتصدير تقارير الامتثال المتعددة التنسيقات (cm stats وcm report)

المتطلبات

  • مشروع على Google Cloud تم تفعيل الفوترة فيه
  • ‫Google Cloud Shell مع اتصال نشط بالمشروع (يتضمّن gcloud وgit وNode.js 18+‎ المثبّتة مسبقًا)
  • مستودع المبتدئين: مستودع OWASP Juice Shop على GitHub

2. مقدّمة حول بنية CodeMender

⏱️ المدة: 04:00

قبل التعمّق في فحص الرموز البرمجية وإصلاحها، لنتعرّف على آلية عمل CodeMender في الخلفية ضمن Gemini Enterprise Agent Platform وفقًا لمعايير بنية Google Cloud الرسمية.

بنية النظام: الوكيل وبرنامج الخلفية للعميل

سير عمل CodeMender Autonomous Remediation Engine

من منظور المستخدم، يتألف CodeMender من مكوّنَين رئيسيَين في البنية:

منصة مستضافة متعددة الوكلاء: نظام مستضاف متعدد الوكلاء يعمل على Google Cloud وينفّذ منطق الأعمال الأساسي للأمان، وهندسة طلبات النماذج اللغوية الكبيرة، والاستدلال الأمني.

واجهة سطر الأوامر (CLI) للعميل المحلي وبرنامج Sandbox 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) داخل وضع الحماية المحلي.

3- إعداد بيئة OWASP Juice Shop

⏱️ المدة: 05:00

في هذه الخطوة، ستفتح بيئة وحدة تحكّم Google Cloud وتجلب مستودع التطبيق المستهدَف.

الخطوة 1: فتح Cloud Shell في Google Cloud Console

انتقِل إلى Google Cloud Console في المتصفّح.

في شريط التنقّل العلوي، انقر على الزر تفعيل Cloud Shell (الرمز >_).

توفّر Cloud Shell وحدة طرفية لنظام التشغيل Linux مستندة إلى المتصفّح مع تثبيت gcloud وgit وNode.js مسبقًا ومصادقتها.

الخطوة 2: استنساخ مستودع OWASP Juice Shop

في Cloud Shell أو الوحدة الطرفية المحلية، يمكنك استنساخ مستودع OWASP Juice Shop:

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

الخطوة 3: فحص ملفات التطبيق الرئيسية

يستخدم OWASP Juice Shop إطار عمل Express.js في الخلفية مع وحدات TypeScript. ألقِ نظرة سريعة على بنية الدليل:

ls -la routes/ lib/

لاحظ ملفات المسار الرئيسية التي تتعامل مع المصادقة وطلبات بحث المستخدم وإدارة سلة التسوق:

‫routes/login.ts: يعالج مصادقة المستخدم وتنفيذ طلبات بحث SQL الأولية.

‫routes/search.ts: يعالج عمليات البحث عن المنتجات وعرض الردود.

‫routes/basket.ts: تعالج هذه السمة استرداد سلة تسوّق المستخدم.

‫routes/trackOrder.ts: يعالج تتبُّع الطلبات من خلال طلبات بحث NoSQL.

‫lib/xml.ts: يعالج تحليل XML وتحميل الملفات.

‫lib/insecurity.ts: أدوات مساعدة للرموز المميّزة للجلسات والتشفير

4. تثبيت CodeMender CLI (cm) ومصادقة بيانات اعتماد GCP

⏱️ المدة: 08:00

في هذه الخطوة، عليك تفعيل واجهات Google Cloud API المطلوبة، ومنح أذونات "إدارة الهوية وإمكانية الوصول" (IAM) باستخدام gcloud، وتنزيل وتثبيت ملف cm CLI الثنائي، وضبط "بيانات الاعتماد التلقائية للتطبيق" (ADC).

الخطوة 1: تفعيل واجهات Google Cloud API المطلوبة من خلال gcloud

تتطلّب أداة CodeMender تفعيل Agent Platform API‏ (aiplatform.googleapis.com) وCloud Resource Manager API‏ (cloudresourcemanager.googleapis.com) على Gemini Enterprise Agent Platform.

في Cloud Shell أو وحدة التحكّم، استخرِج رقم تعريف المشروع النشط (أو راجِع القائمة المنسدلة للمشروع في أعلى Google Cloud Console) وفعِّل واجهات برمجة التطبيقات المطلوبة للخدمة:

# 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)"

الخطوة 2: منح أذونات "إدارة الهوية وإمكانية الوصول" من خلال gcloud

للتفاعل مع محرّك الاستدلال السحابي في CodeMender، يجب أن يتم منح المستخدمين وحسابات الخدمة دور "إدارة الهوية وإمكانية الوصول" (IAM) في roles/aiplatform.user (مستخدم منصة الوكيل).

منح دور "إدارة الهوية وإمكانية الوصول" لحساب المستخدم من خلال واجهة سطر الأوامر

# Get your active authenticated gcloud account email
USER_EMAIL=$(gcloud config get-value account)

# Add IAM policy binding for user account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
 --member="user:${USER_EMAIL}" \
 --role="roles/aiplatform.user"

الخطوة 3: تنزيل cm CLI وتثبيتها في Cloud Shell

في Google Cloud Shell، يتم تخزين بيانات المستخدمين بشكل دائم في دليل $HOME. نفِّذ الأوامر التالية لتثبيت cm في ~/bin بدون الحاجة إلى sudo. لا تزال في ~/juice-shop من القسم السابق، لذا يتم تنزيل الأوامر في دليل مؤقت وتنظيفه بعد ذلك. بهذه الطريقة، لن ينتهي الأمر بملفات التثبيت في مستودع Juice Shop:

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

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

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

الخطوة 4: التحقّق من تثبيت واجهة سطر الأوامر في cm

شغِّل cm --version للتأكّد من تثبيت ملف CLI الثنائي بشكل صحيح:

cm --version

الناتج المتوقَّع:

cm version 0.17.0

الخطوة 5: ضبط "بيانات الاعتماد التلقائية للتطبيق" (ADC) في Google Cloud

اضبط "بيانات الاعتماد التلقائية للتطبيق" (ADC) في Google Cloud كي يتمكّن "cm" من مصادقة الطلبات الموجّهة إلى محرّك الاستدلال في السحابة الإلكترونية:

gcloud auth application-default login

سيظهر مربّع حوار تفويض مشروط يحمل التصنيف تفويض Cloud Shell. انقر على تفويض لمنح إذن الوصول.

5- بدء مساحة عمل CodeMender والتحقّق منها

⏱️ المدة: 03:00

بعد تثبيت cm ومصادقته، عليك تهيئة مساحة عمل CodeMender داخل دليل المشروع المستهدف والتحقّق من إعداد البيئة.

الخطوة 1: إعداد مساحة عمل CodeMender (cm init)

نفِّذ الأمر cm init من جذر دليل مشروعك لبدء ملفات تتبُّع الحالة على الجهاز وضبط الإعدادات الأساسية:

cm init

إخراج:

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

الخطوة 2: تشغيل بيانات تشخيص الحالة الشاملة (cm health)

قبل بدء جلسة وكيل، شغِّل cm health للتحقّق من بيانات الاعتماد والإعدادات وإمكانية الوصول والتفويض:

cm health

إخراج:

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

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

Status: HEALTHY (exit code 0, 319ms)

الخطوة 3: فهم مَعلمات الضبط (config.yaml)

ينشئ CodeMender ملف إعداد لمساحة العمل في .codemender/config.yaml (أو ~/.codemender/config.yaml). يحدّد هذا الملف حدود السياسة وقواعد تضمين الملفات وعمليات التحقّق من الاختبار:

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

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

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

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

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

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

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

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

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

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

6. اكتشِف الثغرات الأمنية باستخدام cm find .

⏱️ المدة: 07:00

في هذه الخطوة، ستشغّل cm find . --quick لإجراء فحص أمان يستند إلى الوكلاء في قاعدة الرموز البرمجية لـ Juice Shop.

الخطوة 1: تنفيذ cm find . --quick

اعتبارًا من الإصدار 0.16.0 من CodeMender، يتم ضبط cm find <path> تلقائيًا على الفحص العميق (

--deep

) لإجراء تحليل شامل لكل ملف على حدة، بينما يركّز الفحص السريع (

--quick

) يوفّر فرزًا سريعًا للمستودعات. شغِّل cm find . --quick لإجراء فحص سريع في مستودع OWASP Juice Shop (الوقت المقدَّر للتنفيذ: حوالي 8 دقائق لتصنيف قاعدة الرموز البرمجية الكاملة التي تتضمّن 684 ملفًا):

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

يطلق cm جلسة فحص على Gemini Enterprise Agent Platform، ويحلّل ملفات الرموز المصدرية في جميع وحدات المستودع:

⚠️ Sandbox DISABLED and command approval OFF: the agent can run commands on this machine without asking. Code in the scanned repository could steer it. Re-enable the sandbox or command approval (drop --yes, or set tools.confirm_commands: true) unless you trust the repository.
🔍 Discovering files in /home/user/juice-shop...
  Found 684 source files
🚀 Starting FIND session (mode: QUICK)...
  Server: https://aiplatform.googleapis.com
  Session: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu
  Operation: ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu
📂 Scan target: /home/user/juice-shop
🔒 Sandbox roots (agent can only access these directories):
  • /home/user/juice-shop

📡 Waiting for server (https://aiplatform.googleapis.com)...
────────────────────────────────────────────────────────────
2026-10-29T03:01:47Z [INFO]  🔧 [Step 1] list_dir → /home/user/juice-shop
2026-10-29T03:01:56Z [INFO]  🔧 [Step 2] list_dir → .../juice-shop/routes
2026-10-29T03:02:08Z [INFO]  🔧 [Step 3] read_file → .../juice-shop/server.ts
2026-10-29T03:02:47Z [INFO]  🔧 [Step 7] read_file → .../juice-shop/routes/login.ts
2026-10-29T03:02:56Z [INFO]  🔧 [Step 8] read_file → .../juice-shop/routes/search.ts
2026-10-29T03:03:48Z [INFO]  🔧 [Step 13] read_file → .../juice-shop/routes/fileUpload.ts
2026-10-29T03:04:30Z [INFO]  🔧 [Step 16] read_file → .../juice-shop/routes/userProfile.ts
2026-10-29T03:06:11Z [INFO]  🔧 [Step 25] read_file → .../juice-shop/routes/trackOrder.ts
2026-10-29T03:07:57Z [INFO]  🔧 [Step 33] read_file → .../juice-shop/routes/order.ts
2026-10-29T03:09:30Z [INFO]  ✅ Completed 33 tool steps in 7m48s | Tokens: 2.6M in / 8k out / 2.7M total
────────────────────────────────────────────────────────────

🔒 Found 12 vulnerabilities:

ID        SEVERITY    TYPE                                     FILE                             TITLE                                                                                   CONFIDENCE
────────  ────────    ────                                     ────                             ─────                                                                                   ──────────
43aa7446  🔴 CRITICAL  SQL INJECTION                            routes/login.ts                  SQL Injection in User Login Handler Allows Authentication Bypass                        100%
dd83d0a4  🟠 HIGH      SQL INJECTION                            routes/search.ts                 UNION-Based SQL Injection in Product Search Allows Database Exfiltration                100%
4dfe2409  🟠 HIGH      CODE INJECTION                           routes/userProfile.ts            Remote Code Execution via Eval in User Profile Template Handler                         100%
79d490b0  🟠 HIGH      PATH TRAVERSAL                           routes/fileUpload.ts             Path Traversal (Zip Slip) in Zip File Upload Allows Arbitrary File Overwrite            100%
4f2b050c  🟠 HIGH      XML EXTERNAL ENTITY (XXE)                routes/fileUpload.ts             XML External Entity (XXE) Injection in File Upload Route Leaks System Files             100%
1ece0e25  🟠 HIGH      IMPROPER ACCESS CONTROL                  server.ts                        Missing Authorization on Product Update Endpoint Allows Unauthorized Product Tampering  100%
757fd438  🟠 HIGH      CWE-943                                  routes/trackOrder.ts             NoSQL / JavaScript Injection in Order Tracking Allows Database Record Exfiltration      100%
349bac9f  🟡 MEDIUM    SERVER-SIDE REQUEST FORGERY (SSRF)       routes/profileImageUrlUpload.ts  Server-Side Request Forgery (SSRF) in Profile Image URL Upload Route                    100%
be5e1459  🟡 MEDIUM    OPEN REDIRECT                            routes/redirect.ts               Open Redirect via Inadequate Allowlist Substring Match                                  100%
06ecf8a5  🟡 MEDIUM    INSECURE DIRECT OBJECT REFERENCE (IDOR)  routes/basket.ts                 Insecure Direct Object Reference (IDOR) Allows Access to Arbitrary User Baskets         100%
02f6a293  🟡 MEDIUM    PATH TRAVERSAL                           routes/dataErasure.ts            Local File Read via Insecure Template Layout Parameter in Data Erasure Route            100%
95ee59a3  🟡 MEDIUM    CWE-943                                  routes/updateProductReviews.ts   NoSQL Injection in Product Review Update Endpoint Allows Mass Modification              100%

Summary: 1 CRITICAL, 6 HIGH, 5 MEDIUM

Run 'cm report' for detailed analysis, 'cm verify <finding-id>' to validate, or 'cm fix <finding-id>' to generate a patch.
2026-10-29T03:09:30Z [INFO]  📄 Session log: /home/user/.codemender/logs/20261029T030140Z_ChBjMjI4YWY5MzljZjUzNTQ4EAgaAjg1KgRtYWlu.log

الخطوة 2: مراجعة نتائج الفحص من خلال cm report

شغِّل cm report -f table لعرض جميع نتائج الأمان التي تم اكتشافها من قاعدة بيانات SQLite المحلية:

cm report -f table

إخراج:

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

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

الخطوة 3: فهم حالات مراحل النشاط ومستويات الخطورة

يتتبّع CodeMender الثغرات الأمنية من خلال دورة حياة رسمية تتألف من أربع حالات:

حالة النتيجة

المعنى والتعامل مع الانتقال

OPEN

تم اكتشاف الثغرة الأمنية (أو استيرادها) ولكن لم يتم التحقّق منها أو تصحيحها أو رفضها بعد.

FIXED

أنشأ CodeMender رمز تصحيح، وطبّق الاختلاف، وتحقّق من نجاح حِزم الإصدار/الاختبار وفشل عمليات الاستغلال.

DISMISSED

تم وضع علامة "غير نشط" بسبب انخفاض مستوى الثقة أو عدم وجود تهديد أو التحقّق من أنّها نتيجة موجبة خاطئة. يؤدي هذا الخيار إلى كتم صوت التنبيهات المستقبلية.

REOPENED

تمت إعادة رصد ثغرة FIXED أو DISMISSED في عملية فحص لاحقة (ما يشير إلى تراجع في الرمز).

تصنيفات الخطورة

🔴 CRITICAL: مخاطر فورية وشديدة (مثل تنفيذ الرموز البرمجية عن بُعد، وحقن SQL غير المصادق عليه) يمكن الوصول إليها مباشرةً من حدود غير موثوق بها.

‫🟠 HIGH: ثغرة خطيرة (مثل قراءة قاعدة بيانات عشوائية أو تصعيد الامتيازات) تتطلّب سياقًا محدّدًا للمستخدم أو شروطًا متسلسلة

‫🟡 MEDIUM: ثغرة أمنية متوسطة الخطورة بنطاق محدود أو تتطلّب تفاعل المستخدم (مثل إعادة التوجيه المفتوحة أو تزوير الطلبات عبر المواقع).

‫🔵 LOW: عيوب في النظافة السيبرانية المتعلّقة بالدفاع في العمق أو متّجهات الاستطلاع ذات التأثير المباشر الأدنى

7. التحقّق من الثغرات الأمنية والاطّلاع على عناصر التحقّق التي تم تسجيلها

⏱️ المدة: 10:00

من الميزات الرئيسية في CodeMender هي الإنشاء التلقائي لأدلة التحقّق الدائمة عند تشغيل cm verify. لنتحقّق من نتيجة "حقن SQL الخطير" في routes/login.ts (الموضّحة باسم 43aa7446 في هذا الدليل التعليمي) ونستعرض العناصر التي أنشأها الوكيل.

الخطوة 1: تنفيذ cm verify <login-finding-id>

ابحث عن معرّف النتيجة لـ "routes/login.ts" من جدول "cm report" (على سبيل المثال، 43aa7446)، وشغِّل "cm verify <finding-id> --sandbox=false --bypass-warning -y" (الوقت المقدَّر للتنفيذ: حوالي 20 دقيقة لتشغيل خطوات الأداة المستقلة وبدء الخدمات التي تُشغَّل في الخلفية وتنفيذ نصوص برمجية مباشرة لاستغلال الثغرات الأمنية لإثبات المفهوم):

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

إخراج:

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

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

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

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

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

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

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

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

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

الخطوة 2: نظرة عامة على عناصر التحقّق التي تم تسجيلها

بدءًا من الإصدار 0.16.0 من 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

ملف العناصر

Category (الفئة)

Purpose

info.yaml

بيان البيانات الوصفية

ملف YAML منظَّم يحدّد المعرّف الفريد العالمي (UUID) للنتيجة والعنوان ومستوى الخطورة (CRITICAL) والثقة (certain) وعلامات CWE ‏(cwe-89).

PLAN.md

استراتيجية الوكيل

خطّة تحقّق وقائمة تحقّق مفصّلتان ينفّذهما محرّك الاستدلال في CodeMender بشكل مستقل

LOG.md

سجلّ تتبُّع التنفيذ

سجلّ تدقيق يتضمّن طابعًا زمنيًا ويسجّل كل طلب أداة ونقطة نهاية لطلب HTTP ونتيجة اختبار

server_runner.js / server.log

سجلّ Helper Runner / Server

النص البرمجي المساعد الذي أنشأه الوكيل لبدء Juice Shop من أجل الاختبار، ومخرجات الخادم التي تم تسجيلها

exploit.sh

Execution Wrapper / Standalone PoC

برنامج تضمين لبرنامج نصي Shell يشغّل الخدمة المستهدفة ويستدعي عميل PoC، ويتحقّق من صحة استجابات HTTP 200.

REPORT.md

تحليل السبب الأساسي

ملخّص تنفيذي، وتحليل للثغرات الأمنية سطرًا بسطر، وتفصيل لطلبات SQL الأولية، واقتراحات حول تحديد معلَمات Sequelize.

الخطوة 3: نظرة تفصيلية على أبرز ميزات مستندات إثبات الهوية

يكتب الوكيل هذه العناصر من جديد في كل عملية تشغيل، لذا تختلف محتوياتها الدقيقة في كل مرة. افتحها في "محرِّر 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، وسبب إمكانية استغلاله، والحلّ المقترَح (الطلبات المستندة إلى مَعلمات)

8. معالجة ثغرة حقن SQL باستخدام إصلاح cm

⏱️ المدة: 10:00

بعد أن تأكّدنا من نتيجة حقن SQL في routes/login.ts (رقم التعريف التجريبي 43aa7446) وفحصنا العناصر المرتبطة بها، لننفّذ cm fix لتطبيق تصحيح تلقائي لطلب البحث المزوّد بمَعلمات.

الخطوة 1: تنفيذ cm fix <login-finding-id> -y

شغِّل cm fix <finding-id> --sandbox=false --bypass-warning -y (استبدِل 43aa7446 بمعرّف نتيجة تسجيل الدخول الفعلي من cm report) لإنشاء إصلاح وتطبيقه:

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

إخراج:

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

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

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

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

✨ Patch generated successfully!

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

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

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

الخطوة 2: فحص حالة نظام التحكّم في الإصدارات (VCS) والفرق باستخدام cm vcs

شغِّل cm vcs status وcm vcs diff لعرض ملفات مساحة العمل المعدَّلة:

cm vcs status
cm vcs diff

إخراج:

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

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

الملفان غير المتتبَّعين هما ملفان محليان في CodeMender، وليسا جزءًا من عملية الإصلاح: يحتوي .exploit/ على عناصر التحقّق من cm verify، ويشير .cm_project إلى جذر المشروع في CodeMender. ستستبعدها من عملية الإرسال في الخطوة التالية.

وcm vcs diff:

🔍 Running diff in /home/user/juice-shop: git diff
diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {

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

الخطوة 3: تجهيز التصحيح الذي تم التحقّق منه باستخدام cm vcs stage

بعد مراجعة ملف diff الموحّد والتأكّد من أنّ الحلّ يستوفي معايير الجودة والأمان، يمكنك تجهيز التصحيح لتنفيذه. بما أنّ الأمر cm vcs stage يشغّل git add -A، فهو يجهّز كل تغيير في شجرة العمل، بما في ذلك الإدخالَين .exploit/ و.cm_project غير المتتبَّعين من الخطوة 2. أولاً، أضِفها إلى .git/info/exclude، وهو ملف تجاهل على الجهاز فقط لا يرسله Git أبدًا، بحيث يتم تنظيم التصحيح فقط:

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

بعد ذلك، يمكنك تجهيز التغييرات باستخدام cm vcs stage:

cm vcs stage

إخراج:

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

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

تأكَّد من أنّ التصحيح فقط هو الذي تم إعداده في Git:

cm vcs status

إخراج:

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

M  routes/login.ts

إذا شغّلت cm vcs stage قبل تعديل .git/info/exclude، عليك إلغاء تجهيز ملفات CodeMender باستخدام git restore --staged .exploit .cm_project. تبقى الملفات على القرص، وتتم إزالتها فقط من منطقة التخزين المؤقت.

الخطوة 4: تنفيذ التصحيح ومحو عناصر التحقّق

يجب تنفيذ التصحيح المرحلي قبل إصلاح النتيجة التالية: تبدأ كل عملية تشغيل لـ "cm fix" و"cm verify" بإعادة ضبط مساحة العمل (git checkout HEAD -- . && git clean -fd)، ما يؤدي إلى تجاهل التغييرات غير المنفّذة. بعد ذلك، احذف مجلد .exploit/ على الجهاز لتبدأ عملية الإصلاح التالية من مساحة عمل خالية من أي إعدادات سابقة. بما أنّه يتم الآن تجاهل .exploit/، لن يزيلها git clean -fd نيابةً عنك. تبقى نسخة دائمة من العناصر في ~/.codemender/artifacts/<session-id>/.

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

إذا طلب Git هويتك، شغِّل git config user.name "Your Name" وgit config user.email "you@example.com" في المستودع، ثم نفِّذ عملية الإضافة مرة أخرى.

9. التحقّق من صحة رموز التصحيح وإدارة الجلسات وتصدير التقارير (تقرير cm)

⏱️ المدة: 08:00

بعد تطبيق إصلاح أمني من إنشاء الذكاء الاصطناعي، من الضروري إدارة الجلسات النشطة وفحص إحصاءات استخدام الرموز المميّزة وإنشاء تقارير امتثال أمان المؤسسة باستخدام cm report.

الخطوة 1: إدارة الجلسات ذات الحالة (cm session list / resume / cancel)

يتتبّع CodeMender كل عملية فحص وتحقّق ومعالجة كجلسة ذات حالة في قاعدة بيانات SQLite المحلية (~/.codemender/state.db). يمكنك تشغيل cm session list لفحص جلساتك:

cm session list

إخراج:

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

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

الخطوة 2: تشغيل cm report للتحقّق من النتائج التي تم إصلاحها

شغِّل cm report -f table لعرض حالات النتائج المعدَّلة (لاحظ أنّ النتائج التي تم إصلاحها تعرض الآن FIXED مع ✅ applied في العمود Fix):

cm report -f table

إخراج:

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

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

الخطوة 3: التحقّق من استخدام الرموز المميّزة باستخدام cm stats

شغِّل cm stats لفحص استهلاك الرموز المميّزة المحلية في أوضاع الفحص (cm find --quick وcm verify وcm fix):

cm stats

إخراج:

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

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

الخطوة 4: إنشاء تقرير HTML التفاعلي ومعاينته (cm report -f html)

يمكنك تصدير نتائج الفحص والتصحيحات المطبَّقة كلوحة بيانات HTML تفاعلية ومستقلة:

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

لعرض report.html في Google Cloud Shell:

ابدأ خادم ويب محليًا للمعاينة في وحدة Cloud Shell الطرفية:

python3 -m http.server 8080

في شريط الأدوات أعلى يسار Cloud Shell، انقر على الزر معاينة الويب (رمز العين/الشاشة) ➔ معاينة على المنفذ 8080 لعرض لوحة بيانات الامتثال التفاعلية في المتصفّح.

(بديل) في مستكشف ملفات Cloud Shell Editor، انقر بزر الماوس الأيمن على report.html وانقر على تنزيل لعرض الملف في المتصفّح على جهازك.

الخطوة 5: الميزات الرئيسية لتقرير HTML التفاعلي الذي تم إنشاؤه

في ما يلي تفصيل للمكوّنات الرئيسية لتقرير HTML التفاعلي الذي تم إنشاؤه (report.html):

نظرة عامة على لوحة بيانات الامتثال الأمني في CodeMender

1. العنوان الرئيسي لمقاييس الأداء التنفيذية وبطاقات الوضع الأمني

بطاقات &quot;المقاييس التنفيذية&quot; و&quot;الوضع&quot; في CodeMenderالبيانات الوصفية للعنوان: تعرض تفاصيل المستودع المستهدَف (OWASP Juice Shop) وإجمالي الملفات المصدر التي تم فحصها (684 files) والطابع الزمني لإنشاء التوقيت العالمي المتفق عليه.

شبكة بطاقات المقاييس: تقدّم نظرة عامة فورية عالية المستوى على إجمالي النتائج وتوزيعات الخطورة (CRITICAL وHIGH وMEDIUM وLOW) وإجمالي الثغرات الأمنية التي تم إصلاحها (FIXED).

2. جدول ملخّص النتائج التفاعلي

جدول ملخّص نتائج CodeMenderمصفوفة الثغرات الأمنية: تعرض جدولاً قابلاً للفلترة يحتوي على ID وSeverity وStatus (OPEN مقابل FIXED) وCWE Type وFile Location وVulnerability Title وConfidence Score.

3. تحليل متعمّق للسبب الأساسي ومقتطف الرمز المصدر الذي يتضمّن ثغرة أمنية

تحليل السبب الأساسي ومقتطف الرمز في CodeMenderتحليل قابل للتصغير (RCA): يؤدي النقر على أي صف من صفوف النتائج إلى توسيع "تحليل السبب الأساسي" المفصّل الذي تم إنشاؤه بواسطة نموذج الاستدلال الأمني في Gemini.

مقتطف الرمز المصدر الذي يتضمّن ثغرة أمنية: يعرض أرقام الأسطر الدقيقة والرمز المصدر المميّز بالبنية حول نقطة الاستقبال التي تتضمّن ثغرة أمنية.

4. الاختلافات في رموز التصحيح التي تم إنشاؤها بواسطة الذكاء الاصطناعي

تصحيح الاختلافات في الإصلاحات الاصطناعية من CodeMenderعرض الاختلافات الموحّد: بالنسبة إلى الثغرات الأمنية التي تم إصلاحها (FIXED)، يعرض CodeMender مجموعة اختلافات موحّدة تبرز الإضافات المطبَّقة على الرمز البرمجي للتطبيق باللون الأخضر (+) والرمز البرمجي للتطبيق الذي تمت إزالته بسبب ثغرات أمنية باللون الأحمر (-).

الخطوة 6: (اختياري) استيراد نتائج اختبار SAST من جهات خارجية (cm report import)

لا يقتصر CodeMender على الثغرات التي يكتشفها الماسح الضوئي الخاص به. يمكن للفِرق استيراد نتائج SAST الخارجية (مثلاً من Semgrep أو Snyk أو SonarQube أو Fortify) باستخدام مخطّط JSON موحّد أو معالج تفاعلي، ما يتيح لـ CodeMender التحقّق من الإصلاحات وإنشائها على الفور:

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

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

إخراج:

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

10. حذف الموارد

⏱️ المدة: 01:00

لتجنُّب استخدام مساحة القرص بشكل غير ضروري في بيئة Google Cloud Shell وتنظيف موارد ورشة العمل المؤقتة، اتّبِع خطوات التنظيف هذه.

الخطوة 1: إزالة ذاكرة التخزين المؤقت المحلية في CodeMender وإزالة المستودع

يوفّر CodeMender أمر cm clean مضمّنًا لتطهير قاعدة بيانات النتائج المحلية (~/.codemender/state.db) وتقارير HTML وملفات النسخ الاحتياطية المصدر. نفِّذ الأوامر التالية في Cloud Shell:

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

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

الخطوة 2: (اختياري) إيقاف Google Cloud APIs

إذا لم تكن تخطّط لاستخدام واجهات برمجة التطبيقات CodeMender أو Agent Platform في هذا المشروع لمزيد من التطوير، يمكنك إيقاف واجهات برمجة التطبيقات للخدمة:

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

11. تهانينا

⏱️ المدة: 02:00

تهانينا! لقد نجحت في تحويل OWASP Juice Shop من تطبيق ضعيف عمدًا إلى قاعدة رموز برمجية آمنة ومحصّنة باستخدام CodeMender على Gemini Enterprise Agent Platform في Google Cloud.

المواضيع التي تناولتها

المعالجة الذاتية المغلقة: يتجاوز CodeMender التنبيهات الثابتة السلبية من خلال تنفيذ دورة حياة أمان كاملة وموجّهة ذاتيًا، بدءًا من اكتشاف المستودعات (cm find) ووصولاً إلى التحقّق من الثغرات في وضع الحماية (cm verify) وإنشاء تصحيحات تم اختبارها ضد التراجع (cm fix).

أدلة استغلال الثغرات المستندة إلى أدلة: من خلال التقاط عناصر تحقّق ملموسة (PLAN.md وLOG.md وexploit.sh وREPORT.md)، يزيل CodeMender الموجبات الخاطئة ويثبت إمكانية استغلال الثغرات في الواقع قبل كتابة أي رمز برمجي.

إصلاحات اصطلاحية تراعي السياق: بدلاً من تطبيق بدائل نصية عامة، تحلّل وكلاء Gemini المنطقيون بنية التطبيق ونماذج البيانات وORM لإنشاء رموز برمجية تصحيحية نظيفة وقابلة للصيانة (مثل طلبات البحث في Sequelize التي تتضمّن مَعلمات) تحافظ على منطق العمل الحالي.

إجراءات الأمان والاختبار المضمّنة: يتم تلقائيًا التحقّق من كل إصلاح مقترَح من خلال الحزم الاختبارية للمشروع (npm test) وأدوات التحقّق من النوع (tsc) داخل مساحات العمل المعزولة قبل تطبيق التغييرات.

تغيير طريقة تفكير المطوّرين

سير عمل اختبار SAST اليدوي التقليدي

المعالجة الذاتية باستخدام CodeMender‏ (cm)

إرهاق التنبيهات: ساعات طويلة في فرز التقارير المزعجة ذات معدلات الموجب الخاطئ المرتفعة.

‫Agentic Code Discovery (cm find .): فحص عميق للمستودعات مع مراعاة السياق، مستند إلى نماذج Gemini.

التحقّق اليدوي من إثبات جدوى الفكرة: إنشاء حمولات curl مخصّصة ونصوص برمجية للهجمات لتأكيد الثغرات الأمنية

أدلة الاستغلال المبرمَجة (cm verify ): تجميع تلقائي لخطط التحقّق القابلة للتنفيذ والسجلّات والنصوص البرمجية لـ Shell.

إعادة تصميم الرموز البرمجية يدويًا مع مخاطر عالية: تصحيح طلبات البحث المعقّدة في قاعدة البيانات يدويًا، ما يؤدي غالبًا إلى حدوث أخطاء في البنية أو أخطاء أثناء التشغيل

Idiomatic Patch Synthesis (cm fix ): إنشاء اختلافات واعية بالسياق ومخصّصة لمعايير ORM وأُطر العمل الحالية

مخاطر تراجع الإنتاج: غالبًا ما تؤدي التصحيحات البرمجية الأمنية إلى تعطُّل منطق العمل أو الاختبارات في المراحل اللاحقة.

إجراءات وقائية للاختبارات الآلية: التحقّق المستمر من صحة الحزم الاختبارية المحلية وبيئات وضع الحماية المعزولة للعمليات

تجميع بيانات الامتثال يدويًا: تجميع النتائج يدويًا في مستندات ثابتة لمراجعات التدقيق.

القياس عن بُعد الموحّد وSARIF (cm report -f sarif): تصدير فوري لـ OASIS SARIF v2.1.0 ولوحات بيانات HTML وإحصاءات الرموز المميّزة.

الخطوات التالية

🚀 مواصلة سلسلة CodeMender:

الجزء الثاني: تأمين مسار CI/CD باستخدام CodeMender: تعرَّف على كيفية أتمتة عمليات الفحص المستمر بدون واجهة مستخدم، ودمج لوحة بيانات SARIF، وطلبات السحب ذاتية الإصلاح في GitHub Actions.

الجزء 3: البرمجة السريعة الآمنة باستخدام Antigravity وCodeMender: يمكنك الجمع بين تطوير الذكاء الاصطناعي التوليدي ومساعد أمان مستقل.

📖 استكشاف المستندات:

مستندات CodeMender على Google Cloud

حلول الأمان في Google Cloud

💡 تطبيق المهارات على مشاريعك الخاصة:

يمكنك تشغيل cm find . وcm fix على مستودعات Node.js أو Python أو Go أو Java أو Rust أو C/C++‎.