מערכת Android ממליצה מאוד ליצרני ציוד מקורי לבדוק את ההטמעות של SELinux שלהם באופן יסודי. יצרנים מטמיעים את SELinux, עליהם להחיל את הגרסה החדשה למאגר הבדיקה של המכשירים.
אחרי שמחילים מדיניות חדשה, צריך לוודא ש-SELinux פועל בצורה הנכונה
במצב המכשיר, על ידי ביצוע הפקודה getenforce
.
פעולה זו מדפיסה את מצב SELinux הגלובלי: אכיפה או מתירנית. שפת תרגום
את מצב SELinux בשביל כל דומיין, צריך לבדוק את
קבצים או להריץ את הגרסה האחרונה של sepolicy-analyze
עם
הדגל (-p
) המתאים, נמצא ב-
/platform/system/sepolicy/tools/
דחיית קריאה
חיפוש שגיאות, שמנותבות כיומני אירועים אל dmesg
וגם logcat
, וניתן לראות אותם באופן מקומי במכשיר. יצרנים
צריך לבדוק את פלט SELinux אל dmesg
במכשירים האלה
לשפר את ההגדרות לפני השקה ציבורית במצב מתירנות ובסיום מעבר
למצב אכיפה. הודעות היומן של SELinux מכילות avc:
ולכן ייתכן
אפשר למצוא אותו בקלות בעזרת grep
. אפשר לתעד את
הרצת יומני דחייה על ידי הרצת cat /proc/kmsg
או תיעוד יומני דחייה
מהאתחול הקודם באמצעות הרצת
cat /sys/fs/pstore/console-ramoops
.
הודעות שגיאה של SELinux מוגבלות בקצב של לאחר השלמת ההפעלה כדי למנוע ביצה
היומנים. כדי לוודא שיוצגו כל ההודעות הרלוונטיות, אפשר להשבית את האפשרות הזו
על ידי הרצת adb shell auditctl -r 0
.
בעזרת הפלט הזה, היצרנים יכולים לזהות בקלות מתי משתמשי מערכת רכיבים מפרים את מדיניות SELinux. לאחר מכן היצרנים יכולים לתקן התנהגות לא תקינה זו, על ידי שינויים בתוכנה, במדיניות SELinux או בשניהם.
באופן ספציפי, הודעות היומן האלה מציינות אילו תהליכים ייכשלו והסיבה. לדוגמה:
avc: denied { connectto } for pid=2671 comm="ping" path="/dev/socket/dnsproxyd" scontext=u:r:shell:s0 tcontext=u:r:netd:s0 tclass=unix_stream_socket
פרש את הפלט הזה כך:
- הערך
{ connectto }
שלמעלה מייצג את הפעולה שננקטת. ביחד עםtclass
בסוף (unix_stream_socket
), הוא מציין בערך מה נעשה למה. במקרה הזה, משהו ניסה להתחבר לשקע זרם Unix. -
scontext (u:r:shell:s0)
מציין מה ההקשר שגרם לביצוע הפעולה. לחשבון במקרה הזה, מדובר במשהו שפועל כמעטפת. -
tcontext (u:r:netd:s0)
מציין את ההקשר של היעד של הפעולה. לחשבון במקרה הזה, זהו unix_stream_socket בבעלותnetd
. - הסמל
comm="ping"
בחלק העליון מספק רמז נוסף על מה שהיה בזמן יצירת הדחייה. במקרה הזה, זה רמז די טוב.
דוגמה נוספת:
adb shell su root dmesg | grep 'avc: '
אודיו יוצא:
<5> type=1400 audit: avc: denied { read write } for pid=177 comm="rmt_storage" name="mem" dev="tmpfs" ino=6004 scontext=u:r:rmt:s0 tcontext=u:object_r:kmem_device:s0 tclass=chr_file
אלו המרכיבים העיקריים של הדחייה הזו:
- Action – הפעולה שניסית לבצע מודגשת בסוגריים מרובעים,
read write
אוsetenforce
. - Actor – הערך
scontext
(הקשר מקור) מייצג השחקן, ובמקרה הזה, הדימון (daemon) שלrmt_storage
. - Object – הערך
tcontext
(הקשר יעד) מייצג האובייקט שעליו מבוצעת הפעולה, במקרה הזה, קמם. - תוצאה – הערך
tclass
(סיווג היעד) מציין את הסוג של האובייקט שמופעלת עליו, במקרה הזה,chr_file
(מכשיר תו).
מקבץ של משתמש ושל ליבה (kernel)
במקרים מסוימים, המידע שמופיע ביומן האירועים לא מספיק כדי לזהות מקור הדחייה. לעיתים קרובות כדאי לבצע איסוף של שרשרת השיחות, כולל הליבה מרחב משתמש, כדי להבין טוב יותר מדוע התרחשה הדחייה.
הליבות האחרונות מגדירות נקודת מעקב בשם avc:selinux_audited
. שימוש ב-Android
simpleperf
כדי להפעיל את נקודת המעקב הזו ולתעד את ה-callchain.
הגדרות אישיות נתמכות
- ליבת Linux >= 5.10, במיוחד הסתעפויות ליבה (Kernel) של Android Common
mainline
וגם
android12-5.10
נתמכים.
גרסת android12-5.4
יש תמיכה גם בהסתעפות. אפשר להשתמש ב-
simpleperf
כדי לקבוע אם נקודת המעקב שמוגדר במכשיר:adb root && adb shell simpleperf list | grep avc:selinux_audited
. בגרסאות ליבה אחרות (kernel) אפשר לבצע התחייבות לבחירת דובדבן dd81662 וגם 30969bc. - אמורה להיות אפשרות לשחזר את האירוע שבו בוצע ניפוי הבאגים. אירועי זמן הפעלה הם לא נתמכת באמצעות Simpleperf; עם זאת, ייתכן שעדיין תוכלו להפעיל מחדש את השירות כדי להפעיל האירוע.
תיעוד שרשרת השיחות
קודם כל צריך להקליט את האירוע באמצעות simpleperf record
:
adb shell -t "cd /data/local/tmp && su root simpleperf record -a -g -e avc:selinux_audited"
לאחר מכן, האירוע שגרם לדחייה אמור להיות מופעל. לאחר מכן, ההקלטה אמורה
תופסק. בדוגמה הזו, באמצעות Ctrl-c
, צריך לתעד את הדגימה:
^Csimpleperf I cmd_record.cpp:751] Samples recorded: 1. Samples lost: 0.
לסיום, אפשר להשתמש ב-simpleperf report
כדי לבדוק את דוח הקריסות שתועד.
לדוגמה:
adb shell -t "cd /data/local/tmp && su root simpleperf report -g --full-callgraph" [...] Children Self Command Pid Tid Shared Object Symbol 100.00% 0.00% dmesg 3318 3318 /apex/com.android.runtime/lib64/bionic/libc.so __libc_init | -- __libc_init | -- main toybox_main toy_exec_which dmesg_main klogctl entry_SYSCALL_64_after_hwframe do_syscall_64 __x64_sys_syslog do_syslog selinux_syslog slow_avc_audit common_lsm_audit avc_audit_post_callback avc_audit_post_callback
שרשרת הקריאות שלמעלה היא ליבה מאוחדת ושרשרת קריאות של מרחב המשתמשים. זה נותן
של זרימת הקוד על ידי התחלת המעקב ממרחב המשתמשים עד ליבה (kernel) שבה
תהליך הדחייה. מידע נוסף על simpleperf
זמין
חומר עזר בנושא פקודות הפעלה פשוטות
מעבר לשימוש מתירני
אפשר להשבית את האכיפה של SELinux דרך ADB בניפוי באגים במשתמשים או ב-builds מסוג eng. כדי לעשות את זה,
קודם צריך להעביר את ADB לרמה הבסיסית (root) על ידי הרצת adb root
. לאחר מכן, כדי להשבית את SELinux
אכיפה, הפעלה:
adb shell setenforce 0
או בשורת הפקודה בליבה (kernel) (במהלך ההפעלה המוקדמת של המכשיר):
androidboot.selinux=permissive
androidboot.selinux=enforcing
או באמצעות אתחול ב-Android 12:
androidboot.selinux=permissive
androidboot.selinux=enforcing
שימוש ב-Audit2allow
הכלי audit2allow
מקבל dmesg
דחיות
ממירה אותן להצהרות מדיניות תואמות SELinux. לכן, יכול להיות
את הפיתוח של SELinux במהירות רבה.
כדי להשתמש בו, מריצים את:
adb pull /sys/fs/selinux/policy
adb logcat -b events -d | audit2allow -p policy
עם זאת, צריך לבחון כל הוספה פוטנציאלית
חריגה של הרשאות. לדוגמה, הזנת audit2allow
של
הדחייה אחת (rmt_storage
) הוצגה קודם לכן
הצהרת מדיניות מוצעת של SELinux:
#============= shell ============== allow shell kernel:security setenforce; #============= rmt ============== allow rmt kmem_device:chr_file { read write };
זה יעניק ל-rmt
את היכולת לכתוב זיכרון ליבה,
חור אבטחה נוצץ. לעיתים קרובות ההצהרות audit2allow
הן רק
לנקודת ההתחלה. אחרי השימוש בהצהרות האלה, יכול להיות שתצטרכו לשנות את
את דומיין המקור והתווית של היעד, וגם לשלב תוכן
כדי ליצור מדיניות טובה. לפעמים הדחייה שנבדקת
לא יובילו לשינויים כלשהם במדיניות; ולא את האפליקציה הפוגעת
יש לשנות את ההגדרה.