[Opdatering: Anden sårbarhed rettet] To kritiske OnePlus 3/3T Bootloader-sikkerhedsfejl opdaget, en rettet og andet bliver rettet

To bootloader-relaterede fejl er blevet opdaget for OnePlus 3 og OnePlus 3T. Den ene er blevet lappet, den anden er under behandling.

Siden denne artikel blev publiceret, har Oxygen OS version 4.0.3 rettet den anden sikkerhedssårbarhed, der er beskrevet i denne artikel, nemlig dm-verity.

Før du går ind i den vidunderlige verden af ​​Android-rooting, brugerdefinerede ROM'er, kerner og andre ændringer, skal du først låse bootloaderen op på din enhed.

På nogle enheder (især operatørmærkede), udgør dette et problem, da brugere skal håndtere betydelige tekniske forhindringer, før de kan låse bootloaderen op. Andre enheder såsom Huawei-telefoner kræver, at du anmoder OEM om en unik bootloader-oplåsningskode - en mindre barriere for adgang, men ikke særlig vanskelig. Endnu bedre er Google Nexus/Pixel-serien eller OnePlus-telefoner, der kun kræver, at du markerer en mulighed i udviklerindstillinger og sender derefter et par hurtig opstart kommandoer.

Men uanset hvor svært det kan være at låse din bootloader op, vil én ting altid forblive konstant: kravet om at slette enheden ved oplåsning. Dette gøres af åbenlyse sikkerhedsmæssige årsager, da hele din datapartition nemt kan udtrækkes, når bootloaderen er låst op. En ondsindet enhed (med den tekniske knowhow) kunne flash-starte en tilpasset gendannelse og udtrække en fuld sikkerhedskopi af din enhed, hvis de får adgang til dine data. Det er derfor, at oplåsning af din bootloader betragtes som en sikkerhedsrisiko, og det er grunden til, at din enhed slettes efter at have låst den op. Forudsat at alt går, som det skal, bør en almindelig bruger være sikker fra angribere, der låser bootloaderen op for at omgå standard Android-låsemetoder. Alt går dog ikke efter planen.


OnePlus 3/3T Bootloader oplåsningssårbarhed

Et nyt sæt sårbarheder var lige afsløret af Roee Hay (@roeehay), hvoraf den første gør det muligt at låse OnePlus 3/3T's bootloader op uden brugerbekræftelse og uden at udløse en fabriksnulstilling. Denne sårbarhed, mærket CVE-2017-5625, betragtes som en kritisk alvorlighedssårbarhed, og den påvirker alle OnePlus 3/3T-enheder, der kører på OxygenOS 3.2-4.0.1. Brugere, der allerede har opgraderet til incremental OxygenOS 4.0.2 opdatering er ikke berørt af denne sårbarhed, da Mr. Hay privat afslørede denne fejl til OnePlus den 23. januar så de kunne rette problemet med det samme.

Fejlen virker ved at sende en proprietær, skjult fastboot-kommando: fastboot oem 4F500301. Ved at sende denne kommando omgås brugerens bootloader-låsetilstand (selv når "Tillad OEM-oplåsning" ikke er blevet aktiveret i udviklerindstillinger). Enheden spørger ikke brugeren og sletter heller ikke enheden, som den skal være - faktisk vil enheden stadig rapportere, at bootloaderen er låst! En anden fastboot-kommando, fastboot oem 4F500302, nulstiller nogle bootloader-indstillinger og kan bruges til at låse en allerede ulåst enhed.

Mr. Hay opdagede, at den første fastboot-kommando indstiller, hvad han har døbt en "magiskFlag" som tilsidesætter kontrollen, som bestemmer bootloaderens låsetilstand, når du udfører en blinkende eller slettekommando.

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

Læs mere

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

Læs mere

CVE-2017-5626 kan bruges til udfør kernekode. En angriber kan flashe ethvert opstartsbillede, de ønsker. Men hvis de blinker, vil et ændret opstartsbillede starte og advare brugeren om, at en ændring er blevet opdaget. En måde, hvorpå dette kan omgås, er at flashe et ældre, umodificeret boot-image - et, der indeholder ældre exploits, som siden er blevet rettet. Alligevel varer "advarslen", som du får, kun i 5 sekunder, og den afviser automatisk sig selv og starter op i verifiedboot-tilstanden, hvor angriberens kode stadig vil køre.

Mr. Hay nævner, at der er et væld af måder, hvorpå denne fejl kan udnyttes på en ondsindet måde. For eksempel ændrede han et boot-image for at indstille SELinux-tilstanden til eftergivende samt automatisk inkludere ADB-adgang ved opstart. Derefter, efter at have udnyttet denne sårbarhed til at flashe hans modificerede boot-image, var han i stand til at få adgang til en root shell, før brugeren overhovedet kan indtaste deres legitimationsoplysninger.

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

Det er overflødigt at sige, at dette er ret alvorligt. En stjålet eller muret enhed, som du mener er sikker på grund af dine typiske sikkerhedsforanstaltninger, kan blive fuldstændig besejret ved at bruge denne udnyttelse.


OnePlus 3/3T SELinux sårbarhed

Den anden sårbarhed, mærket CVE-2017-5624, påvirker alle versioner af OxygenOS og tillader en deaktiver dm-verity. Mr. Hay afslørede denne sårbarhed til OnePlus Security-teamet 16. januar, men det skal bemærkes, at XDA Senior Member th3g1zuafhængigt opdaget denne sårbarhed på 23. januar. Vi har talt med OnePlus, som har bekræftet, at de har erkendt og vil rette denne anden sårbarhed i en fremtidig opdatering.

Dette angreb er også ret simpelt at udføre. Man behøver kun at udstede en enkelt fastboot-kommando for at deaktivere (eller aktivere) dm-verity: fastboot oem disable dm-verity. For at aktivere det, skal du blot udstede fastboot oem enable dm-verity. Behandleren for denne kommando, taget fra et dump af bootloaderen, er vist nedenfor.


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

Udstedelse af denne kommando vil sætte et flag, som Mr. Hay kalder dmVerity, som bruges af bootloaderen til at sende et kernekommandolinjeargument, som kan aktivere eller deaktivere dm-verity.

Dette kan bruges i kombination med den første sårbarhed til at udføre meget privilegeret kode på OnePlus 3/3T uden brugerens samtykke – og med adgang til brugerens data. For eksempel var Mr. Hay i stand til at installere en applikation til /system/priv-app, som får applikationen til at blive tilføjet til priv-app-domænet. Dette giver et ondsindet program adgang til højt privilegerede funktioner på enheden. Mr. Hay demonstrerer, at begge disse sårbarheder udnyttes samtidigt i videoen nedenfor. Som du kan se, er det vist, at den applikation, han byggede, allerede er forudinstalleret, når han starter enheden.


Konklusion og note fra OnePlus

Det potentielle misbrug af disse to sikkerhedssårbarheder er skræmmende. Vi roser hr. Hay for at afsløre disse sårbarheder privat og så hurtigt til OnePlus. Alligevel kan vi ikke undgå at blive foruroliget over, at sådanne fastboot-kommandoer er tilgængelige på disse enheder. Da vi skrev en guide til hvordan man opdag skjulte fastboot-kommandoer, var vores hensigt at informere brugerne om, at der kan være nogle interessante kommandoer, de kan bruge til at forbedre deres oplevelse. Aldrig troede vi, at sådanne meget privilegerede kommandoer ville sidde i bootloader-koden. Som for "hvorfor" disse fastboot-kommandoer er inkluderet i firmwaren, vi fik en "ingen kommentarer." 

For nu, hvis du ikke har opdateret din OnePlus 3/3T, så snart hver Oxygen OS-build er blevet frigivet, anbefaler vi dig opdatere med det samme. Opdatering til Oxygen OS 4.0.2 vil beskytte dig mod den første sårbarhed, men vi bliver nødt til at vente til OnePlus udruller en opdatering, der retter den anden sårbarhed, før vi kan sige, at du er helt sikker fra disse udnytter. Vi bliver nødt til at holde øje med den slags bedrifter i fremtiden.


Kilde: Roee Hay