ארגז חול נועד להריץ קוד שאינך סומך עליו בלי שהוא יוכל לגעת בשאר המערכת. ברכיב ה-Generative UI של Prefab UI הארגז הזה היה מתועד כבידוד לקוד לא מהימן, אבל הופעל בפועל עם הרשאות קריאה, כתיבה וגישה לרשת ללא הגבלה. התוצאה היא שקוד שנשלח להרצה בארגז יכול לקרוא ולכתוב קבצים על השרת בהרשאות של המשתמש שמריץ אותו. הציון הוא 10 מתוך 10, והתיקון נמצא בגרסה 0.21.0.
מה החולשה?
המנגנון עצמו בנוי משכבות, וכדאי לעבור עליהן לפי הסדר. קוד Python שמגיע מהקורא רץ בתוך Pyodide, שהוא Python שהודר ל-WebAssembly, וזה בתורו רץ בתוך תהליך של Deno. Deno הוא סביבת הרצה שבה ההרשאות נקבעות בשורת ההפעלה: מה שלא ניתן במפורש אינו מותר. זה המקום שבו הבידוד היה אמור להתקיים.
לפי הרשומה, בגרסאות 0.14.0 עד 0.20.2 המשגר הפעיל את Deno עם שלוש ההרשאות הרחבות גם יחד, קריאה, כתיבה וגישה לרשת, בלי הגבלה. בנוסף, הרכיב שמריץ את הקוד השאיר את ממשק Deno חשוף על האובייקט הגלובלי של JavaScript. ומפני שמודול ה-js של Pyodide נותן לקוד Python גישה לאותו אובייקט גלובלי, הקוד שרץ בארגז יכול פשוט לקרוא לפונקציות של Deno בעצמו, ובכללן קריאה וכתיבה של קבצים.
כלומר הבידוד לא נפרץ. הוא לא הופעל. ההרשאות היו שם כל הזמן, והדרך אליהן נשארה פתוחה.
לרשומה יש גם פרט על התמדה. מפני שהקוד יכול לכתוב קבצים בהרשאות המשתמש של השרת, הוא יכול לכתוב קובץ מסוג pth לתוך ספריית החבילות של סביבת ה-Python של השרת, וקובץ כזה נטען אוטומטית. כך הרצת הקוד אינה מסתיימת עם הבקשה שיצרה אותה.
הדרך המרוחקת אל הרכיב עוברת לפי הרשומה דרך FastMCP. הספק שנקרא GenerativeUI רושם שם כלי בשם generate_prefab_ui, והכלי הזה מעביר את הארגומנט code שהתקבל ממנו אל אותו ארגז חול. בשרת FastMCP שלא הוגדרה בו הזדהות, כל מי שמגיע אל השרת יכול לקרוא לכלי. בשרת שהוגדרה בו הזדהות, כל מי שמורשה לקרוא לכלים. הסיווג הוא CWE-94.
מי מושפע?
לפי הרשומה, גרסאות prefab-ui מ-0.14.0 ועד 0.20.2, והאישור הוא על 0.20.2.
החשיפה כאן צרה משמה של החולשה, ושווה להיות מדויקים. הרשומה מציינת שתכונת Generative UI היא opt-in, כלומר לא פעילה כברירת מחדל ומישהו צריך להדליק אותה, ושעל המכונה צריך להיות מותקן Deno. שני התנאים האלה ביחד מוציאים מהתמונה כל מי שהתקין את החבילה ולא נגע בתכונה הזאת.
זה אינו מוצר לקהל הרחב אלא ספרייה למפתחים, ובישראל זה אומר צוותי פיתוח שבונים ממשקים שנוצרים על ידי מודל שפה. אם אתם מפעילים שרת FastMCP עם הספק GenerativeUI, זה העמוד שנוגע לכם. אם אתם משתמשים באתר או באפליקציה שמישהו אחר בנה, אין לכם כאן מה לעשות.
הצירוף שהופך את הציון ל-10 הוא שרת FastMCP שחשוף ואין בו הזדהות. במצב הזה, לפי הרשומה, מי שמגיע אל השרת יכול לקרוא לכלי, ומשם לשלוח קוד.
האם מנוצלת בפועל?
אין דיווח על ניצול. החולשה אינה רשומה, נכון לעדכון האחרון של העמוד, בקטלוג ה-KEV של CISA, סוכנות הסייבר האמריקאית, שמאגד את החולשות שיש עליהן ראיות לשימוש בפועל.
הרשומה פורסמה ב-1 בנובמבר 2026, והמקורות שהיא מפנה אליהם הם מאגר הקוד של המוצר עצמו, ובכללם הקומיט שמתקן את החולשה ובקשת המשיכה 538. כלומר הפרטים הטכניים גלויים לקריאה, וזה מצב רגיל בפרויקט בקוד פתוח.
מה עושים?
1. עדכנו את prefab-ui ל-0.21.0 ומעלה. זה מספר הגרסה שהרשומה נוקבת בו כגרסה המתקנת.
2. בדקו אם תכונת Generative UI מופעלת אצלכם בכלל, ואם Deno מותקן על המכונה. אלה שני התנאים שהרשומה מציינת, ואם אחד מהם אינו מתקיים אצלכם, החשיפה שלכם לחולשה הזאת אינה קיימת.
3. אם אתם מפעילים שרת FastMCP, בדקו שהוגדרה בו הזדהות. לפי הרשומה, שרת בלי הזדהות פתוח לכל מי שמגיע אליו, וזה ההבדל בין חולשה שדורשת גורם מורשה לחולשה שאינה דורשת דבר. זאת בדיקה ששווה לעשות בלי קשר לחולשה הזאת.
4. אם אתם מריצים גרסה חשופה ולא רק מחזיקים אותה, חפשו קובצי pth שלא אתם הוספתם בספריית החבילות של סביבת ה-Python של השרת. זאת דרך ההתמדה שהרשומה מתארת במפורש, ולכן זה מקום קונקרטי לבדוק בו.
5. הלקח שמעבר לגרסה: הרשומה מתארת תכונה שתועדה כבידוד אך הופעלה בלי שההגבלות נאכפו. אם אתם מריצים קוד לא מהימן במקום אחר אצלכם, שווה לבדוק מה ההרשאות שבהן התהליך הזה מופעל בפועל, ולא מה שכתוב שהוא אמור לעשות. התיקון עצמו מראה את הכיוון: ביטול ההרשאות לפני שמתקבל קוד, והגבלת הגישה לרשת לכתובת אחת.