[Aktualizace: Opravena druhá chyba zabezpečení] Byly zjištěny dvě kritické bezpečnostní chyby bootloaderu OnePlus 3/3T, jeden je opraven a další se řeší

click fraud protection

U OnePlus 3 a OnePlus 3T byly objeveny dvě chyby související s bootloaderem. Jeden byl opraven, druhý se řeší.

Od doby, kdy byl tento článek publikován, Oxygen OS verze 4.0.3 opravila druhou bezpečnostní chybu, o které se v tomto článku pojednává, a to dm-verity.

Než vstoupíte do úžasného světa rootování Androidu, vlastních ROM, jader a dalších úprav, musíte nejprve odemknout bootloader na vašem zařízení.

Na některých zařízeních (zejména na zařízeních se značkou operátora) to představuje problém, protože uživatelé se musí před odemknutím bootloaderu vypořádat s významnými technickými překážkami. Jiná zařízení, jako jsou telefony Huawei, vyžadují, abyste požádali výrobce OEM o jedinečný kód pro odblokování bootloaderu - menší překážka vstupu, ale není příliš obtížná. Ještě lepší jsou telefony řady Google Nexus/Pixel nebo OnePlus, které vyžadují pouze zaškrtnutí možnosti v Nastavení vývojáře a odeslání několika rychlé spuštění příkazy.

Ale bez ohledu na to, jak obtížné může být odemknutí bootloaderu, jedna věc zůstane vždy konstantní: požadavek na vymazání zařízení při odemknutí. To se děje ze zřejmých bezpečnostních důvodů, protože celý datový oddíl lze snadno extrahovat, jakmile je bootloader odemčen. Škodlivá entita (s technickým know-how) by mohla spustit vlastní obnovu a extrahovat úplnou zálohu vašeho zařízení, pokud získá přístup k vašim datům. To je důvod, proč je odemknutí bootloaderu považováno za bezpečnostní riziko, a proto je vaše zařízení po odemčení vymazáno. Za předpokladu, že vše půjde, jak má, by měl být běžný uživatel v bezpečí před útočníky, kteří odemykají bootloader, aby obešli standardní metody uzamčení Androidu. Ne vše však jde podle plánu.


Chyba zabezpečení odemykání bootloaderu OnePlus 3/3T

Byla to nová sada zranitelností právě zveřejněno od Roee Hay (@roeehay), z nichž první umožňuje odemknutí bootloaderu OnePlus 3/3T bez potvrzení uživatele a bez spuštění obnovení továrního nastavení. Tato zranitelnost je označena CVE-2017-5625, je považována za zranitelnost kritické závažnosti a postihuje všechna zařízení OnePlus 3/3T běžící na OxygenOS 3.2-4.0.1. Uživatelé, kteří již upgradovali na inkrementální OxygenOS 4.0.2 Aktualizace nejsou ovlivněny touto zranitelností, protože pan Hay soukromě odhalil tuto chybu OnePlus dne 23. ledna aby mohli problém okamžitě opravit.

Chyba funguje odesláním proprietárního skrytého příkazu rychlého spuštění: fastboot oem 4F500301. Odesláním tohoto příkazu se obejde stav uzamčení zavaděče uživatele (i když v Nastavení vývojáře není povoleno „Povolit odemknutí OEM“). Zařízení uživatele nevyzve ani nevymaže zařízení, jak by mělo - ve skutečnosti bude zařízení stále hlásit, že bootloader je uzamčen! Další příkaz k rychlému spuštění, fastboot oem 4F500302, resetuje některá nastavení bootloaderu a lze jej použít k uzamčení již odemčeného zařízení.

Pan Hay zjistil, že první příkaz rychlého spuštění nastavuje to, co nazval „magicFlag", která přepíše kontrolu, která určuje stav uzamčení zavaděče při provádění příkazu blikání nebo mazání.

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

Přečtěte si více

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

Přečtěte si více

Lze použít CVE-2017-5626 spustit kód jádra. Útočník může flashovat jakýkoli spouštěcí obraz, který chce. Pokud však zablikají upravený spouštěcí obraz, spustí se Verified Boot a upozorní uživatele, že byla zjištěna změna. Jedním ze způsobů, jak to obejít, je flashnout starší, neupravený zaváděcí obraz - takový, který obsahuje starší exploity, které byly mezitím opraveny. Přesto „upozornění“, že jste dostali, trvá pouze 5 sekund a automaticky se zruší a nabootuje do stavu ověřeného spouštění, kde se kód útočníka stále spustí.

Pan Hay zmiňuje, že existuje spousta způsobů, jak lze tuto chybu zneužít škodlivým způsobem. Například upravil zaváděcí obraz, aby nastavil režim SELinux povolný a také automaticky zahrnout ADB přístup při spouštění. Poté, co využil tuto chybu zabezpečení k flashování upraveného spouštěcího obrazu, byl schopen získat přístup k a root shell ještě předtím, než uživatel může zadat své přihlašovací údaje.

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

Netřeba dodávat, že je to docela vážné. Ukradené nebo zděné zařízení, o kterém si myslíte, že je bezpečné kvůli vašim typickým bezpečnostním opatřením, lze pomocí tohoto exploitu zcela porazit.


Chyba zabezpečení OnePlus 3/3T SELinux

Druhá zranitelnost, označená CVE-2017-5624, ovlivňuje všechny verze OxygenOS a umožňuje to zakázat dm-verity. Pan Hay odhalil tuto chybu zabezpečení týmu OnePlus Security 16. ledna, ale je třeba poznamenat, že XDA Senior Member th3g1znezávisle objevil tuto zranitelnost na 23. ledna. Mluvili jsme s OnePlus, kteří ano potvrdili, že uznali a opraví tuto druhou chybu zabezpečení v budoucí aktualizaci.

Tento útok je také poměrně jednoduchý na provedení. K deaktivaci (nebo povolení) dm-verity stačí zadat jediný příkaz rychlého spuštění: fastboot oem disable dm-verity. Chcete-li to povolit, jednoduše zadejte fastboot oem enable dm-verity. Obslužná rutina tohoto příkazu, převzatá z výpisu z bootloaderu, je uvedena níže.


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

Vydáním tohoto příkazu se nastaví příznak, který pan Hay nazývá dmVerity, který používá bootloader k odeslání argumentu příkazového řádku jádra, který může povolit nebo zakázat dm-verity.

To lze použít v kombinaci s první zranitelností ke spuštění vysoce privilegovaného kódu na OnePlus 3/3T bez souhlasu uživatele – a s přístupem k datům uživatele. Například pan Hay byl schopen nainstalovat aplikaci do /system/priv-app, která způsobila přidání aplikace do domény priv-app. To umožňuje škodlivé aplikaci přístup k vysoce privilegovaným funkcím v zařízení. Pan Hay ve videu níže ukazuje, že obě tyto zranitelnosti jsou zneužívány současně. Jak můžete vidět, když spustí zařízení, aplikace, kterou vytvořil, je již předinstalovaná.


Závěr a poznámka od OnePlus

Potenciální zneužití těchto dvou bezpečnostních zranitelností je děsivé. Chválíme pana Haye za to, že tyto chyby zabezpečení soukromě a tak rychle sdělil OnePlus. Přesto se nemůžeme ubránit obavám, že takové příkazy rychlého spuštění jsou na těchto zařízeních dostupné. Když jsme psali návod, jak na to objevte skryté příkazy rychlého spuštění, naším záměrem bylo informovat uživatele o tom, že mohou existovat zajímavé příkazy, které mohou použít ke zlepšení své zkušenosti. Nikdy jsme si nemysleli, že tak vysoce privilegované příkazy budou sedět v kódu bootloaderu. Pokud jde o "proč" tyto příkazy rychlého spuštění jsou součástí firmwaru, dostali jsme a "bez komentáře." 

Pokud jste prozatím neaktualizovali svůj OnePlus 3/3T hned po vydání každého sestavení Oxygen OS, doporučujeme vám okamžitě aktualizovat. Aktualizace na Oxygen OS 4.0.2 vás ochrání před první zranitelností, ale budeme muset počkat, až OnePlus vydává aktualizaci, která opravuje druhou zranitelnost, než budeme moci říci, že jste před nimi zcela v bezpečí vykořisťuje. V budoucnu si budeme muset dávat pozor na tyto druhy exploitů.


Zdroj: Roee Hay