היכולות מאפשרות לתהליכי Linux להפסיק להשתמש ברוב ההרשאות שדומות להרשאות root, תוך שמירה על קבוצת המשנה של ההרשאות שנדרשות להם כדי לבצע את הפונקציה שלהם. ביישום המקורי של היכולות, תהליכים מסוג fork+exec לא יכלו לקבל בירושה יכולות, אלא אם הוגדרו יכולות קובץ בקבצים שהופעלו. יכולות הקובץ, בתורן, מהוות סיכון אבטחה, כי כל תהליך שמבצע קובץ עם יכולות קובץ יכול לקבל את היכולות האלה.
יכולות סביבתיות מאפשרות לשירותי מערכת שהופעלו על ידי init להגדיר יכולות בקובצי .rc
שלהם, וכך להעביר את ההגדרה לקובץ יחיד במקום לפצל אותה לקובץ fs_config.c
. המשמעות היא שלכל שירות שמופעל על ידי init, אפשר להשתמש בקובץ .rc
שמשויך לשירות כדי להגדיר את היכולות של השירות.
היכולות הסביבתיות הן המנגנון המועדף להגדרת יכולות לשירותים שמופעלים על ידי init (השיטה הזו שומרת את כל ההיבטים של הגדרת השירות בקובץ .rc
יחיד). מומלץ להשתמש ביכולות סביבתיות במקום להגדיר יכולות של מערכת קבצים באמצעות הקטע caps בקובצי config.fs
.
כשמגדירים יכולות לשירותים שלא מופעלים על ידי init,
ממשיכים להגדיר יכולות של מערכת קבצים באמצעות
fs_config.c
.
הפעלת יכולות של מצב אווירה
כדי להפעיל את התכונות של הממשק הסביבתי בשירות מסוים, משתמשים במילת המפתח capabilities
ב-init. פרטים על שפת ההפעלה הנוכחית מופיעים בקובץ README.md של init.
לדוגמה, כדי להפעיל יכולות סביבתיות בשירות AOSP wificond
, קובץ ה-rc של השירות wificond
מגדיר את המשתמש והקבוצות המתאימים ונותן לשירות את היכולות שצוינו באמצעות מילת המפתח capabilities
:
service wificond /system/bin/wificond class main user wifi group wifi net_raw net_admin capabilities NET_RAW NET_ADMIN
הטמעה לדוגמה
ההטמעה לדוגמה היא ליבת Android נפוצה https://android.googlesource.com/kernel/common/
תיקונים נדרשים
תיקנו את כל הבעיות הרלוונטיות בגרסאות קודמות של ענפי ליבת Android המשותפים.
התיקון העיקרי של יכולות הסביבה https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 עבר הרצה לאחור ב:
- android-3.18:
- android-4.1:
תיקון אבטחה קטן https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 הועבר לאחור ב:
- android-3.18:
- android-4.1:
אימות
בדיקות יחידה של Bionicכוללות בדיקות יחידה של יכולות הסביבה. בנוסף, אפשר להשתמש במילת המפתח capabilities (יכולות) ב-Android init עבור שירות, ואז לבדוק שהשירות מקבל את היכולות הצפויות. כך אפשר לבצע בדיקה בזמן ריצה של התכונה הזו.