jQuery היא ספריית JavaScript שיושבת בתוך מספר עצום של אתרים, ובכל הגרסאות שלפני 3.5.0 יש בה חולשה עם פרט אחד חריג: לפי הרשומה, הקוד הזר עלול לרוץ גם אחרי שה-HTML עבר סינון. הציון הוא 6.9 מתוך 10, ומינואר 2025 החולשה רשומה כמנוצלת בפועל.
מה החולשה?
אתר שמציג תוכן שמשתמשים כתבו צריך להניח שחלק מהתוכן ינסה להיות קוד ולא טקסט. הדרך המקובלת להתמודד עם זה היא סינון: לפני שה-HTML נכנס לדף, מעבירים אותו דרך רכיב שמסיר ממנו את מה שעלול לרוץ. אחרי הסינון מניחים שהתוכן בטוח. בדיוק ההנחה הזאת היא מה שנשבר כאן.
לפי הרשומה, העברה של HTML שמכיל אלמנטים מסוג option ממקור שאינו מהימן לאחת מהפעולות של jQuery שמכניסות תוכן לדף, כמו html או append, עלולה להריץ קוד זר, וזאת גם אם התוכן סונן קודם. הרשומה אינה מפרטת את המנגנון הפנימי שמאפשר את זה, ולכן גם אנחנו לא נשלים אותו.
מה שכן אפשר להסביר הוא איך מצב כזה נוצר בכלל. הסינון בודק את ה-HTML כפי שהוא נראה ברגע הבדיקה. אם בשלב מאוחר יותר משהו מעבד או משנה את אותו HTML לפני שהדפדפן מפרסר אותו, הבדיקה שנעשתה אינה מתארת עוד את מה שבאמת ירוץ. הפער הזה, בין מה שנבדק לבין מה שהגיע לדפדפן, הוא המקום שבו קוד עובר. הרשומה מסמנת את החולשה כ-CWE-79, המשפחה שמכונה XSS.
הציון כאן נמוך מכל השאר בקטגוריה הזאת, ושווה להבין למה. הדירוג מסמן מורכבות גבוהה ודורש פעולה של המשתמש, הפגיעה בסודיות גבוהה ובשלמות נמוכה, ואין פגיעה בזמינות. אבל ציון בינוני בספרייה שנמצאת בכל מקום אינו אותו דבר כמו ציון בינוני במוצר אחד.
מי מושפע?
הרשומה מונה את jQuery מגרסה 1.0.3 ועד 3.5.0, וזה טווח של שנים רבות. אבל הנקודה המעשית אינה הטווח אלא איפה הספרייה יושבת: כמעט אף אחד אינו מתקין jQuery בעצמו. היא מגיעה בתוך תבנית של אתר, בתוך תוסף, או בתוך מוצר שקנו.
ולכן הרשומה מונה גם מוצרים שארזו אותה בתוכם. Drupal מופיע בשלושה טווחים, מ-7.0 עד 7.70, מ-8.7.0 עד 8.7.14 ומ-8.8.0 עד 8.8.6. מופיעים גם Oracle Communications Element Manager ו-Oracle Communications Session Report Manager בגרסאות 8.1.1, 8.2.0 ו-8.2.1.
זו התמונה שחשוב לקחת מכאן. ארגון שלא כתב שורת jQuery אחת בחיים שלו יכול להיות חשוף דרך מוצר שהוא רק מפעיל. בישראל זה נוגע לכל מי שמחזיק אתר שנבנה בשנים האלה, לסוכנויות שבנו אותם, ולמי שמריץ את מוצרי התקשורת של Oracle שברשימה.
האם מנוצלת בפועל?
כן. ב-23 בינואר 2025 נכנסה החולשה לקטלוג ה-KEV של סוכנות הסייבר האמריקאית CISA, רשימת החולשות שידוע שתוקפים משתמשים בהן בפועל, עם מועד תיקון של 13 בפברואר 2025 לרשויות הפדרליות בארצות הברית.
החולשה פורסמה באפריל 2020 ונכנסה לקטלוג כמעט חמש שנים אחר כך. בספרייה שארוזה בתוך אלפי מוצרים זה הגיוני: הגרסה הפגיעה ממשיכה לשבת בהתקנות קיימות הרבה אחרי שהספרייה עצמה תוקנה, כי מי שמעדכן אותה הוא היצרן של המוצר ולא מי שמפעיל אותו.
מה עושים?
אם אתם שולטים בספרייה עצמה, עדכנו ל-3.5.0 ומעלה. ההודעה על שחרור 3.5.0 מתארת את התיקון, וכדאי לקרוא גם את מדריך המעבר ל-3.5, כי המעבר כולל שינויים שעלולים לדרוש התאמה בקוד קיים.
אם אתם לא שולטים בה, וזה המצב של הרוב, השאלה הראשונה היא איזו גרסת jQuery בכלל רצה אצלכם ומי הביא אותה. חפשו אותה בתבנית של האתר, בתוספים, ובספריות שמוצר צד שלישי טוען. גרסה אחת ישנה שנשארה בתוסף שכוח מחזירה את החשיפה גם אם עדכנתם את המערכת עצמה.
ב-Drupal, גרסאות היעד שהרשומה מונה הן 7.70, 8.7.14 ו-8.8.6, לפי הענף שאתם עליו. במוצרי Oracle שברשימה התיקון מגיע דרך העדכון הרבעוני, והרשומה מקשרת לעדכוני אפריל 2021 ויולי 2021.
ולמי שאינו יכול לעדכן עכשיו: הימנעו מהעברת HTML שמקורו במשתמשים לפעולות שמכניסות תוכן לדף, כמו html ו-append. ושימו לב למה שהרשומה אומרת על הסינון, כי זו הנקודה שהכי קל לטעות בה כאן. סינון לבד אינו מספיק במקרה הזה, ולכן אין להסתמך עליו כעל ההגנה היחידה.