בדרייבר uvcvideo של ליבת לינוקס, זה שמטפל במצלמות USB, יש חולשה שמאפשרת כתיבה מחוץ לתחום הזיכרון שהוקצה. הציון הוא 7.8 מתוך 10, הדירוג מתאר תקיפה מקומית מחשבון עם הרשאות נמוכות, ומפברואר 2025 החולשה רשומה כמנוצלת בפועל.
מה החולשה?
כשמצלמת USB מתחברת, היא מתארת את עצמה לליבה: אילו פורמטים היא תומכת בהם, באילו רזולוציות, באילו קצבי פריימים. הליבה קוראת את התיאור הזה בשני שלבים. קודם היא עוברת עליו וסופרת כמה רשומות היא צריכה לשמור, ומקצה בדיוק את הזיכרון לכך. אחר כך היא עוברת שוב וממלאת את מה שהקציבה.
כל התקינות של הסידור הזה תלויה בכך ששני המעברים מסכימים מה נספר. ולפי הרשומה, כאן הם לא הסכימו: פריימים מסוג UVC_VS_UNDEFINED לא נלקחו בחשבון כשחושב גודל החוצץ בפונקציה uvc_parse_streaming, אבל הם כן טופלו בשלב שממלא אותו. כלומר השלב השני כותב יותר רשומות ממה שהשלב הראשון הקציב מקום.
מה שקורה אז הוא כתיבה מעבר לסוף האזור, אל זיכרון שמשמש משהו אחר. בליבת מערכת ההפעלה זה חמור במיוחד, כי אין כאן הפרדה שתעצור את זה: מה שנדרס שייך לליבה עצמה, ותוקף שמצליח לשלוט במה שנכתב ואיפה יכול להפוך את זה להרצת קוד בהרשאות הגבוהות ביותר במערכת. התיקון, בהתאם, הוא לדלג על פריימים מהסוג הזה בפירוש הפורמט.
שימו לב מאיפה מגיע הקלט הפגום. הוא אינו מגיע מהרשת אלא מהתיאור שהמכשיר מדווח על עצמו, והרשומה מדרגת את התקיפה כמקומית ודורשת הרשאות נמוכות. הפגיעה גבוהה בסודיות, בשלמות ובזמינות.
מי מושפע?
הרשומה מונה ענפים רבים של הליבה, וכל אחד נסגר בגרסה אחרת. הטווחים הם מ-2.6.26 עד 4.19.324, מ-4.20 עד 5.4.286, מ-5.5 עד 5.10.230, מ-5.11 עד 5.15.172, מ-5.16 עד 6.1.117, מ-6.2 עד 6.6.61, מ-6.7 עד 6.11.8, ומ-6.12 עד 6.12.1. בנוסף מופיעה Debian בגרסה 11.0.
הטווח התחתון מתחיל ב-2.6.26, כלומר הקוד הזה נשא את הבאג שנים רבות. מעשית, מה שחשוב הוא לא היכן הטווח מתחיל אלא מה גרסת התיקון של הענף שאתם עליו.
בישראל זה נוגע לכל מי שמריץ לינוקס: שרתים, תחנות עבודה, ומכשירים משובצים שמבוססים על הליבה. מי שיש לו מצלמת USB מחוברת נמצא בחשיפה המובהקת, אבל הדרייבר נטען גם כשהוא פשוט זמין במערכת, ולכן הגרסה היא הקו ולא השאלה אם יש מצלמה על השולחן.
האם מנוצלת בפועל?
כן. ב-5 בפברואר 2025 נכנסה החולשה לקטלוג ה-KEV של סוכנות הסייבר האמריקאית CISA, רשימת החולשות שידוע שתוקפים משתמשים בהן בפועל, עם מועד תיקון של 26 בפברואר 2025 לרשויות הפדרליות בארצות הברית.
הרשומה פורסמה בדצמבר 2024, והכניסה לקטלוג הייתה כחודשיים אחר כך. הקטלוג אינו מפרט מי ניצל את החולשה ובאיזה הקשר.
מה עושים?
עדכנו את הליבה לגרסת התיקון של הענף שלכם. בדקו קודם מה רץ אצלכם בפקודה uname -r, ואז השוו לרשימה: 4.19.324, 5.4.286, 5.10.230, 5.15.172, 6.1.117, 6.6.61, 6.11.8 או 6.12.1, לפי הענף.
בפועל, ברוב המערכות לא מעדכנים ליבה ידנית אלא דרך ההפצה. מי שמריץ Debian, Ubuntu, RHEL או נגזרת שלהן מקבל את התיקון בחבילת הליבה של ההפצה, ולכן העדכון הרגיל של המערכת הוא הדרך. שימו לב שעדכון ליבה דורש אתחול כדי להיכנס לתוקף, ושרת שעודכן ולא אותחל ממשיך לרוץ על הליבה הישנה.
מי שבונה ליבה בעצמו או מתחזק מכשיר משובץ יכול לקחת את התיקון ישירות. הרשומה מקשרת אל קובץ השינוי בעץ היציב של הליבה, ומופיעים שם גם הגיבויים שלו לענפים האחרים.
ואם יש לכם מערכות שאינכם יכולים לעדכן בטווח הקרוב, יש מעקף שמתאים כאן דווקא: החולשה יושבת בדרייבר אחד ומוגדר. במערכת שאינה צריכה מצלמת USB בכלל, למשל שרת בחדר מכונות, אפשר למנוע את טעינת המודול uvcvideo ובכך להסיר את הקוד הפגיע מהתמונה. במכשיר שהמצלמה בו חיונית זה כמובן אינו פתרון.