[Ažuriranje: zakrpana druga ranjivost] Otkrivene su dvije kritične sigurnosne greške u pokretanju pokretača OnePlus 3/3T, jedna je zakrpana, a druge se rješavaju

Za OnePlus 3 i OnePlus 3T otkrivene su dvije greške povezane s bootloaderom. Jedan je zakrpan, drugi se rješava.

Otkako je ovaj članak objavljen, Oxygen OS verzija 4.0.3 zakrpao je drugu sigurnosnu ranjivost o kojoj se govori u ovom članku, naime onu dm-verity.

Prije nego što uđete u prekrasan svijet Android rootanja, prilagođenih ROM-ova, kernela i drugih izmjena, najprije morate otključati bootloader na svom uređaju.

Na nekim uređajima (osobito onima s markom operatera) to predstavlja problem jer se korisnici moraju suočiti sa značajnim tehničkim preprekama prije nego što mogu otključati bootloader. Drugi uređaji kao što su Huawei telefoni zahtijevaju od OEM-a da podnesete peticiju za jedinstveni kod za otključavanje bootloadera - mala prepreka za ulazak, ali nije jako teška. Još su bolji Google Nexus/Pixel serija ili OnePlus telefoni koji zahtijevaju samo da označite opciju u postavkama za razvojne programere, a zatim pošaljete nekoliko brzo pokretanje naredbe.

No koliko god teško bilo otključati vaš bootloader, jedna će stvar uvijek ostati nepromijenjena: zahtjev za brisanjem uređaja nakon otključavanja. To je učinjeno iz očitih sigurnosnih razloga, budući da se vaša cijela podatkovna particija može lako izdvojiti nakon što se bootloader otključa. Zlonamjerni entitet (s tehničkim znanjem i iskustvom) mogao bi flash pokrenuti prilagođeni oporavak i izdvojiti punu sigurnosnu kopiju vašeg uređaja ako dobije pristup vašim podacima. Zbog toga se otključavanje pokretačkog programa smatra sigurnosnim rizikom i zbog toga se vaš uređaj briše nakon otključavanja. Pod pretpostavkom da sve ide kako treba, redoviti korisnik trebao bi biti siguran od napadača koji otključavaju bootloader kako bi zaobišli standardne metode zaključavanja Androida. Ipak, ne ide sve po planu.


Ranjivost otključavanja pokretačkog programa OnePlus 3/3T

Novi skup ranjivosti bio je upravo objelodanjeno od Roee Hay (@roeehay), od kojih prvi omogućuje otključavanje pokretačkog programa za OnePlus 3/3T bez potvrde korisnika i bez pokretanja vraćanja na tvorničke postavke. Ova ranjivost, označena CVE-2017-5625, smatra se ranjivošću kritične ozbiljnosti i utječe na sve OnePlus 3/3T uređaje koji rade na OxygenOS 3.2-4.0.1. Korisnici koji su već nadogradili na inkrementalni OxygenOS 4.0.2 Ažuriraj nisu pogođeni ovom ranjivošću, jer je g. Hay privatno otkrio ovu grešku OnePlusu 23. siječnja kako bi mogli odmah zakrpati problem.

Greška radi slanjem vlasničke, skrivene naredbe za brzo pokretanje: fastboot oem 4F500301. Slanjem ove naredbe zaobilazi se stanje zaključavanja korisničkog pokretačkog programa (čak i kada "Dopusti OEM otključavanje" nije omogućeno u postavkama za razvojne programere). Uređaj ne obavještava korisnika niti briše uređaj kako bi trebao biti - zapravo, uređaj će i dalje javljati da je bootloader zaključan! Još jedna naredba za brzo pokretanje, fastboot oem 4F500302, poništit će neke postavke pokretačkog programa i može se koristiti za zaključavanje već otključanog uređaja.

Gospodin Hay otkrio je da prva naredba za brzo pokretanje postavlja ono što je on nazvao "magicFlag" koji poništava provjeru koja određuje stanje zaključavanja pokretačkog programa prilikom izvođenja naredbe treptanja ili brisanja.

// '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 rukovatelj


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

Čitaj više

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

Čitaj više

CVE-2017-5626 može se koristiti za izvrši kod kernela. Napadač može flashati bilo koju sliku za pokretanje koju želi. No, ako bljeskaju modificiranu sliku za pokretanje, aktivirat će se Verified Boot i upozoriti korisnika da je otkrivena izmjena. Jedan od načina na koji se to može zaobići je flashanje starije, neizmijenjene boot slike - one koja sadrži starije exploite koji su u međuvremenu zakrpani. Unatoč tome, "upozorenje" koje ste dobili traje samo 5 sekundi i ono se automatski odbacuje i pokreće u verifiedboot stanje gdje će se napadačev kod i dalje izvršavati.

G. Hay spominje da postoji gomila načina na koje se ovaj nedostatak može iskoristiti na zlonamjeran način. Na primjer, promijenio je sliku za pokretanje kako bi postavio SELinux način rada popustljiv kao i automatski uključiti ADB pristup pri dizanju. Zatim je, nakon što je iskoristio ovu ranjivost za fleširanje svoje modificirane slike za pokretanje, uspio pristupiti a root shell prije nego što korisnik uopće može unijeti svoje vjerodajnice.

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

Nepotrebno je reći da je ovo prilično ozbiljno. Ukradeni ili blokirani uređaj za koji mislite da je siguran zbog vaših tipičnih sigurnosnih mjera može se u potpunosti uništiti korištenjem ovog exploita.


OnePlus 3/3T SELinux ranjivost

Druga ranjivost, označena CVE-2017-5624, utječe sve verzije OxygenOS-a i omogućuje da se onemogući dm-verity. G. Hay otkrio je ovu ranjivost OnePlus Security timu na 16. siječnja, ali treba napomenuti da je XDA Senior Member th3g1zneovisno otkrili ovu ranjivost na 23. siječnja. Razgovarali smo s OnePlusom koji jesu potvrdili su da su prihvatili i da će popraviti ovu drugu ranjivost u budućem ažuriranju.

Ovaj napad je također prilično jednostavan za izvesti. Potrebno je izdati samo jednu naredbu za brzo pokretanje da biste onemogućili (ili omogućili) dm-verity: fastboot oem disable dm-verity. Da biste ga omogućili, jednostavno izdajte fastboot oem enable dm-verity. Rukovatelj za ovu naredbu, preuzet iz dumpa bootloadera, prikazan je u nastavku.


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

Izdavanje ove naredbe postavit će zastavu, koju gospodin Hay naziva dmVerity, koju koristi bootloader za slanje argumenta naredbenog retka jezgre koji može omogućiti ili onemogućiti dm-verity.

Ovo se može koristiti u kombinaciji s prvom ranjivošću za izvršavanje visoko privilegiranog koda na OnePlus 3/3T bez pristanka korisnika - i s pristupom korisničkim podacima. Na primjer, g. Hay je uspio instalirati aplikaciju u /system/priv-app što uzrokuje dodavanje aplikacije u domenu priv-app. To zlonamjernoj aplikaciji omogućuje pristup visoko privilegiranim funkcijama na uređaju. G. Hay pokazuje kako se obje ove ranjivosti iskorištavaju istovremeno u videu u nastavku. Kao što možete vidjeti, kada pokrene uređaj, aplikacija koju je izradio pokazuje se kao da je već unaprijed instalirana.


Zaključak i bilješka s OnePlusa

Moguće zlouporabe ove dvije sigurnosne ranjivosti su zastrašujuće. Pohvaljujemo gospodina Haya što je privatno i tako brzo otkrio ove ranjivosti OnePlusu. Ipak, ne možemo ne biti zabrinuti da su takve naredbe za brzo pokretanje dostupne na ovim uređajima. Kad smo napisali vodič o tome kako otkrijte skrivene naredbe za brzo pokretanje, naša je namjera bila obavijestiti korisnike da možda postoje neke zanimljive naredbe koje mogu koristiti za poboljšanje svog iskustva. Nikada nismo mislili da će se tako visoko privilegirane naredbe nalaziti u kodu bootloadera. Što se tiče "zašto" ove naredbe za brzo pokretanje uključene su u firmware, dobili smo a "bez komentara." 

Za sada, ako niste ažurirali svoj OnePlus 3/3T čim se objavi svaka verzija Oxygen OS-a, preporučujemo vam ažurirajte odmah. Ažuriranje na Oxygen OS 4.0.2 zaštitit će vas od prve ranjivosti, ali ćemo morati pričekati do OnePlusa izbacuje ažuriranje koje krpa drugu ranjivost prije nego što možemo reći da ste potpuno sigurni od ovih iskorištava. Morat ćemo paziti na takve vrste iskorištavanja u budućnosti.


Izvor: Roee Hay