בין 14 באוגוסט ל-8 בספטמבר עלו ל-npm שש גרסאות של vm2. ב-17 בספטמבר, תשעה ימים אחרי שהאחרונה כבר הייתה שם, פרסמה NVD שלושים רשומות CVE נגד הספרייה ביום אחד, ולמחרת עוד ארבע. שתים עשרה מהן בציון 10.

סקירה כללית

יש מוצרים שצריכים להריץ קוד שמישהו אחר כתב: פלטפורמות low-code, מנועי תבניות. הדרך הזולה ב-Node.js היא להריץ אותו באותו תהליך של השרת, בתוך שכבה שתמנע ממנו לגעת בכל השאר. לשכבה הזאת קוראים ארגז חול (sandbox), ו-vm2 היא המימוש הנפוץ שלה ב-Node. בשבוע שבין 13 ל-19 בספטמבר היא ירדה מ-npm 824,482 פעמים.

כשהקוד הזר מצליח בכל זאת לצאת מהשכבה ולהגיע אל התהליך שמריץ אותו, קוראים לזה בריחה מארגז החול. מהרגע הזה הוא כבר לא אורח. הוא השרת.

גל של 34 רשומות ביומיים נשמע כמו קריסה, והוא בעיקר תיעוד מרוכז. כולן הגיעו מ-VulnCheck, שפרסם אותן כ-CNA, וכולן מתארות גרסאות שכבר תוקנו: הטווחים נעצרים ב-3.12.0, אף אחת אינה נוקבת ב-3.12.2 שעלתה ל-npm ב-8 בספטמבר, ואף אחת לא נכנסה לקטלוג ה-KEV של CISA. זה הפרוטוקול של מחזור תיקונים שהסתיים, לא 34 דלתות שפתוחות עכשיו.

מזהה: CVE-2026-93603
סוג: הרצת קוד דרך בריחה מארגז החול (CWE-94)
מוצר: vm2, ספריית ארגז חול ל-Node
גרסאות מושפעות: הכול עד 3.12.0 ועד בכלל
גרסה מתוקנת: 3.12.1
ניצול בפועל: לא, אינה ברשימת ה-KEV של CISA

ציר זמן

14 באוגוסט 2026: גרסה 3.11.6 עולה ל-npm, ואחריה 3.11.7 ו-3.11.8 בתוך שבועיים.
1 עד 8 בספטמבר 2026: עולות 3.12.0, אחריה 3.12.1 שסוגרת את CVE-2026-93603, ואחריה 3.12.2.
17 ו-18 בספטמבר 2026: NVD מפרסמת 34 רשומות CVE נגד vm2, שלושים מהן ביום הראשון.

איך הניצול עובד

כדי שהקוד בארגז החול יוכל לעשות משהו שימושי, האפליקציה המארחת נותנת לו פונקציות משלה, ו-vm2 מוסר לא אותן אלא עטיפה שמתווכת כל קריאה. הבעיה מתחילה כשאחת מהן נכתבה בלי "use strict". ב-JavaScript, כשקוראים לפונקציה כזאת בלי לציין על איזה אובייקט היא פועלת, המנוע שותל שם בעצמו את הגלובלי של הסביבה שבה היא נכתבה, כלומר של המארחת.

הקוד בארגז החול קורא בדיוק כך. V8 שותל את הגלובלי של המארח, vm2 מקבל אותו כערך רגיל, עוטף אותו ומחזיר את העטיפה פנימה. משם הדרך קצרה: הגלובלי מוביל אל process, ודרכו אפשר לטעון את המודול שמריץ פקודות מערכת. לפי הרשומה, התנאי היחיד הוא שהאפליקציה חשפה לארגז החול לפחות פונקציה אחת שאינה strict.

ניתוח ציון ה-CVSS

ציון CVSS: 10

לציון המרבי צריך שני דברים יחד: התקיפה לא דורשת חשבון ולא קליק של אף אחד, והנזק לא נשאר ברכיב שנפרץ אלא עובר אל התהליך שמריץ אותו. בפועל הכול תלוי בשאלה אחת, האם המערכת שלכם באמת מריצה שם קוד של מישהו אחר.

איפה למצוא Proof of Concept (PoC)

קוד הדגמה פומבי לא אותר לאף אחת מ-34 הרשומות. ההסבר הטכני המפורט ביותר ל-CVE-2026-93603 נמצא בהודעה של VulnCheck, שמפרטת אילו צורות קריאה מפעילות את הבאג.

השאלה המעשית אינה באיזו חולשה מדובר אלא באיזו גרסה אתם, ו-3.12.2 יצאה ב-8 בספטמבר.