[Aktualizácia: Opravená druhá zraniteľnosť] Zistili sa dva kritické bezpečnostné chyby zavádzača OnePlus 3/3T, jeden je opravený a ďalší sa rieši

Pre OnePlus 3 a OnePlus 3T boli objavené dve chyby súvisiace s bootloaderom. Jeden je opravený, druhý sa rieši.

Od zverejnenia tohto článku Oxygen OS verzia 4.0.3 opravila druhú bezpečnostnú chybu, o ktorej sa hovorí v tomto článku, konkrétne dm-verity.

Pred vstupom do úžasného sveta rootovania Androidu, vlastných ROM, jadier a iných úprav musíte najskôr odomknúť bootloader na svojom zariadení.

Na niektorých zariadeniach (najmä značkových operátorov) to predstavuje problém, pretože používatelia sa musia pred odomknutím bootloadera vysporiadať s výraznými technickými prekážkami. Iné zariadenia, ako napríklad telefóny Huawei, vyžadujú, aby ste požiadali výrobcu OEM o jedinečný kód na odomknutie zavádzača – menšiu prekážku vstupu, ale nie veľmi ťažkú. Ešte lepšie sú telefóny série Google Nexus/Pixel alebo OnePlus, ktoré vyžadujú, aby ste zaškrtli niektorú možnosť v nastaveniach vývojára a potom odoslali niekoľko rýchla topánka príkazy.

Ale bez ohľadu na to, aké ťažké môže byť odomknutie vášho bootloadera, jedna vec zostane vždy konštantná: požiadavka vymazať zariadenie pri odomknutí. Deje sa tak zo zrejmých bezpečnostných dôvodov, pretože celý dátový oddiel možno ľahko extrahovať po odomknutí zavádzača. Škodlivý subjekt (s technickým know-how) by mohol spustiť vlastné obnovenie a extrahovať úplnú zálohu vášho zariadenia, ak získa prístup k vašim údajom. To je dôvod, prečo sa odomknutie bootloadera považuje za bezpečnostné riziko, a preto je vaše zariadenie po odomknutí vymazané. Za predpokladu, že všetko ide tak, ako má, bežný používateľ by mal byť v bezpečí pred útočníkmi, ktorí odomknú bootloader, aby obišli štandardné metódy uzamknutia systému Android. Nie všetko však ide podľa plánu.


Chyba zabezpečenia pri odomykaní zavádzača OnePlus 3/3T

Bol to nový súbor zraniteľností práve zverejnené od Roee Hay (@roeehay), z ktorých prvý umožňuje odomknutie bootloadera OnePlus 3/3T bez potvrdenia používateľom a bez spustenia obnovenia továrenských nastavení. Táto zraniteľnosť, označená CVE-2017-5625, sa považuje za kritickú chybu zabezpečenia a ovplyvňuje všetky zariadenia OnePlus 3/3T bežiace na OxygenOS 3.2-4.0.1. Používatelia, ktorí už inovovali na inkrementálny OxygenOS 4.0.2 aktualizovať nie sú ovplyvnené touto zraniteľnosťou, keďže pán Hay túto chybu súkromne prezradil spoločnosti OnePlus dňa 23. januára aby mohli problém okamžite opraviť.

Chyba funguje odoslaním proprietárneho skrytého príkazu na rýchle spustenie: fastboot oem 4F500301. Odoslaním tohto príkazu sa obíde stav uzamknutia zavádzača používateľa (aj keď v nastaveniach vývojára nie je povolená možnosť „Povoliť odomknutie OEM“). Zariadenie nevyzve používateľa ani nevymaže zariadenie tak, ako by malo - v skutočnosti bude zariadenie stále hlásiť, že bootloader je uzamknutý! Ďalší príkaz na rýchle spustenie, fastboot oem 4F500302, obnoví niektoré nastavenia zavádzača a dá sa použiť na uzamknutie už odomknutého zariadenia.

Pán Hay zistil, že prvý príkaz rýchleho spustenia nastavuje to, čo nazval „magicFlag", ktorý prepíše kontrolu, ktorá určuje stav uzamknutia zavádzača pri vykonávaní príkazu blikania alebo vymazania.

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

čítaj viac

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

čítaj viac

CVE-2017-5626 možno použiť na spustiť kód jadra. Útočník môže flashovať ľubovoľný zavádzací obraz, ktorý chce. Ak však blikajú upravený bootovací obraz, spustí sa Verified Boot a upozorní používateľa, že bola zistená zmena. Jedným zo spôsobov, ako to obísť, je flashovanie staršieho, neupraveného bootovacieho obrazu – obrazu, ktorý obsahuje staršie exploity, ktoré boli odvtedy opravené. Napriek tomu „upozornenie“, že ste dostali, trvá iba 5 sekúnd a automaticky sa zruší a nabootuje do stavu overeného spustenia, kde sa kód útočníka ešte spustí.

Pán Hay spomína, že existuje množstvo spôsobov, ako sa dá táto chyba zneužiť zlomyseľným spôsobom. Napríklad upravil zavádzací obraz, aby nastavil režim SELinux povoľný ako aj automaticky zahrnúť ADB prístup pri zavádzaní. Potom, keď využil túto zraniteľnosť na flashovanie svojho upraveného bootovacieho obrazu, bol schopný získať prístup k a root shell predtým, ako používateľ môže zadať svoje poverenia.

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

Netreba dodávať, že je to dosť vážne. Ukradnuté alebo murované zariadenie, o ktorom si myslíte, že je bezpečné kvôli vašim typickým bezpečnostným opatreniam, možno pomocou tohto exploitu úplne poraziť.


Zraniteľnosť OnePlus 3/3T SELinux

Druhá zraniteľnosť, označená CVE-2017-5624, ovplyvňuje všetky verzie OxygenOS a umožňuje to vypnúť dm-verity. Pán Hay odhalil túto zraniteľnosť bezpečnostnému tímu OnePlus dňa 16. januára, ale treba poznamenať, že XDA Senior Member th3g1znezávisle objavil túto zraniteľnosť na 23. januára. Hovorili sme s OnePlus, ktorí áno potvrdili, že uznali a opravia túto druhú zraniteľnosť v budúcej aktualizácii.

Tento útok je tiež pomerne jednoduchý na vykonanie. Na deaktiváciu (alebo povolenie) dm-verity stačí zadať jeden príkaz rýchleho spustenia: fastboot oem disable dm-verity. Ak to chcete povoliť, jednoducho zadajte fastboot oem enable dm-verity. Obslužný program pre tento príkaz, prevzatý z výpisu z bootloadera, je uvedený nižšie.


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

Vydanie tohto príkazu nastaví príznak, ktorý pán Hay nazýva dmVerity, ktorý používa bootloader na odoslanie argumentu príkazového riadku jadra, ktorý môže povoliť alebo zakázať dm-verity.

To možno použiť v kombinácii s prvou zraniteľnosťou na spustenie vysoko privilegovaného kódu na OnePlus 3/3T bez súhlasu používateľa – a s prístupom k údajom používateľa. Napríklad pán Hay bol schopný nainštalovať aplikáciu do /system/priv-app, ktorá spôsobila pridanie aplikácie do domény priv-app. To umožňuje škodlivej aplikácii prístup k vysoko privilegovaným funkciám na zariadení. Pán Hay demonštruje, že obe tieto zraniteľnosti sú využívané súčasne vo videu nižšie. Ako môžete vidieť, keď spustí zariadenie, aplikácia, ktorú zostavil, je už predinštalovaná.


Záver a poznámka od OnePlus

Potenciálne zneužitie týchto dvoch bezpečnostných zraniteľností je desivé. Chválime pána Haya za to, že tieto zraniteľné miesta zverejnil súkromne a tak rýchlo spoločnosti OnePlus. Napriek tomu sa nemôžeme ubrániť strachu, že takéto príkazy rýchleho spustenia sú na týchto zariadeniach dostupné. Keď sme písali návod, ako na to objavte skryté príkazy rýchleho spustenia, naším zámerom bolo informovať používateľov, že môžu existovať zaujímavé príkazy, ktoré môžu použiť na zlepšenie svojho zážitku. Nikdy sme si nemysleli, že takéto vysoko privilegované príkazy budú sedieť v kóde zavádzača. Ako pre "prečo" tieto príkazy rýchleho spustenia sú súčasťou firmvéru, dostali sme a "bez komentára." 

Ak ste zatiaľ neaktualizovali svoj OnePlus 3/3T hneď po vydaní každej zostavy Oxygen OS, odporúčame vám okamžite aktualizovať. Aktualizácia na Oxygen OS 4.0.2 vás ochráni pred prvou zraniteľnosťou, ale budeme musieť počkať, kým OnePlus vydáva aktualizáciu, ktorá opravuje druhú zraniteľnosť skôr, ako môžeme povedať, že ste pred nimi úplne v bezpečí zneužíva. V budúcnosti si budeme musieť dať pozor na tento druh zneužitia.


Zdroj: Roee Hay