מתוכנן להעביר את מנגנון בידוד המשכון ללינוקס

לאחרונה, מחבר ספריית הסטנדרטים Cosmopolitan C ופלטפורמת Redbean הכריזו על יישום מנגנון הבידוד pledge() עבור לינוקס.

pledge, שפותח במקור על ידי פרויקט OpenBSD , מאפשר לך לאסור באופן סלקטיבי גישה של יישומים לקריאות מערכת שאינן בשימוש (יצירת רשימה לבנה של קריאות מערכת עבור היישום ואיסור קריאות אחרות). בניגוד למנגנוני בקרת גישה של syscall הזמינים בלינוקס, כגון seccomp, pledge תוכנן מלכתחילה להיות ידידותי למשתמש ככל האפשר.

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

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

לדוגמה, המחלקות המוצעות הן stdio (קלט/פלט), rpath (קבצים לקריאה בלבד), wpath (כתיבת קבצים), cpath (יצירת קבצים), tmppath (עבודה עם קבצים זמניים), inet (רשת שקעים), יוניקס (שקעי יוניקס ), dns (רזולוציית DNS), getpw (גישת קריאה למסד הנתונים של המשתמש), ioctl (קריאת ioctl), proc (בקרת תהליכים), exec (תהליכי הפעלה) ו-id (בקרת הרשאות).

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

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

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

מפתחי פורט pledge של לינוקס הלכו בעקבות FreeBSD , ובמקום לבצע שינויי קוד, הכינו כלי נוסף מאתר pledge.com המאפשר להחיל הגבלות מבלי לשנות את קוד האפליקציה. לדוגמה, כדי להפעיל את כלי curl עם גישה רק למחלקות קריאה למערכת stdio, rpath, inet ו-threadstdio, פשוט הפעילו `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.

התוכנה פועלת על כל הפצות לינוקס מ-RHEL6 ואילך ואינה דורשת גישת root. בנוסף, בהתבסס על ספריית cosmopolitan, מסופקת API לניהול הגבלות בקוד תוכנית C, המאפשר, בין היתר, יצירת מובלעות כדי להגביל באופן סלקטיבי את הגישה לפונקציות יישום ספציפיות.

היו כמה מפתחים בעבר שניסו זאת. אני לא מתכוון לנקוב בשמות, כי רוב הפרויקטים האלה מעולם לא הושלמו. כשזה מגיע ל-SECOMP, מדריכים מקוונים מסבירים רק כיצד לרשום שיחות למערכת, כך שרוב האנשים מאבדים עניין לפני שהם מבינים כיצד לסנן טיעונים. לפרויקטים שהתקדמו היו גם השגחות כמו מתן אפשרות לשנות סיביות של setuid/setgid/sticky. לכן, אין להשתמש באף אחת מהחלופות הנוכחיות. אני חושב שהמאמץ הזה מקרב אותנו הרבה יותר לקבל התחייבות() מאי פעם.

הטמעה אינה דורשת שינויים בקרנל: אילוצי עזר מתורגמים לכללי SECCOMP BPF ומעובדים באמצעות מנגנון בידוד שיחות המערכת המקורית של לינוקס. לדוגמה, קריאת belofte("stdio rpath", 0) תמיר למסנן BPF

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


הוסף כמקור מועדף בגוגל