לאחרונה הידיעה על דגילוי של פגיעויות חדשות ב-runC (כלי CLI לבנייה והרצה של קונטיינרים בלינוקס) CVE-2024-21626 וב-BuildKit (CVE-2024-23651, CVE-2024-23652 ו-CVE-2024-23653), להיות אחד הדאגות הגדולות ביותר CVE-2024-21626, שכן מדובר בפגיעות קריטית המאפשרת גישה למערכת הקבצים של מערכת ההפעלה המארחת.
CVE-2024-21626 מאפשר גישה למערכת הקבצים של הסביבה המארחת ממיכל מבודד. במהלך התקפה, תוקף יכול להחליף כמה קבצי הפעלה בסביבת המארח ולהפעיל את הקוד שלהם מחוץ לקונטיינר.
זה מדאיג במיוחד בסביבות כמו Kubernetes, שבהן קונטיינרים פועלים על צמתים משותפים. על ידי ניצול פגיעות זו, תוקף יכול להשיג שליטה מוסמכת על המארח, ועלולה להעניק גישה בלתי מורשית לתרמילים אחרים ונתונים של אחרים באותו צומת.
יתר על כן, פגיעות זו משפיע גם על תהליכי בנייה הפועלים בסביבות קונטיינר, נותן לתוקפים את ההזדמנות לבסס דריסת רגל בתוך תהליך בנייה. התרחיש הזה עלול לגרום לתוקף לקבל אישורים גבוהים, מה שיעניק לך גישה לעומסי עבודה קריטיים של ייצור או לסביבות רגישות אחרות. בעיקרו של דבר, ההשפעה חורגת מעבר להדלפת מידע בלבד או ביצוע קוד שרירותי, ועלולה לסכן את השלמות והאבטחה של כל סביבת הפיתוח והייצור.
בסביבות בהן נעשה שימוש ב-Docker או Kubernetes, ניתן לבצע תקיפה באמצעות תמונת מיכל בעלת מבנה מיוחד. לאחר התקנה והפעלה של תמונה זו, התוקף יכול לגשת למערכת קבצים חיצונית מהמכולה. במקרה של Docker, ניתן לפעול באמצעות Dockerfile שתוכנן במיוחד. ניתן לנצל את הפגיעות גם אם מתחילים תהליכים בקונטיינר באמצעות הפקודה "runc exec" ומקשרים את ספריית העבודה למרחב השמות של הסביבה המארחת.
הבעיה העיקרית היא דליפת מתאר קבצים ובזמן ביצוע O_CLOEXEC כל מתארי קבצים לפני ביצוע קוד המכולה, הקובץ מתאר פתוח בעת ביצוע setcwd(2), מה שאומר שההפניה ניתן לשמור בחיים במיכל על ידי הגדרת מצב העבודה של ספרייה כנתיב שנפתר דרך מתאר הקובץ (yeה-bit non-dump לא מוגדר אחרי execve(2), מה שאומר שיש מספר דרכים לתקוף זאת מלבד תצורות גרועות).
הסיבה לפגיעות נעוצה בדליפה של מתארי קבצים פנימיים. לפני ביצוע הקוד בתוך הקונטיינר, runc סוגר את כל מתארי הקבצים באמצעות הדגל O_CLOEXEC. עם זאת, ביצועים עוקבים של setcwd() משאירים מתאר קובץ פתוח המצביע על ספריית העבודה ונשאר נגיש לאחר הפעלת המיכל. הוצעו כמה תרחישים בסיסיים לתקוף את הסביבה המארח באמצעות מתאר הקבצים הנותר.
מוזכר ש דוגמה לניצול פגיעות אם הוגדר מיכל:
כדי להגדיר את process.cwd ל-/proc/self/fd/7/, לתהליך pid1 שיתקבל תהיה ספריית עבודה במרחב השמות של המארח, ולפיכך התהליך שנוצר יוכל לגשת לקבצי המארח של המערכת כולה. זה לבדו אינו ניצול נגד runc. תוקף יכול גם להערים על משתמש להפעיל תמונת מיכל זדונית, ולאפשר לתהליך מיכל להגיע למערכת הקבצים המארחת באמצעות runc. זה יכול להרחיב את החלפת קבצים בינאריים מארח, וכתוצאה מכך בריחה מלאה של מיכל.
לבסוף, יש להזכיר כי הפגיעות תוקנה בגרסת runc 1.1.12, לכן ההמלצה היא לעדכן לגרסה החדשה. אם אתה מעוניין ללמוד עוד על זה, אתה יכול לעיין בפרטים בקישור הבא.