יישום SELinux

SELinux מוגדר למניעת ברירת מחדל, כלומר כל גישה אחת שיש לה קרס בגרעין חייבת להתיר במפורש על ידי מדיניות. המשמעות היא שקובץ מדיניות מורכב מכמות מידע רבה בנוגע לכללים, סוגים, שיעורים, הרשאות ועוד. שיקול מלא של SELinux אינו בהיקף מסמך זה, אך הבנה כיצד לכתוב כללי מדיניות חיונית כעת בעת העלאת מכשירי אנדרואיד חדשים. יש כבר הרבה מידע זמין לגבי SELinux. ראה תיעוד תמיכה עבור הצעות למשאבים.

קבצי מפתח

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

באופן כללי, אתה לא צריך לשנות את system/sepolicy קבצים ישירות. במקום, להוסיף או לערוך קבצי מדיניות מכשיר ספציפי משלך /device/ manufacturer / device-name /sepolicy בספרייה. ב- Android 8.0 ומעלה, השינויים שאתה מבצע בקבצים אלה אמורים להשפיע רק על המדיניות בספריית הספקים שלך. לפרטים נוספים על הפרדת sepolicy הציבור אנדרואיד 8.0 ומעלה, לראות התאמה אישית SEPolicy ב Android 8.0+ . ללא קשר לגרסת אנדרואיד, אתה עדיין משנה את הקבצים הבאים:

קבצי מדיניות

קבצים המסתיימים *.te הם קבצי מקור מדיניות SELinux, אשר מגדירים תחומים ותוויות שלהם. ייתכן שיהיה עליך ליצור קבצי מדיניות חדשה /device/ manufacturer / device-name /sepolicy , אבל אתה צריך לנסות לעדכן קבצים קיימים במידת האפשר.

קבצי הקשר

קבצי הקשר הם המקום שבו אתה מציין תוויות לאובייקטים שלך.

  • file_contexts ומקצה תוויות לקבצים משמש רכיבי מרחב משתמש שונים. בעת יצירת מדיניות חדשה, צור או עדכן קובץ זה כדי להקצות תוויות חדשות לקבצים. כדי להחיל חדש file_contexts , לשקם את התמונה במערכת הקבצים או לרוץ restorecon על הקובץ להיות relabeled. על שדרוגים, שינויים file_contexts מוחלים באופן אוטומטי למערכת ומחיצות UserData כחלק השדרוג. שינויים יכולים גם להיות מיושמים באופן אוטומטי על שדרוג מחיצות אחרות על ידי הוספת restorecon_recursive שיחות init שלך. board קובץ .rc לאחר החלוקה כבר רכוב קריאה-כתיבה.
  • genfs_contexts ומקצה תוויות כדי מערכות קבצים, כגון proc או vfat שאיננו תומכים תכונות מורחבות. תצורה זו נטענת כחלק ממדיניות הגרעין אך ייתכן שהשינויים לא ייכנסו לתוקף עבור inodes בתוך הליבה, המחייבים אתחול מחדש או ביטול הרכבה והתקנה מחדש של מערכת הקבצים כדי ליישם את השינוי במלואו. תוויות ספציפיות עשוי גם להיות מוקצות תושבות ספציפיות, כגון vfat באמצעות context=mount אופציה.
  • property_contexts תוויות מקצה מאפייני מערכת אנדרואיד לשלוט במה תהליכים יכולים להגדיר אותם. תצורה זו נקראת על ידי init תהליך במהלך האתחול.
  • service_contexts ומקצה תוויות אנדרואיד קלסר שירותים לשלוט במה תהליכים יכולים להוסיף (לרשום) ולמצוא (בדיקה) הפנית קלסר עבור השירות. תצורה זו נקראת על ידי servicemanager תהליך במהלך האתחול.
  • seapp_contexts ומקצה תוויות לתהליכי אפליקציה /data/data ספריות. תצורה זו נקראת על ידי zygote תהליך על כל פתיחת אפליקציה ועל ידי installd במהלך האתחול.
  • mac_permissions.xml מקצה seinfo תג לאפליקציות מבוססות על החתימה שלהם ובשם החבילה שלהם אופציונלי. seinfo תג אז יכול לשמש מפתח seapp_contexts קובץ להקצות תווית ספציפית לכל האפליקציות עם זה seinfo תג. תצורה זו נקראת על ידי system_server במהלך אתחול.

קובץ מיידי של BoardConfig.mk

לאחר עריכה או הוספת קבצים מדיניות והקשר, לעדכן שלך /device/ manufacturer / device-name /BoardConfig.mk makefile לצורך פניית sepolicy בתיקייה וכול קובץ מדיניות חדש. לקבלת מידע נוסף אודות BOARD_SEPOLICY משתנה, לראות system/sepolicy/README קובץ .

BOARD_SEPOLICY_DIRS += \
        <root>/device/manufacturer/device-name/sepolicy

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te

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

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

יישום

כדי להתחיל עם SELinux:

  1. אפשר SELinux בליבה: CONFIG_SECURITY_SELINUX=y
  2. שנה את הפרמטר kernel_cmdline או bootconfig כך:
    BOARD_KERNEL_CMDLINE := androidboot.selinux=permissive
    או
    BOARD_BOOTCONFIG := androidboot.selinux=permissive
    זהו רק עבור הפיתוח הראשוני של מדיניות עבור המכשיר. לאחר שתהיה לך מדיניות ראשית של bootstrap, הסר פרמטר זה כך שהמכשיר שלך יאכוף או שהוא ייכשל ב- CTS.
  3. אתחל את המערכת באופן מתירני וראה באילו הכחשות נתקלים באתחול:
    על אובונטו 14.04 ומעלה:
    adb shell su -c dmesg | grep denied | audit2allow -p out/target/product/BOARD/root/sepolicy
    
    על אובונטו 12.04:
    adb pull /sys/fs/selinux/policy
    adb logcat -b all | audit2allow -p policy
    
  4. להעריך את התפוקה עבור אזהרות שדומות init: Warning! Service name needs a SELinux domain defined; please fix! ראה אימות לקבלת הוראות וכלים.
  5. זיהוי התקנים וקבצים חדשים אחרים הדורשים תיוג.
  6. השתמש בתוויות קיימות או חדשות לאובייקטים שלך. תסתכל על *_contexts קבצים כדי לראות איך דברים תויגו בעבר ושימוש בידע של משמעויות התווית כדי להקצות חשבון חדש. באופן אידיאלי, זו תהיה תווית קיימת שתתאים למדיניות, אך לפעמים יהיה צורך בתווית חדשה, ויהיה צורך בכללים לגישה לאותה תווית. הוסף את התוויות שלך לקבצי ההקשר המתאימים.
  7. זהה תחומים/תהליכים שאמורים להיות להם תחומי אבטחה משלהם. סביר להניח שתצטרך לכתוב מדיניות חדשה לגמרי לכל אחד. כול השירותים הולידו מן init , למשל, צריכים משלהם. הפקודות הבאות עוזרות לחשוף את אלה שנותרו פועלות (אך כל השירותים זקוקים לטיפול כזה):
    adb shell su -c ps -Z | grep init
    
    adb shell su -c dmesg | grep 'avc: '
    
  8. סקירת init. device .rc לזהות דומיינים שאין להם סוג תחום. תן להם תחום מוקדם בתהליך הפיתוח כדי להימנע מהוספת כללי init או אחר מבלבל init כניסות עם אלה שנמצאים מדיניות משלהם.
  9. להגדיר BOARD_CONFIG.mk להשתמש BOARD_SEPOLICY_* משתנה. ראו README ב system/sepolicy לפרטים להגדרה זו.
  10. בדוק את init. device .rc ואת fstab. device הקובץ ולוודא שכול שימוש mount מקבילת קבצים מסומנים כראוי או כי context= mount אפשרות מצוינת.
  11. עבר על כל הכחשה וצור מדיניות SELinux כדי לטפל כראוי בכל אחת מהן. ראה דוגמאות התאמה אישית .

עליך להתחיל במדיניות ב- AOSP ולאחר מכן לבנות עליהן בהתאמה אישית שלך. לקבלת מידע נוסף אודות אסטרטגיית מדיניות מבט מקרוב על כמה שלבים אלה, ראו מדיניות SELinux כתיבה .

השתמש במקרים

להלן דוגמאות ספציפיות למעללים שיש לקחת בחשבון בעת ​​יצירת תוכנה משלך ומדיניות SELinux משויכת:

קישורים סימבוליים - בגלל קישורים סימבוליים מופיעים כקבצים, הם לעתים קרובות לקרוא כקבצים, מה שעלול להוביל מנצל. למשל, כמה רכיבים חסויים, כגון init , לשנות את ההרשאות של קבצים מסוימים, לפעמים להיות פתוח באופן מוגזם.

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

קבצי מערכת - קחו למשל את המעמד של קבצי המערכת כי יש לשנות רק על ידי שרת המערכת. ובכל זאת, מאז netd , init , ו vold לרוץ בתור root, הם יכולים לגשת לקבצים במערכת אלו. אז אם netd הפך נפגעת, זה עלול לסכן את אותם קבצים ואפשרות לשרת במערכת עצמה.

בעזרת SELinux תוכל לזהות קבצים אלה כקובצי נתוני שרת מערכת. לכן הדומיין היחיד שיש לו גישת קריאה/כתיבה אליהם הוא שרת המערכת. גם אם netd הפך נפגע, זה לא יכול לעבור תחומים לתחום לשרת מערכת ולגשת אלה קבצי מערכת אם כי הוא פועל בתור root.

נתונים App - דוגמה נוספת היא מחלקה של פונקציות חייבות לרוץ כ root אבל לא צריך לקבל נתוני האפליקציה גישה. זה שימושי להפליא מכיוון שניתן להעלות טענות רחבות היקף, כגון איסור גישה לאינטרנט לדומיינים מסוימים שאינם קשורים לנתוני יישומים.

setattr - עבור פקודות כגון chmod ו chown , תוכל לזהות את הסט של קבצים שבו התחום קשור יכול לנהל setattr . כל דבר שמחוץ לזה יכול להיות אסור משינויים אלה, אפילו על ידי שורש. אז בקשה עלולה להפעיל chmod ו chown נגד אלה שכותרתו app_data_files אבל לא shell_data_files או system_data_files .