1. לפני שמתחילים
⏱️ משך הזמן: 03:00
ברוכים הבאים ל-Codelab המעשי אבטחת האפליקציה באמצעות CodeMender ב-Gemini Enterprise Agent Platform של Google Cloud.
בסדנה הזו תתנסו בתפקיד של Cloud Security Engineer, ותקבלו משימה לבצע ביקורת ולאבטח את OWASP Juice Shop – אפליקציית אינטרנט פגיעה בכוונה, שנבנתה באמצעות Node.js, Express, TypeScript ו-Angular, ונחשבת לסטנדרט בתחום.
כלי סריקה מסורתיים לאבטחה (SAST/DAST) מציפים את צוותי הפיתוח באלפי ממצאי אבטחה סטטיים, שיעורים גבוהים של תוצאות חיוביות מוטעות ואפס תיקוני קוד שניתן ליישם. המפתחים משקיעים שעות במיון יומנים, במעקב אחרי זרימת הנתונים ובכתיבה ידנית של תיקונים, שלעיתים קרובות משבשים את ההתנהגות הקיימת של האפליקציה.
CodeMender משנה את כללי המשחק בתחום אבטחת הקוד, באמצעות מעטפת אג'נטית שעברה כוונון מדויק סביב מודלי ה-LLM של Gemini מבית Google. CodeMender משתמש בהנחיות שפותחו על ידי Google DeepMind, במיומנויות אבטחה מיוחדות ובתזמור של כמה סוכנים, ופועל כשותף פיתוח אוטונומי מבוסס-AI לאבטחה. הוא מוצא, מאמת ומתקן נקודות חולשה בתוכנה ישירות במאגרי המקור המקומיים.
דרישות מוקדמות
- הבנה בסיסית של נקודות חולשה באפליקציות אינטרנט (עשרת סיכוני האבטחה המובילים של 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, בהתאם לתקני הארכיטקטורה הרשמיים של Google Cloud.
ארכיטקטורת המערכת: סוכן ודמון לקוח

מנקודת המבט של המשתמש, CodeMender מורכב משני רכיבים ארכיטקטוניים עיקריים:
פלטפורמה מרובת סוכנים באירוח: מערכת מרובת סוכנים באירוח שפועלת ב-Google Cloud ומפעילה לוגיקה עסקית של אבטחת ליבה, הנדסת פרומפטים של LLM והסקת מסקנות בנושא אבטחה.
Local Client CLI & Sandbox Daemon (cm): לקוח שפועל ב-Google Cloud Shell ומשמש גם כ-CLI (כדי להנפיק פקודות כמו cm find, cm verify, cm fix) וגם כדמון מקומי (כדי להריץ פקודות באופן בטוח בשם הסוכן בתוך ארגז חול מבודד ברמת התהליך).
3 היכולות העיקריות לתיקון

CodeMender מטפל באבטחת הקוד בשלושה שלבים משולבים:
איתור פגיעויות (cm find): סורק בסיסי קוד באמצעות LLM בהנחיית הסוכן, תוך מינוף כלי אבטחה מיוחדים והנדסת פרומפטים כדי למקד את המודל בפגמי אבטחה. (לחלופין, אפשר לייבא ממצאים מכלי סריקה חיצוניים לאבטחה).
אימות נקודות חולשה (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
נכנסים למסוף Google Cloud בדפדפן.
בסרגל הניווט העליון, לוחצים על הלחצן Activate 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
בשלב הזה תפעילו את Cloud APIs הנדרשים של Google Cloud, תתנו הרשאות IAM באמצעות gcloud, תורידו ותתקינו את הקובץ הבינארי של ה-CLI של cm ותגדירו את פרטי הכניסה ב-Application Default Credentials (ADC).
שלב 1: מפעילים את ממשקי ה-API הנדרשים של Google Cloud דרך gcloud
כדי להשתמש ב-CodeMender, צריך להפעיל את Agent Platform API (aiplatform.googleapis.com) ואת Cloud Resource Manager API (cloudresourcemanager.googleapis.com) ב-Gemini Enterprise Agent Platform.
ב-Cloud Shell או במסוף, מאחזרים את מזהה הפרויקט הפעיל (או בודקים את התפריט הנפתח של הפרויקט בחלק העליון של מסוף Google Cloud) ומפעילים את ממשקי ה-API הנדרשים של השירות:
# 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}
מוודאים שממשקי ה-API מופעלים:
gcloud services list --enabled --filter="name:(aiplatform.googleapis.com OR cloudresourcemanager.googleapis.com)"
שלב 2: נותנים הרשאות IAM דרך gcloud
כדי לקיים אינטראקציה עם מנוע החשיבה הרציונלית בענן של CodeMender, למשתמשים ולחשבונות השירות צריך להיות מוקצה התפקיד roles/aiplatform.user (משתמש בפלטפורמת הסוכנים) ב-IAM.
הקצאת תפקיד IAM לחשבון המשתמש באמצעות CLI
# Get your active authenticated gcloud account email
USER_EMAIL=$(gcloud config get-value account)
# Add IAM policy binding for user account
gcloud projects add-iam-policy-binding ${PROJECT_ID} \
--member="user:${USER_EMAIL}" \
--role="roles/aiplatform.user"
שלב 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: מוודאים שהתקנת ה-CLI של cm בוצעה
מריצים את הפקודה cm --version כדי לוודא שהקובץ הבינארי של ה-CLI הותקן כמו שצריך:
cm --version
הפלט אמור להיראות כך:
cm version 0.17.0
שלב 5: הגדרת Application Default Credentials (ADC) ב-Google Cloud
מגדירים את Application Default Credentials (ADC) ב-Google Cloud כדי ש-cm יוכל לאמת בקשות למנוע החשיבה הרציונלית בענן:
gcloud auth application-default login
תופיע תיבת דו-שיח מודאלית לאישור בשם Authorize 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). הקובץ הזה מגדיר את גבולות המדיניות, את כללי הכללת הקבצים ואת ה-hooks לאימות הבדיקות:
# 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 Scan (
--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 יצר תיקון, החיל את ההשוואה ואימת שחבילות ה-build/חבילת מקרים לבדיקה עוברות ושהניצול נכשל. |
| סומן כלא פעיל בגלל רמת סמך נמוכה, מחוץ למודל האיומים או אומת כחיובי מוטעה. השתקת התראות עתידיות. |
| פגם מסוג |
סיווגים של רמות חומרה
🔴 CRITICAL: סיכון חמור ומיידי (למשל, הרצת קוד מרחוק, הזרקת SQL לא מאומתת) שניתן להגיע אליו ישירות מגבולות לא מהימנים.
🟠 HIGH: פגם חמור (למשל, קריאה שרירותית של מסד נתונים, הרחבת הרשאות) שדורש הקשר ספציפי של משתמש או תנאים משורשרים.
🟡 MEDIUM: סיכון בינוני עם היקף מוגבל או שנדרשת אינטראקציה של המשתמש (למשל, הפניה אוטומטית פתוחה, CSRF).
🔵 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 דקות להרצת שלבי הכלי האוטונומי, להפעלת שירותים שפועלים ברקע ולהרצת סקריפטים של ניצול פרצות (PoC) בזמן אמת):
# 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
קובץ פריט מידע | קטגוריה | מטרה |
| מניפסט של מטא-נתונים | קובץ YAML מובנה שמגדיר את המזהה הייחודי האוניברסלי (UUID), השם, החומרה ( |
| אסטרטגיית הסוכן | תוכנית אימות ורשימת משימות מפורטות שמנוע החשיבה הרציונלית של CodeMender מריץ באופן אוטונומי. |
| יומן מעקב אחרי הרצה | נתיב ביקורת עם חותמות זמן שמתעד כל קריאת API לכלי, נקודת קצה (endpoint) של בקשת HTTP ותוצאת בדיקה. |
| יומן השרת / Helper Runner | סקריפט עזר שהנציג יצר כדי להפעיל את Juice Shop לבדיקה, ופלט השרת שנתפס. |
| Execution Wrapper / Standalone PoC | מעטפת של סקריפט מעטפת שמפעילה את שירות היעד וקוראת ללקוח ה-PoC, ומאמתת את התגובות של HTTP 200. |
| ניתוח שורש הבעיה | תקציר מנהלים, ניתוח נקודות חולשה שורה אחר שורה, פירוט SQL גולמי והמלצות להגדרת פרמטרים של Sequelize. |
שלב 3: הסבר מפורט על הדגשים של פריטי המידע שנוצרו בתהליך האימות
הסוכן כותב את פריטי המידע האלה מחדש בכל הפעלה, כך שהתוכן המדויק שלהם משתנה בכל פעם. פותחים אותם ב-Cloud Shell Editor (או באמצעות cat) ומחפשים את הדברים הבאים:
Artifact | מה כדאי לבדוק |
| המזהה המלא של הממצא, השם, רמת החומרה, רמת הסבירות והתגים, כמו |
| רשימת המשימות שהסוכן ביצע, מקריאת הקובץ שדווח ועד לכתיבת הסקריפט לשחזור. |
| פעולות ותוצאות עם חותמות זמן, כולל התוצאה של כל הרצה של סקריפט השחזור. |
| הסקריפט העצמאי לשחזור: איך הוא מפעיל את האפליקציה, לאיזו נקודת קצה הוא מטרגט ואיך הוא קובע אם הפעולה הצליחה (הוא מדפיס את |
| קבצי עזר שהנציג יצר כדי להפעיל את 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. בשלב הבא תמנעו את ההוספה שלהם ל-commit.
וגם cm vcs diff:
🔍 Running diff in /home/user/juice-shop: git diff
diff --git a/routes/login.ts b/routes/login.ts
index fb9fce3..57f3afe 100644
--- a/routes/login.ts
+++ b/routes/login.ts
@@ -31,7 +31,14 @@ export function login () {
return (req: Request, res: Response, next: NextFunction) => {
verifyPreLoginChallenges(req) // vuln-code-snippet hide-line
- models.sequelize.query(`SELECT * FROM Users WHERE email = '${req.body.email || ''}' AND password = '${security.hash(req.body.password || '')}' AND deletedAt IS NULL`, { model: UserModel, plain: true }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
+ models.sequelize.query('SELECT * FROM Users WHERE email = :email AND password = :password AND deletedAt IS NULL', {
+ replacements: {
+ email: typeof req.body?.email === 'string' ? req.body.email : '',
+ password: security.hash(typeof req.body?.password === 'string' ? req.body.password : '')
+ },
+ model: UserModel,
+ plain: true
+ }) // vuln-code-snippet vuln-line loginAdminChallenge loginBenderChallenge loginJimChallenge
.then((authenticatedUser) => { // vuln-code-snippet neutral-line loginAdminChallenge loginBenderChallenge loginJimChallenge
const user = utils.queryResultToJson(authenticatedUser)
if (user.data?.id && user.data.totpSecret !== '') {
שלב 3: מעבירים את התיקון המאומת ל-staging באמצעות cm vcs stage
אחרי שבודקים את ההבדלים המאוחדים ומוודאים שהתיקון עומד בתקני האיכות והאבטחה, מעבירים את התיקון לשלב ה-commit. מכיוון שהפקודה cm vcs stage מריצה את git add -A, היא מעבירה לשלב הביניים כל שינוי בעץ העבודה, כולל הרשומות .exploit/ ו-.cm_project שלא במעקב משלב 2. קודם מוסיפים אותם לקובץ .git/info/exclude, קובץ התעלמות מקומי בלבד ש-Git אף פעם לא מבצע לו commit, כך שרק התיקון מועבר ל-stage:
# 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 לאזור ה-staging באמצעות git restore --staged .exploit .cm_project. הקבצים נשארים בדיסק, הם רק מוסרים מסביבת ה-Staging.
שלב 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" במאגר, ואז מבצעים שוב commit.
9. אימות תיקונים, ניהול סשנים וייצוא דוחות (דוח cm)
⏱️ משך הזמן: 08:00
אחרי שמחילים תיקון אבטחה שנוצר על ידי AI, חשוב לנהל סשנים פעילים, לבדוק את נתוני השימוש בטוקנים וליצור דוחות תאימות לאבטחה ארגונית באמצעות 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, לוחצים על הלחצן Web Preview (סמל עם עין/מסך) ➔ Preview on port 8080 כדי להציג את לוח הבקרה האינטראקטיבי של התאימות בדפדפן.
(אפשרות חלופית) בסייר הקבצים של Cloud Shell Editor, לוחצים לחיצה ימנית על report.html ואז על Download כדי להציג את הקובץ בדפדפן המקומי.
שלב 5: תכונות עיקריות של דוח ה-HTML האינטראקטיבי שנוצר
בהמשך מפורטים הרכיבים העיקריים של דוח ה-HTML האינטראקטיבי שנוצר (report.html):

1. כרטיסי כותרת וכרטיסי מצב של מדדים למנהלים
מטא-נתונים של הכותרת: מציג את פרטי מאגר היעד (OWASP Juice Shop), את המספר הכולל של קובצי המקור שנסרקו (684 files) ואת חותמת הזמן של היצירה ב-UTC.
רשת כרטיסי המדדים: סקירה כללית מיידית ברמה גבוהה של סך כל הממצאים, התפלגות רמות החומרה (CRITICAL, HIGH, MEDIUM, LOW) וסך כל נקודות החולשה שתוקנו (FIXED).
2. טבלת סיכום אינטראקטיבית של הממצאים
מטריצת נקודות החולשה: טבלה שאפשר לסנן, שכוללת את ID, Severity, Status (OPEN לעומת FIXED), CWE Type, File Location, Vulnerability Title ו-Confidence Score.
3. ניתוח מעמיק של שורש הבעיה וקטע קוד המקור הפגיע
ניתוח שניתן לכווץ (RCA): לחיצה על שורת ממצא כלשהי מרחיבה את ניתוח שורש הבעיה המפורט שסונתז על ידי מודל החשיבה הרציונלית של Gemini Security.
קטע קוד מקור פגיע: מוצגים מספרי שורות מדויקים וקוד מקור עם הדגשת תחביר מסביב ל-sink הפגיע.
4. הבדלים בין תיקוני קוד שנוצרו על ידי AI לתיקון בעיות
תצוגת השוואה מאוחדת: בפרצות שתוקנו (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 API
אם אתם לא מתכננים להשתמש בממשקי ה-API של CodeMender או של Agent Platform בפרויקט הזה לפיתוח נוסף, אתם יכולים להשבית את ממשקי ה-API של השירות:
gcloud services disable \
aiplatform.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=${PROJECT_ID}
11. מזל טוב
⏱️ משך הזמן: 02:00
מעולה! הפכתם בהצלחה את OWASP Juice Shop מאפליקציה עם נקודות חולשה מכוונות לבסיס קוד מאובטח ומוקשח באמצעות CodeMender בפלטפורמת Gemini Enterprise Agent של Google Cloud.
מה למדתם
תיקון אוטונומי במעגל סגור: CodeMender לא רק מתריע על בעיות, אלא גם מבצע מחזור חיים שלם של אבטחה באופן עצמאי – מגילוי מאגרים (cm find) ועד לאימות ניצול לרעה בארגז חול (cm verify) וסינתזה של תיקונים שנבדקו ברגרסיה (cm fix).
הוכחות ניצול מבוססות ראיות: על ידי לכידת ממצאי אימות מוחשיים (PLAN.md, LOG.md, exploit.sh, REPORT.md), CodeMender מבטל תוצאות חיוביות שגויות ומוכיח ניצול בעולם האמיתי לפני כתיבת קוד כלשהו.
תיקונים מותאמים להקשר ולשפה: במקום להחיל החלפות טקסט גנריות, סוכני ה-AI של Gemini מנתחים את ארכיטקטורת האפליקציה, את מודלי הנתונים ואת ה-ORM כדי ליצור תיקונים נקיים וקלים לתחזוקה (כמו שאילתות Sequelize עם פרמטרים) ששומרים על הלוגיקה העסקית הקיימת.
אמצעי בטיחות ובדיקה מובנים: כל תיקון מוצע מאומת באופן אוטומטי מול חבילות מקרים לבדיקה (npm test) ובודקי סוגים (tsc) בתוך ארגזי חול מבודדים של סביבת העבודה לפני שהשינויים מועברים לשלב הבא.
שינוי בדפוס החשיבה של המפתחים
תהליך עבודה ידני מסורתי של SAST | תיקון אוטונומי באמצעות CodeMender (cm) |
עייפות מהתראות: שעות שמוקדשות למיון דוחות רועשים עם שיעורים גבוהים של תוצאות חיוביות מוטעות. | Agentic Code Discovery ( |
אימות ידני של הוכחת היתכנות (PoC): יצירת סקריפטים של התקפות ונתונים מותאמים אישית של curl כדי לאשר נקודות חולשה. | הוכחות אוטומטיות לניצול פרצות ( |
ארגון מחדש ידני של קוד בסיכון גבוה: תיקון ידני של שאילתות מורכבות במסד נתונים, שלעיתים קרובות גורם לשגיאות תחביר או לשגיאות זמן ריצה. | Idiomatic Patch Synthesis ( |
סיכונים של רגרסיה בסביבת הייצור: תיקוני אבטחה משבשים לעיתים קרובות את הלוגיקה העסקית או את הבדיקות במורד הזרם. | אמצעי הגנה לבדיקות אוטומטיות: אימות רציף מול חבילות מקרים לבדיקה מקומיות וארגזי חול של תהליכים מבודדים. |
אוספי תאימות ידניים: צבירה ידנית של ממצאים במסמכים סטטיים לבדיקות ביקורת. | Standardized Telemetry & SARIF ( |
השלבים הבאים
🚀 המשך הטרילוגיה של CodeMender:
חלק 2: אבטחת צינור עיבוד הנתונים של CI/CD באמצעות CodeMender – אוטומציה של סריקה רציפה ללא ממשק משתמש, שילוב של לוח הבקרה של SARIF ובקשות משיכה לתיקון עצמי ב-GitHub Actions.
חלק 3: תכנות מאובטח בשיטת Vibe coding באמצעות Antigravity ו-CodeMender – שילוב של פיתוח באמצעות AI גנרטיבי עם עוזר דיגיטלי אוטונומי לאבטחה.
📖 עיון במסמכי התיעוד:
מסמכי התיעוד של CodeMender ב-Google Cloud
💡 יישום בפרויקטים שלכם:
מריצים את cm find . ו-cm fix במאגרים שלכם ב-Node.js, Python, Go, Java, Rust או C/C++.