[עדכון: פגיעות שנייה תוקנה] שני פגמי אבטחה קריטיים של OnePlus 3/3T Bootloader התגלו, אחד תוקן ואחר מטופל

click fraud protection

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

מאז פרסום מאמר זה, Oxygen OS גרסה 4.0.3 תיקנה את פגיעות האבטחה השנייה הנדונה במאמר זה, כלומר dm-verity one.

לפני הכניסה לעולם המופלא של השתרשות אנדרואיד, ROMs מותאמים אישית, גרעינים ושינויים אחרים, תחילה עליך לבטל את נעילת טוען האתחול במכשיר שלך.

במכשירים מסוימים (במיוחד במותגים של ספקים), הדבר מהווה בעיה מכיוון שמשתמשים צריכים להתמודד עם מכשולים טכניים משמעותיים לפני שהם יכולים לפתוח את מעמס האתחול. מכשירים אחרים, כגון טלפונים של Huawei, דורשים ממך להגיש בקשה ל-OEM עבור קוד פתיחת נעילה ייחודי של טוען האתחול - מחסום קל לכניסה, אך לא מאוד קשה. אפילו טובים יותר הם סדרת Google Nexus/Pixel או טלפונים של OnePlus שרק דורשים ממך לסמן אפשרות בהגדרות המפתחים ואז לשלוח כמה מהיר אתחול פקודות.

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


ביטול נעילה של OnePlus 3/3T Bootloader

קבוצה חדשה של פגיעות הייתה רק נחשף מאת Roee Hay (@roeehay), הראשון שבהם מאפשר לבטל את הנעילה של טוען האתחול של OnePlus 3/3T ללא אישור משתמש וללא הפעלת איפוס להגדרות היצרן. פגיעות זו, שכותרתה CVE-2017-5625, נחשבת לפגיעת חומרה קריטית והיא משפיעה על כל מכשירי OnePlus 3/3T הפועלים על OxygenOS 3.2-4.0.1. משתמשים שכבר שדרגו ל- OxygenOS 4.0.2 אינקרמנטלי עדכון אינם מושפעים על ידי פגיעות זו, שכן מר היי חשף באופן פרטי את הפגם הזה בפני OnePlus ב-23 בינואר כדי שיוכלו לתקן את הבעיה באופן מיידי.

הפגם עובד על ידי שליחת פקודת fastboot קניינית ונסתרת: fastboot oem 4F500301. על ידי שליחת פקודה זו, מצב הנעילה של טוען האתחול של המשתמש עוקף (גם כאשר "אפשר ביטול נעילה של OEM" לא הופעל בהגדרות המפתחים). המכשיר לא מנחה את המשתמש וגם לא מוחק את המכשיר כמו שצריך - למעשה, המכשיר עדיין ידווח שה-bootloader נעול! פקודת fastboot נוספת, fastboot oem 4F500302, יאפס כמה הגדרות של טוען האתחול, וניתן להשתמש בו כדי לנעול מכשיר שכבר לא נעול.

מר היי גילה שפקודת fastboot הראשונה מגדירה את מה שהוא כינה "magicFlag" אשר עוקף את הבדיקה הקובעת את מצב הנעילה של טוען האתחול בעת ביצוע פקודה מהבהבת או מחיקה.

// 'oem 4F500301' handler
intsub_918427F0()
{
magicFlag_dword_91989C10 = 1;
if ( dword_9198D804 != dword_9198D804 )
assert(1, dword_9198D804, dword_9198D804);
return sendOK((int)"", dword_9198D804);
}

Fastboot Flash Handler


// 'flash' handler
constchar *__fastcall sub_91847EEC(char *partitionName, int *a2, int a3)
{
char *pname; // r5@1
...
pname = partitionName;
v4 = a2;
v5 = a3;
if ( returnTRUE1(partitionName, (int)a2) )
{
result = (constchar *)sub_918428F0(pname, v6);
if ( (result || magicFlag_dword_91989C10)
&& ((result = (constchar *)sub_91842880(pname, v10)) != 0 || magicFlag_dword_91989C10) )
{
result = (constchar *)sub_918428F0(pname, v10);
if ( !result || magicFlag_dword_91989C10 )
goto LABEL_7;
v8 = dword_9198D804;
if ( dword_9198D804 != dword_9198D804 )
goto LABEL_28;
v11 = "Critical partition flashing is not allowed";
}
else
{
v8 = dword_9198D804;
if ( dword_9198D804 != dword_9198D804 )
goto LABEL_28;
v11 = "Partition flashing is not allowed";
}
return (constchar *)FAIL2((int)v11, v10);
}
LABEL_7:
...
if ( *v4 != 0xED26FF3A )
{
if ( *v4 == 0xCE1AD63C )
cmd_flash_meta_img(pname, (unsigned int)v4, v5);
else
cmd_flash_mmc_img(pname, (int)v4, v5);
goto LABEL_10;
}
v7 = v4;
}
cmd_flash_mmc_sparse_img(pname, (int)v7, v5);
...
 }

קרא עוד

Fastboot Erase Handler


// 'erase' handler
int __fastcall sub_91847118(char *partitionName, int a2, int a3)
{
 ...
v3 = partitionName;
v4 = returnTRUE1(partitionName, a2);
if ( !v4 )
{
LABEL_7:
...
if ( v4 )
{
if ( dword_9198D804 == dword_9198D804 )
return eraseParition(v3);
}
...
}
v4 = sub_918428F0(v3, v5);
if ( !v4 && !magicFlag_dword_91989C10 )
{
v6 = dword_9198D804;
if ( dword_9198D804 == dword_9198D804 )
{
v7 = "Partition erase is not allowed";
return FAIL2((int)v7, v5);
}
goto LABEL_23;
}
v4 = sub_91842880(v3, v5);
if ( !v4 && !magicFlag_dword_91989C10 )
{
v6 = dword_9198D804;
if ( dword_9198D804 == dword_9198D804 )
{
v7 = "Partition flashing is not allowed";
return FAIL2((int)v7, v5);
}
LABEL_23:
assert(v4, v5, v6);
}
v4 = sub_918428F0(v3, v5);
if ( !v4 || magicFlag_dword_91989C10 )
goto LABEL_7;
v6 = dword_9198D804;
...
v7 = "Critical partition erase is not allowed";
return FAIL2((int)v7, v5);
}

קרא עוד

ניתן להשתמש ב-CVE-2017-5626 להפעיל קוד ליבה. תוקף יכול להבהב כל תמונת אתחול שהוא רוצה. עם זאת, אם הם מהבהבים תמונת אתחול ששונתה אתחול מאומת ייכנס ויזהיר את המשתמש ששינוי זוהה. דרך אחת שניתן לעקוף את זה היא להבהב תמונת אתחול ישנה יותר, ללא שינוי - כזו המכילה ניצולים ישנים יותר שתוקנו מאז. למרות זאת, ה"אזהרה" שניתנת לך נמשכת רק 5 שניות, והיא מבטלת את עצמה אוטומטית ומתחלת למצב אתחול מאומת שבו הקוד של התוקף עדיין יבוצע.

מר היי מזכיר שיש המון דרכים שניתן לנצל את הפגם הזה בצורה זדונית. לדוגמה, הוא שינה תמונת אתחול כדי להגדיר את מצב SELinux מַתִיר כמו גם לכלול אוטומטית גישת ADB באתחול. לאחר מכן, לאחר שניצל את הפגיעות הזו כדי להבהב את תמונת האתחול המותאמת שלו, הוא הצליח לגשת ל-a מעטפת שורש לפני שהמשתמש יכול אפילו להזין את האישורים שלו.

OnePlus3:/ # id
uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),
3003(inet),3006(net_bw_stats),3009(readproc) context=u: r: su: s0

OnePlus3:/ # getenforce
Permissive

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


פגיעות של OnePlus 3/3T SELinux

הפגיעות השנייה, שכותרתה CVE-2017-5624, משפיע כל הגרסאות של OxygenOS ומאפשרת לאדם השבת את dm-verity. מר היי חשף את הפגיעות הזו בפני צוות האבטחה של OnePlus בתאריך 16 בינואר, אך יש לציין כי XDA חבר בכיר th3g1zגילה באופן עצמאי את הפגיעות הזו עַל 23 בינואר. דיברנו עם OnePlus שכן אישרו שהם הכירו ויתקנו את הפגיעות השנייה הזו בעדכון עתידי.

התקפה זו גם די פשוטה לביצוע. צריך רק להוציא פקודת fastboot אחת כדי להשבית (או להפעיל) dm-verity: fastboot oem disable dm-verity. כדי לאפשר את זה, פשוט הנפק fastboot oem enable dm-verity. המטפל עבור פקודה זו, שנלקח מ-dump של טוען האתחול, מוצג להלן.


// 'oem disable_dm_verity' handler
intsub_9183B8EC()
{
int v0; // r0@1
int v1; // r1@1

dmVerity_dword_91960740 = 0;
v0 = sub_91845E10("ANDROID-BOOT!");
if ( dword_9198D804 != dword_9198D804 )
assert(v0, v1, dword_9198D804);
return sendOK((int)"", v1);
}

הנפקת פקודה זו תגדיר דגל, שמר היי קורא לו dmVerity, המשמש את טוען האתחול לשליחת ארגומנט שורת פקודה ליבה שיכול להפעיל או להשבית את dm-verity.

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


מסקנה והערה מ-OnePlus

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

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


מקור: Roee Hay