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 من مكوّنَين رئيسيَين في البنية:
منصة مستضافة متعددة الوكلاء: نظام مستضاف متعدد الوكلاء يعمل على Google Cloud وينفّذ منطق الأعمال الأساسي للأمان، وهندسة طلبات النماذج اللغوية الكبيرة، والاستدلال الأمني.
واجهة سطر الأوامر (CLI) للعميل المحلي وبرنامج Sandbox Daemon (cm): عميل يعمل في Google Cloud Shell ويعمل كواجهة سطر أوامر (لإصدار أوامر مثل cm find وcm verify وcm fix) وبرنامج daemon محلي (لتنفيذ الأوامر بأمان نيابةً عن الوكيل داخل وضع الحماية المعزول على مستوى العملية).
الإمكانات الأساسية الثلاث للمعالجة

يتعامل 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 الثغرات الأمنية من خلال دورة حياة رسمية تتألف من أربع حالات:
حالة النتيجة | المعنى والتعامل مع الانتقال |
| تم اكتشاف الثغرة الأمنية (أو استيرادها) ولكن لم يتم التحقّق منها أو تصحيحها أو رفضها بعد. |
| أنشأ CodeMender رمز تصحيح، وطبّق الاختلاف، وتحقّق من نجاح حِزم الإصدار/الاختبار وفشل عمليات الاستغلال. |
| تم وضع علامة "غير نشط" بسبب انخفاض مستوى الثقة أو عدم وجود تهديد أو التحقّق من أنّها نتيجة موجبة خاطئة. يؤدي هذا الخيار إلى كتم صوت التنبيهات المستقبلية. |
| تمت إعادة رصد ثغرة |
تصنيفات الخطورة
🔴 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 |
| بيان البيانات الوصفية | ملف YAML منظَّم يحدّد المعرّف الفريد العالمي (UUID) للنتيجة والعنوان ومستوى الخطورة ( |
| استراتيجية الوكيل | خطّة تحقّق وقائمة تحقّق مفصّلتان ينفّذهما محرّك الاستدلال في CodeMender بشكل مستقل |
| سجلّ تتبُّع التنفيذ | سجلّ تدقيق يتضمّن طابعًا زمنيًا ويسجّل كل طلب أداة ونقطة نهاية لطلب HTTP ونتيجة اختبار |
| سجلّ Helper Runner / Server | النص البرمجي المساعد الذي أنشأه الوكيل لبدء Juice Shop من أجل الاختبار، ومخرجات الخادم التي تم تسجيلها |
| Execution Wrapper / Standalone PoC | برنامج تضمين لبرنامج نصي Shell يشغّل الخدمة المستهدفة ويستدعي عميل PoC، ويتحقّق من صحة استجابات HTTP 200. |
| تحليل السبب الأساسي | ملخّص تنفيذي، وتحليل للثغرات الأمنية سطرًا بسطر، وتفصيل لطلبات SQL الأولية، واقتراحات حول تحديد معلَمات Sequelize. |
الخطوة 3: نظرة تفصيلية على أبرز ميزات مستندات إثبات الهوية
يكتب الوكيل هذه العناصر من جديد في كل عملية تشغيل، لذا تختلف محتوياتها الدقيقة في كل مرة. افتحها في "محرِّر Cloud Shell" (أو باستخدام cat) وابحث عن ما يلي:
القطع الأثرية | ما يجب الانتباه له |
| المعرّف الكامل للنتيجة وعنوانها وخطورتها وموثوقيتها وعلاماتها، مثل |
| قائمة التحقّق التي اتّبعها الوكيل، بدءًا من قراءة الملف الذي تم الإبلاغ عنه وحتى كتابة نص إعادة الإنتاج. |
| الإجراءات والنتائج التي تم تسجيلها بطابع زمني، بما في ذلك نتيجة كل عملية تشغيل للنص البرمجي لإعادة الإنتاج |
| نص إعادة الإنتاج المستقل: كيف يبدأ التطبيق، ونقطة النهاية التي يستهدفها، وكيف يقرر النجاح (يطبع |
| ملفات المساعدة التي أنشأها الوكيل لبدء Juice Shop للاختبار، ومخرجات هذا الخادم. |
| تحليل السبب الأساسي: السطر الذي يتضمّن ثغرة أمنية في |
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):

1. العنوان الرئيسي لمقاييس الأداء التنفيذية وبطاقات الوضع الأمني
البيانات الوصفية للعنوان: تعرض تفاصيل المستودع المستهدَف (OWASP Juice Shop) وإجمالي الملفات المصدر التي تم فحصها (684 files) والطابع الزمني لإنشاء التوقيت العالمي المتفق عليه.
شبكة بطاقات المقاييس: تقدّم نظرة عامة فورية عالية المستوى على إجمالي النتائج وتوزيعات الخطورة (CRITICAL وHIGH وMEDIUM وLOW) وإجمالي الثغرات الأمنية التي تم إصلاحها (FIXED).
2. جدول ملخّص النتائج التفاعلي
مصفوفة الثغرات الأمنية: تعرض جدولاً قابلاً للفلترة يحتوي على ID وSeverity وStatus (OPEN مقابل FIXED) وCWE Type وFile Location وVulnerability Title وConfidence Score.
3. تحليل متعمّق للسبب الأساسي ومقتطف الرمز المصدر الذي يتضمّن ثغرة أمنية
تحليل قابل للتصغير (RCA): يؤدي النقر على أي صف من صفوف النتائج إلى توسيع "تحليل السبب الأساسي" المفصّل الذي تم إنشاؤه بواسطة نموذج الاستدلال الأمني في Gemini.
مقتطف الرمز المصدر الذي يتضمّن ثغرة أمنية: يعرض أرقام الأسطر الدقيقة والرمز المصدر المميّز بالبنية حول نقطة الاستقبال التي تتضمّن ثغرة أمنية.
4. الاختلافات في رموز التصحيح التي تم إنشاؤها بواسطة الذكاء الاصطناعي
عرض الاختلافات الموحّد: بالنسبة إلى الثغرات الأمنية التي تم إصلاحها (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 ( |
التحقّق اليدوي من إثبات جدوى الفكرة: إنشاء حمولات curl مخصّصة ونصوص برمجية للهجمات لتأكيد الثغرات الأمنية | أدلة الاستغلال المبرمَجة ( |
إعادة تصميم الرموز البرمجية يدويًا مع مخاطر عالية: تصحيح طلبات البحث المعقّدة في قاعدة البيانات يدويًا، ما يؤدي غالبًا إلى حدوث أخطاء في البنية أو أخطاء أثناء التشغيل | Idiomatic Patch Synthesis ( |
مخاطر تراجع الإنتاج: غالبًا ما تؤدي التصحيحات البرمجية الأمنية إلى تعطُّل منطق العمل أو الاختبارات في المراحل اللاحقة. | إجراءات وقائية للاختبارات الآلية: التحقّق المستمر من صحة الحزم الاختبارية المحلية وبيئات وضع الحماية المعزولة للعمليات |
تجميع بيانات الامتثال يدويًا: تجميع النتائج يدويًا في مستندات ثابتة لمراجعات التدقيق. | القياس عن بُعد الموحّد وSARIF ( |
الخطوات التالية
🚀 مواصلة سلسلة CodeMender:
الجزء الثاني: تأمين مسار CI/CD باستخدام CodeMender: تعرَّف على كيفية أتمتة عمليات الفحص المستمر بدون واجهة مستخدم، ودمج لوحة بيانات SARIF، وطلبات السحب ذاتية الإصلاح في GitHub Actions.
الجزء 3: البرمجة السريعة الآمنة باستخدام Antigravity وCodeMender: يمكنك الجمع بين تطوير الذكاء الاصطناعي التوليدي ومساعد أمان مستقل.
📖 استكشاف المستندات:
مستندات CodeMender على Google Cloud
💡 تطبيق المهارات على مشاريعك الخاصة:
يمكنك تشغيل cm find . وcm fix على مستودعات Node.js أو Python أو Go أو Java أو Rust أو C/C++.