10.2 - יכולות והפרדת הרשאות - פתרון
פתרון חישוב הסמכות¶
פתרון ראשון - מסלולים שונים ליכולת¶
המודל הבא מייצג רק את המקרה הרגיל שהוגדר בהרצאה. הוא אינו מממש את כללי מזהה אפס או את כל מדיניות ההחלפה של הקרנל.
fn after_exec(inheritable: u64, bounding: u64, ambient: u64,
file_inheritable: u64, file_permitted: u64,
file_effective: bool, privileged_file: bool) -> (u64, u64, u64) {
let next_ambient = if privileged_file { 0 } else { ambient };
let permitted = (inheritable & file_inheritable) |
(file_permitted & bounding) | next_ambient;
let effective = if file_effective { permitted } else { next_ambient };
(permitted, effective, next_ambient)
}
fn main() {
let capability = 1_u64 << 10;
assert_eq!(after_exec(0, 0, 0, 0, capability, true, true), (0, 0, 0));
assert_eq!(after_exec(capability, 0, 0, capability, 0, true, true),
(capability, capability, 0));
assert_eq!(after_exec(capability, capability, capability, 0, 0, false, true), (0, 0, 0));
assert_eq!(after_exec(capability, capability, capability, 0, 0, false, false),
(capability, capability, capability));
}
הבדיקה השנייה מדגימה מדוע קבוצת התחימה אינה פשוט פעולת חיתוך סופית על כל התוצאה. היא משתתפת במסלול המתאים בנוסחה. הבדיקה האחרונה מניחה מצב סביבתי חוקי שבו היכולת כבר נמצאת בקבוצות הנדרשות לפני ההחלפה.
פתרון שני - תצורת סביבה כחלק מהראיה¶
אם הפורט שמונים ואחת מוגן והקובץ אינו בעל יכולת מתאימה, המשתמש הרגיל צפוי להיתקל בכשל הרשאה. לאחר הוספת היכולת, ההאזנה צפויה להצליח אם אין מגבלה נוספת או שימוש קיים בפורט. לאחר הסרתה חוזרים לתנאי הבסיס. בכל שלב מציגים את פלט היכולות ואת המדיניות, ולא רק הודעת הצלחה או כשל.
הסוקט נוצר ונקשר בזמן שהבדיקה המתאימה אפשרה זאת. איפוס יכולות אינו סוגר מתארים קיימים ואינו מבטל אוטומטית את כל הפעולות שמותר לבצע דרכם. לכן העזר יכול למסור מתאר פתוח לשירות בעל סמכות מצומצמת, בתנאי שהמסירה עצמה מורשית.
פתרון שלישי - בקשה בעלת משמעות מוגבלת¶
נגדיר בקשה בינארית שמכילה גרסה ומזהה משאב, למשל אפס עבור קובץ תצורה ואחד עבור נתוני מילון. העזר אינו מקבל נתיב שרירותי. הוא מאמת את העמית באמצעות חוזה הסוקט המקומי, בודק שהזהות רשאית לקבל את המשאב המבוקש ופותח אותו ביחס למתאר תיקייה קבוע לפי מדיניות פתרון נתיב מתאימה.
בקשה שמנסה לשלוח נתיב כגון קובץ סודי אחר נדחית כבר ברמת הפורמט, משום שאין שדה נתיב. בקשה עם מזהה לא מוכר נדחית לפני פתיחה. לאחר פתיחה מוצלחת העזר מעביר מתאר אחד ומנהל את סגירת העותק שלו לפי החוזה. המדיניות עדיין צריכה להגן מפני החלפת המשאב בתיקייה ולהגדיר מי רשאי לשנות אותה; היעדר שדה נתיב מצמצם את הממשק אך אינו פותר לבדו כל מרוץ במערכת הקבצים.