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

מה החולשה?

לינוקס מאפשר לכמה תהליכים להאזין יחד לאותו port של UDP, וכשמגיעה חבילה הגרעין צריך להחליט למי מהם למסור אותה. את ההחלטה הזאת אפשר להלביש על תוכנית קטנה שהמפתח כותב ומצמיד לקבוצה, וכך לפזר את העומס לפי מה שמתאים לאפליקציה ולא לפי ברירת המחדל. המנגנון שמאפשר את השיתוף נקרא reuseport, והתוכנית הקטנה היא cBPF, הגרסה הוותיקה של מנגנון ה-BPF שבתוך הגרעין.

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

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

מי מושפע?

מדובר בגרעין לינוקס עצמו, ולכן בכל מה שמריץ אותו: שרתים, מכונות וירטואליות, מכולות ומכשירים משובצים. רשימת הגרסאות חוצה כמעט את כל הענפים הנתמכים. התיקון נכנס ב-5.10.259, ב-5.15.210, ב-6.1.176, ב-6.6.143, ב-6.12.94, ב-6.18.36 וב-7.0.13, וכל גרסה בענף כזה שנמצאת מתחת למספר הרלוונטי מושפעת, כולל ענפים ותיקים מ-4.5 ומעלה. גם 7.1 מופיעה ברשומה כגרסה מושפעת.

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

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

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

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

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

מה עושים?

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

את הגרסה שאתם מריצים כרגע רואים עם הפקודה uname -r. השוו אותה לרשימה למעלה: בענף 6.6 צריך 6.6.143 ומעלה, בענף 6.12 צריך 6.12.94 ומעלה, וכך לכל ענף. שימו לב שמספר הגרסה שההפצה נותנת לחבילת הגרעין לא תמיד זהה למספר של הגרעין במעלה הזרם, ולכן אם ההפצה שלכם פרסמה הודעת אבטחה לחולשה הזאת, המספר שמופיע בה הוא הקובע ולא ההשוואה שעשיתם לבד.

אם מדובר בשרת שמריץ קוד של לקוחות או מכולות של גורמים שונים, תעדפו אותו קודם. שם התנאי המקדים של החולשה, חשבון מקומי על המכונה, מתקיים כבר עכשיו ולא דורש מהתוקף שום שלב מקדים.

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