איך מאבטחים את האפליקציה באמצעות CodeMender

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

מנקודת המבט של המשתמש, CodeMender מורכב משני רכיבים ארכיטקטוניים עיקריים:

פלטפורמה מרובת סוכנים באירוח: מערכת מרובת סוכנים באירוח שפועלת ב-Google Cloud ומפעילה לוגיקה עסקית של אבטחת ליבה, הנדסת פרומפטים של LLM והסקת מסקנות בנושא אבטחה.

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

3 היכולות העיקריות לתיקון

תהליך תיקון אוטונומי של CodeMender

‫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 עוקב אחרי נקודות חולשה באמצעות מחזור חיים רשמי של ארבעה מצבים:

מצב הממצא

משמעות וטיפול במעבר

OPEN

נקודת החולשה התגלתה (או יובאה) אבל עדיין לא אומתה, תוקנה או נדחתה.

FIXED

‫CodeMender יצר תיקון, החיל את ההשוואה ואימת שחבילות ה-build/חבילת מקרים לבדיקה עוברות ושהניצול נכשל.

DISMISSED

סומן כלא פעיל בגלל רמת סמך נמוכה, מחוץ למודל האיומים או אומת כחיובי מוטעה. השתקת התראות עתידיות.

REOPENED

פגם מסוג FIXED או DISMISSED שזוהה בעבר, זוהה שוב בסריקה מאוחרת יותר (מצביע על רגרסיה בקוד).

סיווגים של רמות חומרה

🔴 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

קובץ פריט מידע

קטגוריה

מטרה

info.yaml

מניפסט של מטא-נתונים

קובץ YAML מובנה שמגדיר את המזהה הייחודי האוניברסלי (UUID), השם, החומרה (CRITICAL), רמת הסבירות (certain) ותגי ה-CWE‏ (cwe-89) של הממצא.

PLAN.md

אסטרטגיית הסוכן

תוכנית אימות ורשימת משימות מפורטות שמנוע החשיבה הרציונלית של CodeMender מריץ באופן אוטונומי.

LOG.md

יומן מעקב אחרי הרצה

נתיב ביקורת עם חותמות זמן שמתעד כל קריאת API לכלי, נקודת קצה (endpoint) של בקשת HTTP ותוצאת בדיקה.

server_runner.js / server.log

יומן השרת / Helper Runner

סקריפט עזר שהנציג יצר כדי להפעיל את Juice Shop לבדיקה, ופלט השרת שנתפס.

exploit.sh

‫Execution Wrapper / Standalone PoC

מעטפת של סקריפט מעטפת שמפעילה את שירות היעד וקוראת ללקוח ה-PoC, ומאמתת את התגובות של HTTP 200.

REPORT.md

ניתוח שורש הבעיה

תקציר מנהלים, ניתוח נקודות חולשה שורה אחר שורה, פירוט SQL גולמי והמלצות להגדרת פרמטרים של Sequelize.

שלב 3: הסבר מפורט על הדגשים של פריטי המידע שנוצרו בתהליך האימות

הסוכן כותב את פריטי המידע האלה מחדש בכל הפעלה, כך שהתוכן המדויק שלהם משתנה בכל פעם. פותחים אותם ב-Cloud Shell Editor (או באמצעות cat) ומחפשים את הדברים הבאים:

Artifact

מה כדאי לבדוק

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. בשלב הבא תמנעו את ההוספה שלהם ל-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):

סקירה כללית על מרכז הבקרה של CodeMender לתאימות אבטחה

1. כרטיסי כותרת וכרטיסי מצב של מדדים למנהלים

כותרת המדדים למנהלים וכרטיסי המצב של CodeMenderמטא-נתונים של הכותרת: מציג את פרטי מאגר היעד (OWASP Juice Shop), את המספר הכולל של קובצי המקור שנסרקו (684 files) ואת חותמת הזמן של היצירה ב-UTC.

רשת כרטיסי המדדים: סקירה כללית מיידית ברמה גבוהה של סך כל הממצאים, התפלגות רמות החומרה (CRITICAL,‏ HIGH,‏ MEDIUM,‏ LOW) וסך כל נקודות החולשה שתוקנו (FIXED).

2. טבלת סיכום אינטראקטיבית של הממצאים

טבלת סיכום הממצאים של CodeMenderמטריצת נקודות החולשה: טבלה שאפשר לסנן, שכוללת את ID,‏ Severity,‏ Status (OPEN לעומת FIXED),‏ CWE Type,‏ File Location,‏ Vulnerability Title ו-Confidence Score.

3. ניתוח מעמיק של שורש הבעיה וקטע קוד המקור הפגיע

‫ניתוח שורש הבעיה וקטע קוד ב-CodeMenderניתוח שניתן לכווץ (RCA): לחיצה על שורת ממצא כלשהי מרחיבה את ניתוח שורש הבעיה המפורט שסונתז על ידי מודל החשיבה הרציונלית של Gemini Security.

קטע קוד מקור פגיע: מוצגים מספרי שורות מדויקים וקוד מקור עם הדגשת תחביר מסביב ל-sink הפגיע.

4. הבדלים בין תיקוני קוד שנוצרו על ידי AI לתיקון בעיות

CodeMender Synthesized Remediation Patch Diffתצוגת השוואה מאוחדת: בפרצות שתוקנו (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 ‏(cm find .): סריקה מעמיקה של מאגרים, שמותאמת להקשר ומופעלת על ידי מודלים של Gemini.

אימות ידני של הוכחת היתכנות (PoC): יצירת סקריפטים של התקפות ונתונים מותאמים אישית של curl כדי לאשר נקודות חולשה.

הוכחות אוטומטיות לניצול פרצות (cm verify ): סינתזה אוטומטית של תוכניות אימות, יומנים וסקריפטים של מעטפת שניתנים להפעלה.

ארגון מחדש ידני של קוד בסיכון גבוה: תיקון ידני של שאילתות מורכבות במסד נתונים, שלעיתים קרובות גורם לשגיאות תחביר או לשגיאות זמן ריצה.

‫Idiomatic Patch Synthesis ‏(cm fix ): יצירת הבדלים בהתאם להקשר, שמותאמת ל-ORM ולתקני המסגרת הקיימים.

סיכונים של רגרסיה בסביבת הייצור: תיקוני אבטחה משבשים לעיתים קרובות את הלוגיקה העסקית או את הבדיקות במורד הזרם.

אמצעי הגנה לבדיקות אוטומטיות: אימות רציף מול חבילות מקרים לבדיקה מקומיות וארגזי חול של תהליכים מבודדים.

אוספי תאימות ידניים: צבירה ידנית של ממצאים במסמכים סטטיים לבדיקות ביקורת.

‫Standardized Telemetry & SARIF (cm report -f sarif): ייצוא מיידי של OASIS SARIF v2.1.0, מרכזי בקרה ב-HTML וניתוח טוקנים.

השלבים הבאים

🚀 המשך הטרילוגיה של CodeMender:

חלק 2: אבטחת צינור עיבוד הנתונים של CI/CD באמצעות CodeMender – אוטומציה של סריקה רציפה ללא ממשק משתמש, שילוב של לוח הבקרה של SARIF ובקשות משיכה לתיקון עצמי ב-GitHub Actions.

חלק 3: תכנות מאובטח בשיטת Vibe coding באמצעות Antigravity ו-CodeMender – שילוב של פיתוח באמצעות AI גנרטיבי עם עוזר דיגיטלי אוטונומי לאבטחה.

📖 עיון במסמכי התיעוד:

מסמכי התיעוד של CodeMender ב-Google Cloud

Google Cloud Security

💡 יישום בפרויקטים שלכם:

מריצים את cm find . ו-cm fix במאגרים שלכם ב-Node.js,‏ Python,‏ Go,‏ Java,‏ Rust או C/C++‎.