מודול WebAssembly שרץ תחת Wasmtime אמור להיות סגור בתוך תא, ולא לגעת בשום דבר מחוץ לו. בגרסאות שקודמות ל-36.0.19, ל-48.0.7 ול-49.0.4, ועל מעבדי ARM בלבד, מודול שבנוי בצורה מסוימת גורם למנוע לקפוץ לנקודה בקוד שלא הייתה אמורה להיות זמינה לו, ומשם לצאת החוצה. הציון הוא 9.9 מתוך 10, ולא ידוע על ניצול בשטח.

מה החולשה?

כשתוכנית צריכה לבחור בין הרבה מאוד אפשרויות לפי ערך אחד, בדיקה של אפשרות אחרי אפשרות תהיה איטית מדי. הפתרון המקובל הוא טבלה: רשימה שבה כל אפשרות היא שורה, ובכל שורה רשומה הכתובת שאליה צריך להמשיך. הערך שהתקבל משמש כמספר השורה, התוכנית קוראת משם את הכתובת וקופצת אליה. ב-WebAssembly ההוראה שבונה מבנה כזה נקראת br_table.

הכשל מופיע כשהטבלה הזאת ענקית. לפי הרשומה, מעל כ-256,000 יעדים, המהדר Cranelift מייצר על ARM הסתעפות מותנית שמצביעה על היעד הלא נכון. הטבלה חוקית, המודול חוקי, והתרגום לקוד מכונה הוא זה שיוצא עקום.

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

הסיווג הרשמי הוא CWE-691, ניהול לקוי של זרימת הבקרה. זרימת בקרה היא פשוט הסדר שבו הפקודות מתבצעות, מי בא אחרי מי. בידוד של קוד זר נשען על כך שהסדר הזה נקבע בידי המנוע ולא בידי האורח, ובמקרה הזה האורח מצליח להשפיע עליו.

מי מושפע?

כאן יש תנאי שמצמצם משמעותית את התמונה: הרשומה מגבילה את החולשה למנועים שרצים על aarch64, כלומר ARM בגרסת 64 ביט, ומשתמשים ב-Cranelift שהוא ברירת המחדל. מי שמריץ את אותה גרסת Wasmtime על מעבד x86 אינו בטווח של החולשה הספציפית הזאת.

הגרסאות המתקנות הן שלוש, 36.0.19, 48.0.7 ו-49.0.4, והן מייצגות שלושה ענפי תחזוקה נפרדים. התיקון הוחזר לכל אחד מהם בנפרד, כך שאין כאן גרסה אחת נכונה לכולם אלא גרסה נכונה לכל ענף.

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

האם מנוצלת בפועל?

לא. לא פורסם דיווח על שימוש בחולשה מחוץ למחקר, והיא אינה נכללת ברשימת החולשות המנוצלות שמנהלת סוכנות הסייבר האמריקאית CISA.

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

מה עושים?

1. קודם כול בדקו על איזו ארכיטקטורה המערכת רצה. אם אתם על x86, החולשה הזאת אינה נוגעת לכם ואפשר לתעדף בהתאם. אם אתם על ARM, המשיכו לסעיף הבא.

2. עדכנו לגרסה המתקנת בענף שלכם: 36.0.19, 48.0.7 או 49.0.4. בחרו לפי הענף שאתם נמצאים בו כרגע, ולא לפי המספר הגדול ביותר ברשימה.

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

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