To bootloader-relaterte feil har blitt oppdaget for OnePlus 3 og OnePlus 3T. Den ene er lappet, den andre er under behandling.
Siden denne artikkelen ble publisert, har Oxygen OS versjon 4.0.3 rettet opp det andre sikkerhetsproblemet som er omtalt i denne artikkelen, nemlig dm-verity.
Før du går inn i den fantastiske verdenen av Android-rooting, tilpassede ROM-er, kjerner og andre modifikasjoner, må du først låse opp bootloaderen på enheten din.
På noen enheter (spesielt operatørmerkede), utgjør dette et problem ettersom brukere må håndtere betydelige tekniske hindringer før de kan låse opp bootloaderen. Andre enheter, for eksempel Huawei-telefoner, krever at du begjærer OEM for en unik opplåsingskode for oppstartslaster - en liten hindring for innreise, men ikke veldig vanskelig. Enda bedre er Google Nexus/Pixel-serien eller OnePlus-telefonene som bare krever at du krysser av for et alternativ i utviklerinnstillingene og sender deretter noen få rask oppstart kommandoer.
Men uansett hvor vanskelig det kan være å låse opp oppstartslasteren din, vil én ting alltid forbli konstant: kravet om å tørke enheten ved opplåsing. Dette gjøres av åpenbare sikkerhetsgrunner, siden hele datapartisjonen din enkelt kan trekkes ut når oppstartslasteren er låst opp. En ondsinnet enhet (med den tekniske kunnskapen) kan starte opp en tilpasset gjenoppretting og trekke ut en fullstendig sikkerhetskopi av enheten din hvis de får tilgang til dataene dine. Det er derfor opplåsing av oppstartslasteren betraktes som en sikkerhetsrisiko, og det er grunnen til at enheten din slettes etter å ha låst den opp. Forutsatt at alt går som det skal, bør en vanlig bruker være trygg fra angripere som låser opp bootloaderen for å omgå standard Android-låsemetoder. Men ikke alt går etter planen.
OnePlus 3/3T Bootloader Låse opp sårbarhet
Et nytt sett med sårbarheter var nettopp avslørt av Roee Hay (@roeehay), hvorav den første lar OnePlus 3/3Ts bootloader låses opp uten brukerbekreftelse og uten å utløse en tilbakestilling av fabrikken. Denne sårbarheten, merket CVE-2017-5625, anses som et kritisk alvorlighetsproblem, og det påvirker alle OnePlus 3/3T-enheter som kjører på OxygenOS 3.2-4.0.1. Brukere som allerede har oppgradert til inkrementell OxygenOS 4.0.2 Oppdater er ikke berørt av denne sårbarheten, da Mr. Hay privat avslørte denne feilen til OnePlus den 23. januar slik at de kunne korrigere problemet umiddelbart.
Feilen fungerer ved å sende en proprietær, skjult fastboot-kommando: fastboot oem 4F500301
. Ved å sende denne kommandoen omgås brukerens oppstartslasterlåsstatus (selv når "Tillat OEM-opplåsing" ikke er aktivert i utviklerinnstillinger). Enheten spør ikke brukeren og sletter heller ikke enheten slik den skal være - faktisk vil enheten fortsatt rapportere at bootloaderen er låst! En annen fastboot-kommando, fastboot oem 4F500302
, vil tilbakestille noen bootloader-innstillinger, og kan brukes til å låse en allerede ulåst enhet.
Mr. Hay oppdaget at den første fastboot-kommandoen setter det han har kalt en "magiskFlagg" som overstyrer sjekken som bestemmer oppstartslasterens låsetilstand når du utfø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);
...
}
Les mer
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);
}
Les mer
CVE-2017-5626 kan brukes til kjøre kjernekode. En angriper kan flashe hvilket som helst oppstartsbilde de ønsker. Skjønt, hvis de blinker et modifisert oppstartsbilde, vil Verified Boot starte og advare brukeren om at en endring har blitt oppdaget. En måte dette kan omgås på er å flashe et eldre, umodifisert oppstartsbilde - en som inneholder eldre utnyttelser som siden har blitt korrigert. Likevel varer "advarselen" du får bare i 5 sekunder, og den avviser seg selv automatisk og starter opp i verifisert oppstartstilstand der angriperens kode fortsatt vil kjøres.
Mr. Hay nevner at det er mange måter denne feilen kan utnyttes på på en ondsinnet måte. For eksempel endret han et oppstartsbilde for å sette SELinux-modusen til ettergivende samt automatisk inkludere ADB-tilgang ved oppstart. Så, etter å ha utnyttet denne sårbarheten til å flashe det modifiserte oppstartsbildet hans, fikk han tilgang til en rotskall før brukeren til og med kan skrive inn legitimasjonen sin.
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
Unødvendig å si er dette ganske alvorlig. En stjålet eller murt enhet som du tror er trygg på grunn av dine typiske sikkerhetstiltak, kan bli fullstendig beseiret ved å bruke denne utnyttelsen.
OnePlus 3/3T SELinux-sårbarhet
Den andre sårbarheten, merket CVE-2017-5624, påvirker alle versjoner av OxygenOS og lar en deaktiver dm-verity. Mr. Hay avslørte denne sårbarheten til OnePlus Security-teamet 16. januar, men det bør bemerkes at XDA Senior Member th3g1zoppdaget denne sårbarheten uavhengig på 23. januar. Vi har snakket med OnePlus som har bekreftet at de har erkjent og vil fikse denne andre sårbarheten i en fremtidig oppdatering.
Dette angrepet er også ganske enkelt å utføre. Man trenger bare å utstede en enkelt fastboot-kommando for å deaktivere (eller aktivere) dm-verity: fastboot oem disable dm-verity
. For å aktivere det, bare utsted fastboot oem enable dm-verity
. Behandleren for denne kommandoen, hentet fra en dump av 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);
}
Utstedelse av denne kommandoen vil sette et flagg, som Mr. Hay kaller dmVerity, som brukes av bootloaderen til å sende et kjernekommandolinjeargument som kan aktivere eller deaktivere dm-verity.
Dette kan brukes i kombinasjon med den første sårbarheten for å utføre svært privilegert kode på OnePlus 3/3T uten brukerens samtykke – og med tilgang til brukerens data. For eksempel var Mr. Hay i stand til å installere en applikasjon til /system/priv-app som fører til at applikasjonen legges til priv-app-domenet. Dette gir en ondsinnet applikasjon tilgang til svært privilegerte funksjoner på enheten. Mr. Hay demonstrerer at begge disse sårbarhetene blir utnyttet samtidig i videoen nedenfor. Som du kan se, når han starter opp enheten, er det vist at applikasjonen han bygde allerede er forhåndsinstallert.
Konklusjon og merknad fra OnePlus
Den potensielle misbruken av disse to sikkerhetssårbarhetene er skremmende. Vi berømmer Mr. Hay for å ha avslørt disse sårbarhetene privat og så raskt til OnePlus. Likevel kan vi ikke unngå å bli skremt over at slike fastboot-kommandoer er tilgjengelige på disse enhetene. Da vi skrev en veiledning om hvordan oppdag skjulte fastboot-kommandoer, var vår intensjon å informere brukere om at det kan være noen interessante kommandoer de kan bruke for å forbedre opplevelsen deres. Vi trodde aldri at slike svært privilegerte kommandoer skulle sitte i bootloader-koden. Når det gjelder "Hvorfor" disse fastboot-kommandoene er inkludert i fastvaren, vi fikk en "ingen kommentar."
For nå, hvis du ikke har oppdatert OnePlus 3/3T så snart hver Oxygen OS-bygg har blitt utgitt, anbefaler vi at du oppdater umiddelbart. Oppdatering til Oxygen OS 4.0.2 vil beskytte deg mot den første sårbarheten, men vi må vente til OnePlus ruller ut en oppdatering som retter den andre sårbarheten før vi kan si at du er helt trygg fra disse utnytter. Vi må holde utkikk etter denne typen bedrifter i fremtiden.
Kilde: Roee Hay