Handlebars היא אחת מספריות התבניות הנפוצות ב-JavaScript, והחולשה הזאת מאפשרת למי שיכול להזין לה קלט מסוג מסוים להריץ קוד על השרת. הציון הוא 9.8 מתוך 10, והתיקון נמצא בגרסה 4.7.9.
מה החולשה?
ספריית תבניות מקבלת תבנית, טקסט עם מקומות שמורים, ומזריקה לתוכה נתונים. כדי לעשות את זה היא קודם מפרסרת את התבנית למבנה שמתאר את חלקיה בצורה שנוח לעבוד איתה. למבנה הזה קוראים AST. אחר כך Handlebars מייצרת ממנו קוד JavaScript שמרכיב את הפלט בפועל.
הפונקציה שעושה את כל הדרך הזאת נקראת compile, והיא מקבלת שני סוגי קלט: תבנית כמחרוזת, או עץ AST מוכן. לפי הרשומה, בגרסאות 4.0.0 עד 4.7.8 השדה value של צומת מסוג NumberLiteral, הצומת שמייצג מספר בתוך התבנית, נכתב אל הקוד המיוצר כמו שהוא, בלי מרכאות ובלי סינון. מי שיכול למסור ל-compile עץ שהוא בנה בעצמו יכול לשתול שם, במקום מספר, מה שיבחר, והדבר הזה הופך לחלק מהקוד שרץ. הסיווג הוא CWE-94, הזרקת קוד.
התנאי כאן אינו הגדרה בהתקנה אלא דרך השימוש. יישום שמעביר ל-compile מחרוזת תבנית אינו בתיאור. יישום שמעביר אובייקט, למשל כזה שהתקבל מפירסור JSON שהגיע מבחוץ, הוא כן. זה גם מסביר את הציון: הווקטור מסמן שאין צורך בהרשאות ואין צורך בפעולה של משתמש, מפני שברגע שהנתיב הזה קיים ביישום הוא פתוח לכל מי שמגיע אליו.
מי מושפע?
לפי הרשומה, Handlebars מגרסה 4.0.0 ועד 4.7.8. בגרסה 4.7.9 זה תוקן.
החולשה הזאת אינה נוגעת לגולש אלא למי שמפתח. Handlebars יושבת בהרבה שרתי Node.js ובכלי בנייה, ולא פעם היא מגיעה כתלות של חבילה אחרת ולא כבחירה מודעת של מי שמתחזק את הפרויקט. ברשומה מופיע גם עדכון אבטחה של Red Hat, מה שמצביע על כך שהספרייה ארוזה גם בתוך מוצרים ולא רק נמשכת ישירות מ-npm.
בישראל זה נוגע לבתי תוכנה, לסטארטאפים ולכל צוות שמריץ Node.js בייצור. הגולש הפרטי אינו מתקין את זה אצלו, אבל שירות שהוא עובד איתו יכול להיות בנוי על זה.
האם מנוצלת בפועל?
נכון לעדכון האחרון של הדף הזה, החולשה אינה מופיעה בקטלוג ה-KEV של CISA, סוכנות הסייבר האמריקאית, שמרכז חולשות שידוע שתוקפים מנצלים אותן בשטח. היעדר מהקטלוג אינו עדות לכך שאין ניצול, אלא רק לכך שאין ידיעה כזאת.
מה שכן גלוי הוא התיקון. הרשומה מפנה גם להודעת האבטחה של הפרויקט, גם ל-commit שמבצע את התיקון וגם לעדכון של Red Hat. בחולשה שמביאה להרצת קוד בציון 9.8, commit שמראה בדיוק מה שונה הוא גם מפת דרכים למי שמחפש את הנתיב ההפוך.
מה עושים?
עדכנו את Handlebars ל-4.7.9. דף השחרור של הגרסה והודעת האבטחה של הפרויקט מתארים את התיקון. מי שעובד מול חבילות של Red Hat ימצא את העדכון בהודעה שלהם.
אם עדכון מיד אינו אפשרי, הרשומה מציעה שני מעקפים. הראשון הוא בדיקת טיפוס אחת לפני הקריאה: ודאו שמה שמועבר ל-compile הוא תמיד מחרוזת, ולעולם לא אובייקט ולא ערך שהגיע מפירסור JSON.
השני מתאים למי שמקמפל את התבניות מראש בזמן הבנייה. במקרה הזה אפשר להשתמש בשרת בגרסת הריצה בלבד של הספרייה, handlebars/runtime. שם הפונקציה compile אינה קיימת כלל, ולכן גם הנתיב שתואר כאן אינו קיים.
ובדקו אם Handlebars מגיעה אליכם כתלות עקיפה. חבילה שלא בחרתם מופיעה בעץ התלויות בדיוק כמו חבילה שבחרתם, והיא גם זו שנוטה להישאר בגרסה ישנה.