[Update: tweede beveiligingslek verholpen] Twee kritieke beveiligingsfouten van de OnePlus 3/3T Bootloader ontdekt, waarvan er één is gepatcht en andere zijn verholpen

click fraud protection

Er zijn twee bootloader-gerelateerde fouten ontdekt voor de OnePlus 3 en OnePlus 3T. Eén is gepatcht, de ander wordt aangepakt.

Sinds de publicatie van dit artikel heeft Oxygen OS versie 4.0.3 het tweede beveiligingsprobleem opgelost dat in dit artikel wordt besproken, namelijk het dm-verity-probleem.

Voordat je de wondere wereld van Android-rooting, aangepaste ROM's, kernels en andere aanpassingen betreedt, moet je eerst de bootloader op je apparaat ontgrendelen.

Op sommige apparaten (vooral apparaten van het merk Carrier) vormt dit een probleem, omdat gebruikers met aanzienlijke technische hindernissen te maken krijgen voordat ze de bootloader kunnen ontgrendelen. Voor andere apparaten, zoals Huawei-telefoons, moet je bij de OEM een verzoek indienen om een ​​unieke ontgrendelingscode voor de bootloader - een kleine toegangsbarrière, maar niet erg moeilijk. Nog beter zijn de Google Nexus/Pixel-serie of OnePlus-telefoons waarvoor je alleen een optie in de ontwikkelaarsinstellingen hoeft aan te vinken en er vervolgens een paar te sturen snel opstarten opdrachten.

Maar hoe moeilijk het ook is om je bootloader te ontgrendelen, één ding zal altijd constant blijven: de vereiste om het apparaat te wissen bij het ontgrendelen. Dit wordt gedaan om voor de hand liggende veiligheidsredenen, omdat uw volledige gegevenspartitie eenvoudig kan worden uitgepakt zodra de bootloader is ontgrendeld. Een kwaadwillende entiteit (met de technische knowhow) kan een aangepast herstel uitvoeren en een volledige back-up van uw apparaat extraheren als ze toegang krijgen tot uw gegevens. Dat is de reden waarom het ontgrendelen van je bootloader als een beveiligingsrisico wordt beschouwd, en daarom wordt je apparaat gewist nadat het is ontgrendeld. Ervan uitgaande dat alles naar behoren verloopt, zou een gewone gebruiker veilig moeten zijn voor aanvallers die de bootloader ontgrendelen om de standaard Android-vergrendelingsmethoden te omzeilen. Niet alles verloopt echter volgens plan.


OnePlus 3/3T Bootloader ontgrendelt kwetsbaarheid

Er was een nieuwe reeks kwetsbaarheden zojuist onthuld door Roee Hay (@roeehay), waarvan de eerste ervoor zorgt dat de bootloader van de OnePlus 3/3T wordt ontgrendeld zonder gebruikersbevestiging en zonder een fabrieksreset te activeren. Deze kwetsbaarheid, gelabeld CVE-2017-5625, wordt beschouwd als een kritieke kwetsbaarheid en treft alle OnePlus 3/3T-apparaten die op OxygenOS 3.2-4.0.1 draaien. Gebruikers die al een upgrade naar de incrementele OxygenOS 4.0.2 update worden niet beïnvloed door deze kwetsbaarheid, aangezien de heer Hay deze fout privé aan OnePlus heeft bekendgemaakt op 23 januari zodat ze het probleem onmiddellijk konden oplossen.

De fout werkt door een gepatenteerd, verborgen fastboot-commando te verzenden: fastboot oem 4F500301. Door deze opdracht te verzenden, wordt de vergrendelingsstatus van de bootloader van de gebruiker omzeild (zelfs als "OEM-ontgrendeling toestaan" niet is ingeschakeld in de ontwikkelaarsinstellingen). Het apparaat vraagt ​​de gebruiker niet en veegt het apparaat ook niet af zoals het zou moeten zijn - sterker nog, het apparaat zal nog steeds melden dat de bootloader is vergrendeld! Nog een fastboot-commando, fastboot oem 4F500302, zal enkele bootloader-instellingen resetten en kan worden gebruikt om een ​​reeds ontgrendeld apparaat te vergrendelen.

De heer Hay ontdekte dat het eerste fastboot-commando instelt wat hij een "magischeVlag" die de controle overschrijft die de vergrendelingsstatus van de bootloader bepaalt bij het uitvoeren van een knipper- of wisopdracht.

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

Lees verder

Fastboot-wishandler


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

Lees verder

CVE-2017-5626 kan hiervoor worden gebruikt kernelcode uitvoeren. Een aanvaller kan elke gewenste opstartimage flashen. Als ze echter een aangepast opstartimage flashen, zal Verified Boot in werking treden en de gebruiker waarschuwen dat er een wijziging is gedetecteerd. Eén manier waarop dit kan worden omzeild, is door een ouder, ongewijzigd opstartimage te flashen - een image die oudere exploits bevat die inmiddels zijn gepatcht. Toch duurt de "waarschuwing" die u krijgt slechts vijf seconden, en deze negeert zichzelf automatisch en start op in de verificatieboot-status, waar de code van de aanvaller nog steeds wordt uitgevoerd.

De heer Hay vermeldt dat er talloze manieren zijn waarop deze fout op een kwaadaardige manier kan worden uitgebuit. Hij wijzigde bijvoorbeeld een opstartimage om de SELinux-modus in te stellen tolerant evenals automatisch ADB-toegang bij het opstarten. Nadat hij deze kwetsbaarheid had misbruikt om zijn gewijzigde opstartimage te flashen, kreeg hij vervolgens toegang tot een root shell voordat de gebruiker zelfs maar zijn inloggegevens kan invoeren.

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

Het hoeft geen betoog dat dit tamelijk ernstig is. Een gestolen of gemetseld apparaat waarvan u denkt dat het veilig is vanwege de gebruikelijke beveiligingsmaatregelen, kan met deze exploit volledig worden verslagen.


OnePlus 3/3T SELinux-kwetsbaarheid

De tweede kwetsbaarheid, gelabeld CVE-2017-5624, beïnvloedt alle versies van OxygenOS en laat iemand toe schakel dm-verity uit. De heer Hay heeft deze kwetsbaarheid bekendgemaakt aan het OnePlus-beveiligingsteam op 16 januari, maar er moet worden opgemerkt dat XDA Senior Member th3g1zheeft deze kwetsbaarheid onafhankelijk ontdekt op 23 januari. We hebben met OnePlus gesproken die dat wel heeft gedaan heeft bevestigd dat zij deze tweede kwetsbaarheid hebben erkend en zullen verhelpen in een toekomstige update.

Deze aanval is ook vrij eenvoudig uit te voeren. Je hoeft slechts één fastboot-commando uit te voeren om dm-verity uit te schakelen (of in te schakelen): fastboot oem disable dm-verity. Om het in te schakelen, hoeft u alleen maar uit te geven fastboot oem enable dm-verity. De handler voor dit commando, afkomstig uit een dump van de bootloader, wordt hieronder weergegeven.


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

Het geven van dit commando zal een vlag instellen, die de heer Hay dmVerity noemt, die door de bootloader wordt gebruikt om een ​​kernelopdrachtregelargument te verzenden dat dm-verity kan in- of uitschakelen.

Dit kan worden gebruikt in combinatie met de eerste kwetsbaarheid om zeer geprivilegieerde code uit te voeren op de OnePlus 3/3T zonder toestemming van de gebruiker – en met toegang tot de gegevens van de gebruiker. De heer Hay kon bijvoorbeeld een applicatie installeren in /system/priv-app, waardoor de applicatie werd toegevoegd aan het priv-app-domein. Hierdoor krijgt een kwaadwillende toepassing toegang tot zeer bevoorrechte functies op het apparaat. De heer Hay demonstreert in de onderstaande video dat beide kwetsbaarheden tegelijkertijd worden misbruikt. Zoals je kunt zien, blijkt dat wanneer hij het apparaat opstart, de applicatie die hij heeft gebouwd al vooraf is geïnstalleerd.


Conclusie en opmerking van OnePlus

Het potentiële misbruik van deze twee beveiligingsproblemen is beangstigend. Wij prijzen de heer Hay voor het feit dat hij deze kwetsbaarheden zo snel privé aan OnePlus heeft bekendgemaakt. Toch kunnen we niet anders dan ongerust zijn over het feit dat dergelijke fastboot-opdrachten toegankelijk zijn op deze apparaten. Toen we een handleiding schreven over hoe ontdek verborgen fastboot-opdrachten, was het onze bedoeling om gebruikers te informeren dat er mogelijk enkele interessante opdrachten zijn die ze kunnen gebruiken om hun ervaring te verbeteren. Nooit hadden we gedacht dat zulke zeer bevoorrechte commando's in de bootloadercode zouden zitten. Wat betreft "Waarom" deze fastboot-opdrachten zijn opgenomen in de firmware, we kregen een "geen commentaar." 

Als je je OnePlus 3/3T nog niet hebt bijgewerkt zodra elke Oxygen OS-build is uitgebracht, raden we je voorlopig aan onmiddellijk bijwerken. Updaten naar Oxygen OS 4.0.2 beschermt je tegen de eerste kwetsbaarheid, maar we zullen moeten wachten tot OnePlus introduceert een update die de tweede kwetsbaarheid verhelpt voordat we kunnen zeggen dat u hier volledig veilig voor bent exploits. We zullen in de toekomst alert moeten blijven op dit soort exploits.


Bron: Roee Hay