[Posodobitev: druga ranljivost popravljena] Odkriti dve kritični varnostni napaki zagonskega nalagalnika OnePlus 3/3T, ena je popravljena, druge pa se obravnavajo

Za OnePlus 3 in OnePlus 3T sta bili odkriti dve napaki, povezani z zagonskim nalagalnikom. Eden je bil popravljen, drugi se obravnava.

Odkar je bil ta članek objavljen, je Oxygen OS različica 4.0.3 zakrpal drugo varnostno ranljivost, o kateri razpravljamo v tem članku, in sicer ranljivost dm-verity.

Preden vstopite v čudoviti svet koreninjenja Androida, ROM-ov po meri, jeder in drugih modifikacij, morate najprej odkleniti zagonski nalagalnik v vaši napravi.

Na nekaterih napravah (zlasti tistih z blagovno znamko operaterja) to predstavlja težavo, saj se morajo uporabniki soočiti s precejšnjimi tehničnimi ovirami, preden lahko odklenejo zagonski nalagalnik. Druge naprave, kot so telefoni Huawei, zahtevajo, da pri proizvajalcu originalne opreme zaprosite za edinstveno kodo za odklepanje zagonskega nalagalnika – manjša ovira za vstop, a ni zelo težavna. Še boljši so telefoni Google Nexus/Pixel ali telefoni OnePlus, ki zahtevajo le, da označite možnost v nastavitvah za razvijalce in nato pošljete nekaj hitri zagon ukazi.

Toda ne glede na to, kako težko je odklepanje zagonskega nalagalnika, bo ena stvar vedno ostala nespremenjena: zahteva po brisanju naprave ob odklepanju. To je storjeno iz očitnih varnostnih razlogov, saj je vašo celotno podatkovno particijo mogoče zlahka ekstrahirati, ko je zagonski nalagalnik odklenjen. Zlonamerna entiteta (s tehničnim znanjem in izkušnjami) bi lahko bliskovito zagnala obnovitev po meri in ekstrahirala celotno varnostno kopijo vaše naprave, če pridobi dostop do vaših podatkov. Zato se odklepanje zagonskega nalagalnika šteje za varnostno tveganje in zato se po odklepanju naprave izbriše. Ob predpostavki, da gre vse tako, kot bi moralo, bi moral biti običajni uporabnik varen pred napadalci, ki odklenejo zagonski nalagalnik in tako zaobidejo standardne metode zaklepanja Android. Vendar ne gre vse po načrtih.


Ranljivost pri odklepanju zagonskega nalagalnika OnePlus 3/3T

Nov niz ranljivosti je bil pravkar razkrito avtor Roee Hay (@roeehay), od katerih prvi omogoča odklepanje zagonskega nalagalnika OnePlus 3/3T brez potrditve uporabnika in brez sprožitve ponastavitve na tovarniške nastavitve. Ta ranljivost, označena CVE-2017-5625, velja za ranljivost kritične resnosti in vpliva na vse naprave OnePlus 3/3T, ki delujejo na OxygenOS 3.2–4.0.1. Uporabniki, ki so že nadgradili na inkrementalni OxygenOS 4.0.2 nadgradnja niso prizadeti s to ranljivostjo, saj je g. Hay zasebno razkril to napako OnePlusu 23. januarja da bi lahko takoj odpravili težavo.

Napaka deluje tako, da pošlje lastniški, skriti ukaz hitrega zagona: fastboot oem 4F500301. S pošiljanjem tega ukaza se zaobide stanje zaklepanja zagonskega nalagalnika uporabnika (tudi če možnost »Dovoli odklepanje OEM« ni omogočena v nastavitvah za razvijalce). Naprava ne pozove uporabnika niti ne izbriše naprave, kot bi morala biti - pravzaprav bo naprava še vedno poročala, da je zagonski nalagalnik zaklenjen! Še en ukaz za hitri zagon, fastboot oem 4F500302, bo ponastavil nekatere nastavitve zagonskega nalagalnika in ga je mogoče uporabiti za zaklepanje že odklenjene naprave.

G. Hay je odkril, da prvi ukaz za hitri zagon nastavi, kar je poimenoval "magicFlag", ki preglasi preverjanje, ki določa stanje zaklepanja zagonskega nalagalnika pri izvajanju ukaza za utripanje ali brisanje.

// '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);
...
 }

Preberi več

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);
}

Preberi več

CVE-2017-5626 je mogoče uporabiti za izvedba kode jedra. Napadalec lahko zažene katero koli zagonsko sliko, ki jo želi. Če pa zaženejo spremenjeno zagonsko sliko, se bo Verified Boot sprožil in uporabnika opozoril, da je bila zaznana sprememba. Eden od načinov, kako se temu izogniti, je, da zaženete starejšo, nespremenjeno zagonsko sliko – tisto, ki vsebuje starejše izkoriščanja, ki so bila medtem popravljena. Kljub temu "opozorilo", ki ga prejmete, traja samo 5 sekund in se samodejno opusti ter zažene v stanje verifiedboot, kjer se bo napadalčeva koda še vedno izvajala.

G. Hay omenja, da obstaja ogromno načinov, kako je to napako mogoče zlonamerno izkoristiti. Na primer, spremenil je zagonsko sliko, da je nastavil način SELinux permisiven kot tudi samodejno vključi dostop do ADB ob zagonu. Potem, ko je izkoristil to ranljivost za flash svoje spremenjene zagonske slike, je lahko dostopal do a korensko lupino, preden lahko uporabnik sploh vnese svoje poverilnice.

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

Ni treba posebej poudarjati, da je to precej resno. Ukradeno ali okvarjeno napravo, za katero menite, da je varna zaradi vaših tipičnih varnostnih ukrepov, je mogoče popolnoma premagati s tem izkoriščanjem.


Ranljivost OnePlus 3/3T SELinux

Druga ranljivost, označena CVE-2017-5624, vpliva vse različice OxygenOS in omogoča, da onemogoči dm-verity. G. Hay je to ranljivost razkril varnostni ekipi OnePlus dne 16. januar, vendar je treba opozoriti, da višji član XDA th3g1zneodvisno odkril to ranljivost na 23. januar. Pogovarjali smo se s podjetjem OnePlus, ki je potrdili, da so priznali in bodo odpravili to drugo ranljivost v prihodnji posodobitvi.

Tudi ta napad je dokaj enostaven za izvedbo. Če želite onemogočiti (ali omogočiti) dm-verity, morate izdati samo en ukaz za hitri zagon: fastboot oem disable dm-verity. Če ga želite omogočiti, preprosto izdajte fastboot oem enable dm-verity. Upravljalnik za ta ukaz, vzet iz izpisa zagonskega nalagalnika, je prikazan spodaj.


// '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);
}

Izdaja tega ukaza bo nastavila zastavico, ki jo gospod Hay imenuje dmVerity, ki jo uporablja zagonski nalagalnik za pošiljanje argumenta ukazne vrstice jedra, ki lahko omogoči ali onemogoči dm-verity.

To je mogoče uporabiti v kombinaciji s prvo ranljivostjo za izvajanje zelo privilegirane kode na OnePlus 3/3T brez privolitve uporabnika – in z dostopom do podatkov uporabnika. G. Hay je na primer lahko namestil aplikacijo v /system/priv-app, zaradi česar je bila aplikacija dodana v domeno priv-app. To zlonamerni aplikaciji omogoča dostop do visoko privilegiranih funkcij v napravi. G. Hay v spodnjem videoposnetku prikazuje, kako se obe ranljivosti izkoriščata hkrati. Kot lahko vidite, je ob zagonu naprave prikazana aplikacija, ki jo je ustvaril, že vnaprej nameščena.


Zaključek in opomba OnePlus

Morebitne zlorabe teh dveh varnostnih ranljivosti so zastrašujoče. Pohvalimo gospoda Haya, ker je OnePlus zasebno in tako hitro razkril te ranljivosti. Kljub temu si ne moremo kaj, da ne bi bili zaskrbljeni, da so takšni ukazi za hitri zagon dostopni v teh napravah. Ko smo napisali vodnik, kako odkrijte skrite ukaze hitrega zagona, je bil naš namen obvestiti uporabnike, da morda obstajajo nekateri zanimivi ukazi, ki jih lahko uporabijo za izboljšanje svoje izkušnje. Nikoli si nismo mislili, da bodo tako zelo privilegirani ukazi sedeli v kodi zagonskega nalagalnika. Kar zadeva "zakaj" ti ukazi za hitri zagon so vključeni v vdelano programsko opremo, smo dobili a "brez komentarja." 

Če zaenkrat niste posodabljali svojega OnePlus 3/3T takoj, ko je bila izdana vsaka različica operacijskega sistema Oxygen OS, priporočamo, da posodobite takoj. Posodobitev na Oxygen OS 4.0.2 vas bo zaščitila pred prvo ranljivostjo, vendar bomo morali počakati do OnePlus uvede posodobitev, ki popravi drugo ranljivost, preden lahko rečemo, da ste popolnoma varni pred temi izkorišča. V prihodnje bomo morali še naprej paziti na tovrstne podvige.


Vir: Roee Hay