[Atnaujinimas: pataisytas antrasis pažeidžiamumas] Aptikti du svarbūs „OnePlus 3/3T“ įkrovos įkroviklio saugos trūkumai, vienas pataisytas ir kiti sprendžiami

Buvo aptikti du „OnePlus 3“ ir „OnePlus 3T“ įkrovos įkrovos trūkumai. Vienas lopytas, kitas sprendžiamas.

Nuo tada, kai buvo paskelbtas šis straipsnis, Oxygen OS 4.0.3 versija pataisė antrą šiame straipsnyje aptartą saugos pažeidžiamumą, būtent dm-verity.

Prieš patekdami į nuostabų Android įsišaknijimo, tinkintų ROM, branduolių ir kitų modifikacijų pasaulį, pirmiausia turite atrakinti įkrovos įkroviklį savo įrenginyje.

Kai kuriuose įrenginiuose (ypač operatoriaus firminiuose) tai kelia problemų, nes vartotojai turi susidoroti su didelėmis techninėmis kliūtimis, kad galėtų atrakinti įkrovos įkroviklį. Kituose įrenginiuose, pvz., „Huawei“ telefonuose, reikia kreiptis į originalios įrangos gamintoją dėl unikalaus įkrovos atrakinimo kodo – nedidelė kliūtis patekti į rinką, bet nėra labai sudėtinga. Dar geresni yra „Google Nexus“ / „Pixel“ serijos arba „OnePlus“ telefonai, kuriems reikia tik pažymėti parinktį kūrėjo nustatymuose, tada išsiųsti keletą greitas paleidimas komandas.

Bet kad ir kaip sunku būtų atrakinti įkrovos įkroviklį, vienas dalykas visada išliks nepakitęs: reikalavimas nuvalyti įrenginį atrakinant. Tai daroma dėl akivaizdžių saugumo priežasčių, nes visą duomenų skaidinį galima lengvai išskleisti, kai atrakinama įkrovos programa. Kenkėjiškas subjektas (turėdamas techninių žinių) gali greitai paleisti pasirinktinį atkūrimą ir išgauti visą įrenginio atsarginę kopiją, jei gautų prieigą prie jūsų duomenų. Štai kodėl įkrovos įkroviklio atrakinimas laikomas saugumo rizika, todėl įrenginys nuvalomas jį atrakinę. Darant prielaidą, kad viskas vyksta taip, kaip turėtų, paprastas vartotojas turėtų būti apsaugotas nuo užpuolikų, kurie atrakina įkrovos įkroviklį, kad apeitų standartinius „Android“ užrakinimo metodus. Tačiau ne viskas vyksta pagal planą.


„OnePlus 3/3T“ įkrovos tvarkyklės atrakinimo pažeidžiamumas

Buvo naujas pažeidžiamumų rinkinys ką tik atskleista pateikė Roee Hay (@roeehay), pirmasis iš jų leidžia atrakinti „OnePlus 3/3T“ įkrovos įkroviklį be vartotojo patvirtinimo ir neatkuriant gamyklinių parametrų. Šis pažeidžiamumas, pažymėtas CVE-2017-5625, yra laikomas kritiniu pažeidžiamumu ir turi įtakos visiems OnePlus 3/3T įrenginiams, kuriuose veikia OxygenOS 3.2–4.0.1. Vartotojai, kurie jau atnaujino į laipsniškas OxygenOS 4.0.2 atnaujinti nėra paveikti dėl šio pažeidžiamumo, nes ponas Hay privačiai atskleidė šį trūkumą „OnePlus“. sausio 23 d kad jie galėtų nedelsiant išspręsti problemą.

Trūkumas veikia siunčiant patentuotą, paslėptą greitosios įkrovos komandą: fastboot oem 4F500301. Siunčiant šią komandą, vartotojo įkrovos įkrovos užrakto būsena apeinama (net jei kūrėjo nustatymuose neįjungta parinktis „Leisti OEM atrakinimą“). Įrenginys neprašo vartotojo ir nenuvalo įrenginio taip, kaip turėtų būti – iš tikrųjų įrenginys vis tiek praneš, kad įkrovos programa užrakinta! Kita greito paleidimo komanda, fastboot oem 4F500302, iš naujo nustatys kai kuriuos įkrovos įkrovos nustatymus ir bus galima užrakinti jau atrakintą įrenginį.

Ponas Hay'us atrado, kad pirmoji „fastboot“ komanda nustato tai, ką jis pavadino „magijaVėliava“, kuris nepaiso patikrinimo, kuris nustato įkrovos įkrovos užrakto būseną, kai atliekama mirksėjimo arba trynimo komanda.

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

Skaityti daugiau

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

Skaityti daugiau

CVE-2017-5626 galima naudoti vykdyti branduolio kodą. Užpuolikas gali suaktyvinti bet kurį norimą įkrovos vaizdą. Tačiau, jei jie mirksi modifikuotu įkrovos vaizdu, Verified Boot įsijungs ir įspės vartotoją, kad buvo aptikta modifikacija. Vienas iš būdų tai apeiti yra paleisti senesnį, nepakeistą įkrovos vaizdą – tokį, kuriame yra senesnių išnaudojimų, kurie nuo to laiko buvo pataisyti. Nepaisant to, jums duotas „perspėjimas“ trunka tik 5 sekundes, jis automatiškai atsisako ir paleidžiamas į patikrintos įkrovos būseną, kurioje vis tiek bus vykdomas užpuoliko kodas.

P. Hay užsimena, kad yra daugybė būdų, kaip ši klaida gali būti piktybiškai išnaudota. Pavyzdžiui, jis pakeitė įkrovos vaizdą, kad nustatytų SELinux režimą leistinas taip pat automatiškai įtraukti ADB prieigą įkrovos metu. Tada, pasinaudojęs šiuo pažeidžiamumu, kad suaktyvintų modifikuotą įkrovos vaizdą, jis galėjo pasiekti a root apvalkalą, kol vartotojas net negali įvesti savo kredencialų.

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

Nereikia nė sakyti, kad tai gana rimta. Pavogtas arba sumūrytas įrenginys, kuris, jūsų manymu, yra saugus dėl įprastų saugumo priemonių, gali būti visiškai nugalėtas naudojant šį išnaudojimą.


„OnePlus 3/3T SELinux“ pažeidžiamumas

Antrasis pažeidžiamumas, pažymėtas CVE-2017-5624, paveikia visos OxygenOS versijos ir leidžia vienam išjungti dm-verity. Ponas Hay atskleidė šį pažeidžiamumą „OnePlus Security“ komandai sausio 16 d, tačiau reikia pažymėti, kad XDA vyresnysis narys th3g1zsavarankiškai atrado šį pažeidžiamumą įjungta sausio 23 d. Kalbėjomės su „OnePlus“, kurie tai padarė patvirtino, kad jie pripažino ir ištaisys šį antrąjį pažeidžiamumą būsimame atnaujinime.

Šią ataką taip pat gana paprasta atlikti. Norint išjungti (arba įjungti) dm-verity, tereikia išduoti vieną „fastboot“ komandą: fastboot oem disable dm-verity. Norėdami jį įjungti, tiesiog išduokite fastboot oem enable dm-verity. Šios komandos tvarkytojas, paimtas iš įkrovos įkrovos failo, parodyta žemiau.


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

Išleidus šią komandą, bus nustatyta vėliavėlė, kurią p. Hay vadina dmVerity, kurią naudoja įkrovos įkroviklis, kad išsiųstų branduolio komandinės eilutės argumentą, kuris gali įjungti arba išjungti dm-verity.

Tai gali būti naudojama kartu su pirmuoju pažeidžiamumu, leidžiančiu paleisti itin privilegijuotą kodą „OnePlus 3/3T“ be vartotojo sutikimo ir turint prieigą prie vartotojo duomenų. Pavyzdžiui, ponas Hay sugebėjo įdiegti programą į /system/priv-app, dėl kurios programa pridedama prie priv-app domeno. Tai leidžia kenkėjiškai programai pasiekti itin privilegijuotas įrenginio funkcijas. P. Hay toliau pateiktame vaizdo įraše demonstruoja, kad abi šios spragos yra išnaudojamos vienu metu. Kaip matote, jam paleidus įrenginį rodoma, kad jo sukurta programa jau yra iš anksto įdiegta.


Išvada ir pastaba iš „OnePlus“.

Galimas šių dviejų saugumo spragų piktnaudžiavimas yra bauginantis. Mes pagiriame poną Hay už tai, kad jis privačiai ir taip greitai atskleidė šias spragas „OnePlus“. Visgi negalime nesijaudinti, kad šiuose įrenginiuose tokios „fastboot“ komandos pasiekiamos. Kai parašėme vadovą, kaip atraskite paslėptas greitosios įkrovos komandas, mes norėjome informuoti vartotojus, kad gali būti įdomių komandų, kurias jie gali naudoti norėdami pagerinti savo patirtį. Niekada nemanėme, kad įkrovos įkrovos kode bus tokios labai privilegijuotos komandos. Kalbant apie "kodėl" Šios greitosios įkrovos komandos yra įtrauktos į programinę įrangą, mums buvo suteikta a "be komentarų." 

Kol kas, jei neatnaujinote „OnePlus 3/3T“, kai tik buvo išleista kiekviena „Oxygen OS“ versija, rekomenduojame nedelsiant atnaujinti. Atnaujinimas į Oxygen OS 4.0.2 apsaugos jus nuo pirmojo pažeidžiamumo, bet turėsime palaukti, kol „OnePlus“ išleidžia naujinimą, kuris pataiso antrąjį pažeidžiamumą, kol galime pasakyti, kad esate visiškai apsaugoti nuo jų išnaudoja. Ateityje turėsime žiūrėti į tokius išnaudojimus.


Šaltinis: Roee Hay