פגיעות של טוען האתחול של OnePlus 3/3T מאפשרת שינוי של SELinux למצב מתיר ב-Fastboot

פגיעות רצינית במטען האתחול של OnePlus 3/3T מאפשרת לתוקפים להחליף מצב SELinux מאכיפה למתירנית! המשך לקרוא כדי לדעת יותר!

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

אבל, אם נהיה הוגנים בהערכת המכשיר, עלינו להכיר בכך שלמרות המאמצים הטובים ביותר של OnePlus, ה-OnePlus 3/3T אינו חף מטעויות. לדוגמה, דיווחנו בעבר על בעיות אבטחה כגון OnePlus מדליף פרטי IMEI דרך הרשת כשאתה בודק אם יש עדכונים בטלפון שלך. ועכשיו, יש לנו עוד בעיית אבטחה להוסיף לרשימה, זו עם השלכות מסוכנות יותר.

פגיעות במטען האתחול של ה-OnePlus 3/3T פותחת דלתות להתקפות זדוניות. כפי שמצא Roee Hay מצוות המחקר של IBM X-Force Application Security ו נחשף בפלטפורמת IBM X-Force Exchange, פגיעות זו מאפשרת לתוקף לתפעל את מצב SELinux במכשירים, ובכך להעביר אותו למצב מתירני. כל מה שהתוקף צריך זה או גישה פיזית למכשיר, או גישה מרחוק לחיבור ADB למכשיר.

SELinux, או אבטחה משופרת לינוקס, הוא מודול אבטחת ליבת לינוקס המאפשר גישה וניהול של מדיניות אבטחה. SELinux הוצגה לאנדרואיד החל מאנדרואיד 4.3 והוגדרה 

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

הפגיעות היא די פשוטה לניצול - למעשה, נראה שזו פיקוח עצום מצד OnePlus ולא איך שהיית מדמיין שהניצול הטיפוסי שלך ייראה. ראשית, תוקף מאתחל מחדש את ה-OnePlus 3/3T למצב 'אתחול מהיר' - אם יש לך גישה פיזית, פשוט לחץ על כפתור הגברת עוצמת הקול במהלך האתחול, אך אם לא תוכל להוציא את פקודת ADB adb reboot bootloader למכשיר. מצב האתחול המהיר במכשיר חושף ממשק USB, שלא אמור לאפשר לשום פקודה רגישה לאבטחה לבצע במכשירים נעולים. אבל ב-OnePlus 3/3T, פשוט מנפיק את fastboot oem selinux permissive הפקודה דרך ממשק fastboot מחליפה את מצב ה-SELinux אכיפה ל מַתִיר.

fastboot oem selinux permissive
...
OKAY[ 0.045s]
finished. totaltime: 0.047s

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

כדי לסבך עוד יותר את הבעיה, ל-OnePlus 3 ו-3T אין שום ערך ב'אודות המסך' כדי להזכיר את מצב ה-SELinux הנוכחי של המכשיר. קורבן ימשיך להישאר לא מודע למצבו של המכשיר שלו בסיכון אם הוא לא היה עד לניצול בשימוש פעיל. היעדר ערך מצב SELinux ב'אודות המסך' חסר הן במהדורות ה-Open Beta המבוססות על אנדרואיד 6.0 והן ב-ROM הרשמי של אנדרואיד 7.0.

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

לא קיימים תרופות נגד הפגיעות נכון להיום.


עדכון:

הגענו ל Sultanxda, אחד ממפתחי ה-ROM המותאמים אישית המוכרים ביותר עבור מכשירי OnePlus, כדי לראות אם הוא יכול לעזור לנו ללמוד עוד על בעיה זו. הוא חפר מייד בקוד כדי למצוא את מקור השורש, זה מה שהוא מצא:

הדרך שבה "fastboot oem selinux "הפקודה עובדת היא שהיא מוסיפה ארגומנט נוסף לשורת הפקודה של הליבה בעת אתחול לינוקס. הארגומנט הנוסף מגיע בצורה של "androidboot.selinux=", איפה יכול להיות "מתירני". שם דברים מצחיקים: "androidboot." הארגומנטים בשורת הפקודה של הליבה מנותחים על ידי init של אנדרואיד. במבנה רגיל של ייצור אנדרואיד (מבנה "משתמש"), ארגומנט "androidboot.selinux" מתעלם לחלוטין ו-selinux תמיד נאלץ לאכוף. אז הבאג הזה מורכב משתי בעיות:

  1. משתמשים יכולים לגרום למטען האתחול להעביר דגל שבדרך כלל יהפוך את selinux למתירני ב-ROM הנדסי/ניפוי באגים
  2. OnePlus שינתה את ה-init של אנדרואיד כדי לכבד את דגל "androidboot.selinux" אפילו עבור בניית ROM ייצור

הנה המקום שבו ה-init של אנדרואיד מוגדר להתעלם מדגל "androidboot.selinux" עבור בניית ייצור: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

הדגל ALLOW_DISABLE_SELINUX בקוד המקור מוגדר רק ל-1 עבור בניית באגים ובניית הנדסה של משתמשים

(ה-ROM שלי לא מושפע מזה כי אני בונה את ה-ROM שלי במצב ייצור (משתמש))

אז פשוט מתעלמים מ-"androidboot.selinux" ב-ROM שלי, "fastboot oem selinux נראה שגם הפקודה היא משהו ש-OnePlus יצרה, מכיוון שלא קיימת פקודה כזו במקורות מאתחול האתחול הציבוריים של CAF. מעל הראש שלי, אני יכול לחשוב על 4 דרכים לתקן את זה עבור משתמשים עם מטעני אתחול לא נעולים:

  1. ערוך בצורה משושה את טוען האתחול כדי לשנות את כל המופעים של המחרוזת "selinux" למשהו שונה (כמו "sclinux") כך שהדגל לא יזוהה על ידי init של אנדרואיד
  2. ערוך בצורה משושה את ה-Init הבינארי של Android ב-OxygenOS כדי להחליף את כל המופעים של "androidboot.selinux" ל- משהו שונה (כמו "androidboot.sclinux") כך ש-Android init לא יזהה את דגל androidboot.selinux
  3. הוסף פריצה למנהל ההתקן של שורת הפקודה הליבה בדומה למעקף SafetyNet שלי כדי להסתיר את הדגל "androidboot.selinux" מה-init של אנדרואיד

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


אנו מקווים ש-OnePlus מכירה בפומבי בבעיה החמורה ותהיה שקוף בתוכניות שלה לתקן אותה.