בתוסף WPC Product Bundles for WooCommerce, תוסף שמאפשר לחנות אינטרנטית למכור חבילה של כמה מוצרים יחד, התגלתה חולשה שקיבלה 7.2 מתוך 10. תוקף בלי חשבון בחנות יכול לשתול בה קוד שירוץ בדפדפן של מי שפותח אחר כך את דף ההזמנה. היא קיימת בכל הגרסאות עד 8.6.6 ועד בכלל.

מה החולשה?

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

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

מכאן השאר אוטומטי. הטקסט יוצא חזרה לדף בלי שהתגיות שבו נוטרלו, הדפדפן שמציג את הדף מתייחס אליו כקוד ולא כטקסט, והקוד רץ. לטכניקה הזאת קוראים Stored XSS, הזרקת סקריפט שנשמר בצד השרת וממתין שם לקורבן הבא, והסיווג הוא CWE-79.

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

מי מושפע?

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

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

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

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

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

מה עושים?

פתחו את מסך התוספים בממשק הניהול, מצאו את WPC Product Bundles for WooCommerce ובדקו את הגרסה. 8.6.6 ומטה היא גרסה בטווח הפגוע, וכל גרסה חדשה ממנה כוללת את התיקון.

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

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