Au fost descoperite două defecte legate de bootloader pentru OnePlus 3 și OnePlus 3T. Unul a fost corectat, celălalt este abordat.
De când a fost publicat acest articol, Oxygen OS versiunea 4.0.3 a corectat a doua vulnerabilitate de securitate discutată în acest articol, și anume cea dm-verity.
Înainte de a intra în lumea minunată a rootării Android, a ROM-urilor personalizate, a nucleelor și a altor modificări, mai întâi trebuie să deblocați bootloader-ul de pe dispozitiv.
Pe unele dispozitive (în special pe cele de marcă operator), acest lucru reprezintă o problemă, deoarece utilizatorii trebuie să facă față unor obstacole tehnice semnificative înainte de a putea debloca bootloader-ul. Alte dispozitive, cum ar fi telefoanele Huawei, vă solicită să solicitați OEM-ului un cod unic de deblocare a bootloaderului - o barieră minoră la intrare, dar nu foarte dificilă. Și mai bune sunt telefoanele din seria Google Nexus/Pixel sau OnePlus, care necesită doar să bifați o opțiune din Setările dezvoltatorului, apoi să trimiteți câteva fastboot comenzi.
Dar oricât de dificil ar fi să deblochezi bootloader-ul, un lucru va rămâne întotdeauna constant: cerința de a șterge dispozitivul la deblocare. Acest lucru se face din motive evidente de securitate, deoarece întreaga partiție de date poate fi extrasă cu ușurință odată ce bootloader-ul este deblocat. O entitate rău intenționată (cu cunoștințe tehnice) ar putea porni rapid o recuperare personalizată și poate extrage o copie de rezervă completă a dispozitivului dvs. dacă obține acces la datele dvs. De aceea, deblocarea bootloader-ului este considerată un risc de securitate și de aceea dispozitivul dvs. este șters după deblocare. Presupunând că totul merge așa cum ar trebui, un utilizator obișnuit ar trebui să fie ferit de atacatorii care deblochează bootloader-ul pentru a ocoli metodele standard de blocare Android. Totuși, nu totul merge conform planului.
Vulnerabilitatea de deblocare a încărctorului de pornire OnePlus 3/3T
Un nou set de vulnerabilități a fost tocmai dezvăluit de Roee Hay (@roeehay), primul dintre care permite deblocarea bootloader-ului OnePlus 3/3T fără confirmarea utilizatorului și fără a declanșa o resetare din fabrică. Această vulnerabilitate, etichetată CVE-2017-5625, este considerată o vulnerabilitate de gravitate critică și afectează toate dispozitivele OnePlus 3/3T care rulează pe OxygenOS 3.2-4.0.1. Utilizatorii care au făcut deja upgrade la OxygenOS incremental 4.0.2 Actualizați nu sunt afectate de această vulnerabilitate, deoarece domnul Hay a dezvăluit în privat acest defect lui OnePlus pe 23 ianuarie astfel încât să poată corecta problema imediat.
Defectul funcționează prin trimiterea unei comenzi de pornire rapidă proprietară, ascunsă: fastboot oem 4F500301
. Prin trimiterea acestei comenzi, starea de blocare a încărctorului de pornire a utilizatorului este ocolită (chiar și atunci când „Permite deblocarea OEM” nu a fost activată în Setările dezvoltatorului). Dispozitivul nu solicită utilizatorului și nici nu șterge dispozitivul așa cum ar trebui să fie - de fapt, dispozitivul va raporta în continuare că bootloader-ul este blocat! O altă comandă de pornire rapidă, fastboot oem 4F500302
, va reseta unele setări de bootloader și poate fi folosit pentru a bloca un dispozitiv deja deblocat.
Domnul Hay a descoperit că prima comandă de pornire rapidă setează ceea ce el a numit „magicFlag" care anulează verificarea care determină starea de blocare a bootloader-ului atunci când se execută o comandă intermitentă sau de ștergere.
// '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);
...
}
citeşte mai mult
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);
}
citeşte mai mult
CVE-2017-5626 poate fi folosit pentru executa codul kernelului. Un atacator poate flash orice imagine de boot dorește. Cu toate acestea, dacă se afișează o imagine de boot modificată, Verified Boot va începe și va avertiza utilizatorul că a fost detectată o modificare. O modalitate prin care aceasta poate fi ocolită este să flashați o imagine de pornire mai veche, nemodificată - una care conține exploit-uri mai vechi care au fost corectate de atunci. Chiar și așa, „avertismentul” că vi se dă durează doar 5 secunde și se îndepărtează automat și pornește în starea de pornire verificată, unde codul atacatorului se va executa în continuare.
Dl. Hay menționează că există o mulțime de moduri prin care acest defect poate fi exploatat într-o manieră rău intenționată. De exemplu, a modificat o imagine de boot pentru a seta modul SELinux la permisiv precum și să includă automat accesul ADB la pornire. Apoi, după ce a exploatat această vulnerabilitate pentru a afișa imaginea de boot modificată, a putut să acceseze un root shell înainte ca utilizatorul să-și poată introduce acreditările.
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
Inutil să spun că acest lucru este destul de grav. Un dispozitiv furat sau blocat pe care îl considerați sigur din cauza măsurilor de securitate tipice poate fi complet învins folosind acest exploit.
Vulnerabilitatea OnePlus 3/3T SELinux
A doua vulnerabilitate, etichetată CVE-2017-5624, afectează toate versiunile de OxygenOS și îi permite să dezactivați dm-verity. Domnul Hay a dezvăluit această vulnerabilitate echipei OnePlus Security 16 ianuarie, dar trebuie remarcat faptul că XDA Senior Member th3g1za descoperit în mod independent această vulnerabilitate pe 23 ianuarie. Am vorbit cu OnePlus care au au confirmat că au recunoscut și vor remedia această a doua vulnerabilitate într-o actualizare viitoare.
Acest atac este, de asemenea, destul de simplu de efectuat. Trebuie doar să lansați o singură comandă fastboot pentru a dezactiva (sau a activa) dm-verity: fastboot oem disable dm-verity
. Pentru a-l activa, pur și simplu emiteți fastboot oem enable dm-verity
. Managerul pentru această comandă, preluat dintr-un dump al bootloader-ului, este afișat mai jos.
// '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);
}
Lansarea acestei comenzi va seta un flag, pe care dl. Hay îl numește dmVerity, care este folosit de bootloader pentru a trimite un argument în linia de comandă a nucleului care poate activa sau dezactiva dm-verity.
Aceasta poate fi folosită în combinație cu prima vulnerabilitate pentru a executa cod cu privilegii înalte pe OnePlus 3/3T fără consimțământul utilizatorului - și cu acces la datele utilizatorului. De exemplu, domnul Hay a reușit să instaleze o aplicație în /system/priv-app, ceea ce face ca aplicația să fie adăugată la domeniul priv-app. Acest lucru permite accesul unei aplicații rău intenționate la funcțiile cu privilegii ridicate de pe dispozitiv. Domnul Hay demonstrează că ambele vulnerabilități sunt exploatate simultan în videoclipul de mai jos. După cum puteți vedea, atunci când pornește dispozitivul, aplicația pe care a construit-o se arată a fi deja preinstalată.
Concluzie și notă de la OnePlus
Potențialele abuzuri ale acestor două vulnerabilități de securitate sunt înfricoșătoare. Îl felicităm pe domnul Hay pentru că a dezvăluit aceste vulnerabilități în mod privat și atât de rapid către OnePlus. Totuși, nu putem să nu fim alarmați că astfel de comenzi de pornire rapidă sunt accesibile pe aceste dispozitive. Când am scris un ghid despre cum să descoperiți comenzile fastboot ascunse, intenția noastră a fost să informăm utilizatorii că pot exista unele comenzi interesante pe care le pot folosi pentru a-și îmbunătăți experiența. Niciodată nu ne-am gândit că astfel de comenzi privilegiate vor fi incluse în codul bootloader-ului. Cât despre "De ce" aceste comenzi fastboot sunt incluse în firmware, ni s-a dat un "Fără comentarii."
Deocamdată, dacă nu v-ați actualizat OnePlus 3/3T de îndată ce fiecare versiune a sistemului de operare Oxygen a fost lansată, vă recomandăm actualizați imediat. Actualizarea la Oxygen OS 4.0.2 vă va proteja de prima vulnerabilitate, dar va trebui să așteptăm până când OnePlus lansează o actualizare care corectează a doua vulnerabilitate înainte de a putea spune că sunteți pe deplin ferit de acestea exploatează. Va trebui să fim atenți la astfel de exploatări în viitor.
Sursa: Roee Hay