פגיעות ב-io_uring אפשרה למשתמש ללא הרשאות להפוך לשורש אפילו בקונטיינרים

לאחרונה מידע על פגיעות שנחשף (CVE-2022-29582) בהטמעת ממשק ה-I/O האסינכרוני של io_uring, הנכלל בקרנל של לינוקס מאז גרסה 5.1, המאפשר למשתמש חסר הרשאות להפוך ל-root במערכת, גם בעת ביצוע ניצול קונטיינר.

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

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

אודות פגיעות CVE-2022-29582

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

תיאור כללי מעודכן של io_uring כבר סופק על ידי אחרים. הם מסבירים את זה פי אלף יותר טוב מאיתנו, אז פשוט נסקור את תת-המערכת באופן נרחב יותר (ראה מאמר Grapl Security ומאמר Flatt Security להקדמה מצוינת).

מה יותר חשוב, שדה opcode קובע איזה סוג פעולה לבצע. עבור כל "אופקוד" שדורש זאת, השדה fd מציין את מתאר הקובץ שעליו לבצע את ה-I/O המבוקש. כמעט לכל קריאות מערכת הקלט/פלט הרגילות (קריאה, שליחה וכו') יש קוד אסינכרוני שווה ערך. כל תחום יכול לקחת על עצמו תפקידים שונים בהתאם למבצע.

לאחר אחזור מה-SQ, SQE מומר לייצוג פנימי המתואר על-ידי struct io_kiocb (Call קלט/פלט של ליבה). אובייקטים אלה ידועים בדרך כלל בתור בקשות.

struct io_kiocb משמש כמקביל ל-SQE "מוכן להפעלה" שעליו הוא מבוסס, לפיו כל מתאר קובץ נפתר לקובץ struct*s, מצורפים אישורי משתמש, אישיות (בהן ירוצו ליבות) וכו' .

לאחר השלמת הפעולה המבוקשת, היא נכתבת לתור ההשלמה (CQ) ערך התואם ל-SQE. ערך כזה נקרא כניסת תור השלמה (CQE) ומכיל שדות כמו קוד שגיאה וערך תוצאה. אפליקציית מרחב המשתמש יכולה לסקור את ה-CQ עבור ערכים חדשים כדי לקבוע אם ה-SQEs שנשלחו סיימו לעבד ומה הייתה התוצאה שלהם.

מוזכר כי ישנם כמה תרחישים שבהם קל להחליף אובייקט על ההתקדמות. אבל יש שתי מגבלות:

  • יש להקצות ולאתחל את LT' בחלון מירוץ. כלומר, לאחר שחרור ה-LT אבל לפני הגעה לנקודה ב-LT שכבר אין גישה אליה.
  • LT' יכול להיות רק אובייקט אחר של struct io_kiocb. בשל בידוד ערימה, שבו אובייקטים בערימה מופרדים לפי סוגם, קשה מדי להקצות אותם מחדש כסוג שונה של אובייקט בתוך חלון המירוץ.

חוקרים הכינו ניצול פונקציונלי אשר אינו מצריך הכללת מרחבי שמות מזהים של משתמש (מרחבי שמות משתמשים) לצורך פעולתו ויכול לספק גישת שורש למארח כאשר משתמש חסר הרשאות מפעיל את ה-exploit במיכל מבודד.

הניצול שלנו מכוון לגרסת ליבה 5.10.90, הגרסה שגוגל רצה מרחוק באותה עת. היינו צריכים להתאים את הניצול שלנו למפרטים הספציפיים של השרת (4 ליבות Skylake Xeon @ 2.80Ghz, 16GiB RAM), אבל עם קצת התאמה, כל מכונה שמריצה ליבה פגיעה אמורה להיות ניתנת לניצול.

הניצול עובד גם בסביבת nsjail מבודדת בהפצה של Google COS (Container Optimized OS) המבוססת על Chromium OS ומשמשת ב-Google Cloud Platform במכונות וירטואליות Compute Engine. ה-exploit נועד לעבוד עם ענפי ליבה מ-5.10 עד 5.12. לבסוף, ראוי להזכיר זאת הבעיה תוקנה באפריל בעדכונים 5.10.111, 5.15.34 ו-5.17.3.

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


השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי על הנתונים: AB Internet Networks 2008 SL
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.