[Uppdatering: Andra sårbarheten korrigerad] Två kritiska säkerhetsbrister för OnePlus 3/3T Bootloader upptäcktes, en korrigerad och annan åtgärdas

Två bootloader-relaterade brister har upptäckts för OnePlus 3 och OnePlus 3T. Den ena har lappats, den andra åtgärdas.

Sedan den här artikeln publicerades har Oxygen OS version 4.0.3 korrigerat den andra säkerhetsbristen som diskuteras i den här artikeln, nämligen dm-verity one.

Innan du går in i den underbara världen av Android-rotning, anpassade ROM-skivor, kärnor och andra modifieringar måste du först låsa upp starthanteraren på din enhet.

På vissa enheter (särskilt operatörsmärkta sådana) utgör detta ett problem eftersom användare måste hantera betydande tekniska hinder innan de kan låsa upp starthanteraren. Andra enheter som Huawei-telefoner kräver att du ansöker till OEM om en unik upplåsningskod för bootloader - ett mindre hinder för inträde, men inte särskilt svårt. Ännu bättre är Google Nexus/Pixel-serien eller OnePlus-telefonerna som bara kräver att du markerar ett alternativ i utvecklarinställningarna och sedan skickar några fastboot kommandon.

Men oavsett hur svårt det kan vara att låsa upp din bootloader, kommer en sak alltid att förbli konstant: kravet att torka enheten vid upplåsning. Detta görs av uppenbara säkerhetsskäl, eftersom hela din datapartition enkelt kan extraheras när starthanteraren är upplåst. En skadlig enhet (med det tekniska kunnandet) kan flashstarta en anpassad återställning och extrahera en fullständig säkerhetskopia av din enhet om de får tillgång till dina data. Det är därför upplåsning av din bootloader anses vara en säkerhetsrisk, och det är därför din enhet rensas efter att den har låsts upp. Förutsatt att allt går som det ska, bör en vanlig användare vara säker från att angripare låser upp starthanteraren för att kringgå de vanliga Android-låsmetoderna. Allt går dock inte enligt planerna.


OnePlus 3/3T Bootloader Unlocking sårbarhet

En ny uppsättning sårbarheter var just avslöjat av Roee Hay (@roeehay), varav den första gör att OnePlus 3/3T: s starthanterare kan låsas upp utan användarbekräftelse och utan att utlösa en fabriksåterställning. Denna sårbarhet, märkt CVE-2017-5625, anses vara en allvarlig sårbarhet och den påverkar alla OnePlus 3/3T-enheter som körs på OxygenOS 3.2-4.0.1. Användare som redan har uppgraderat till inkrementell OxygenOS 4.0.2 uppdatering inte påverkas av denna sårbarhet, eftersom Mr. Hay privat avslöjade detta fel för OnePlus den 23 januari så att de kunde åtgärda problemet omedelbart.

Felet fungerar genom att skicka ett proprietärt, dolt fastboot-kommando: fastboot oem 4F500301. Genom att skicka det här kommandot förbigås användarens låsläge för starthanteraren (även när "Tillåt OEM-upplåsning" inte har aktiverats i utvecklarinställningarna). Enheten uppmanar inte användaren och torkar inte heller enheten som den ska - i själva verket kommer enheten fortfarande att rapportera att starthanteraren är låst! Ett annat fastboot-kommando, fastboot oem 4F500302, kommer att återställa vissa bootloader-inställningar och kan användas för att låsa en redan olåst enhet.

Mr Hay upptäckte att det första fastboot-kommandot ställer in vad han har kallat en "magisk flagga" som åsidosätter kontrollen som bestämmer starthanterarens låsläge när ett blinkande eller raderande kommando utförs.

// '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-hanterare


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

Läs mer

CVE-2017-5626 kan användas för att kör kärnkoden. En angripare kan flasha vilken startbild de vill. Men om de blinkar kommer en modifierad startbild att starta och varna användaren om att en ändring har upptäckts. Ett sätt att kringgå detta är att flasha en äldre, omodifierad startavbildning - en som innehåller äldre exploateringar som sedan har korrigerats. Trots det varar "varningen" som du får bara i 5 sekunder, och den avvisar sig själv automatiskt och startar upp till det verifierade startläget där angriparens kod fortfarande kommer att köras.

Mr Hay nämner att det finns massor av sätt som denna brist kan utnyttjas på ett skadligt sätt. Till exempel modifierade han en startbild för att ställa in SELinux-läget på tolerant samt automatiskt inkludera ADB-åtkomst vid uppstart. Sedan, efter att ha utnyttjat denna sårbarhet för att flasha sin modifierade startbild, kunde han komma åt en rotskal innan användaren ens kan ange sina referenser.

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 behöver inte sägas att detta är ganska allvarligt. En stulen eller murad enhet som du tror är säker på grund av dina typiska säkerhetsåtgärder kan besegras fullständigt med detta utnyttjande.


OnePlus 3/3T SELinux sårbarhet

Den andra sårbarheten, märkt CVE-2017-5624, påverkar alla versioner av OxygenOS och låter en inaktivera dm-verity. Mr. Hay avslöjade denna sårbarhet för OnePlus Security-teamet 16 januari, men det bör noteras att XDA Senior Member th3g1zsjälvständigt upptäckt denna sårbarhet på 23 januari. Vi har pratat med OnePlus som har bekräftat att de har erkänt och kommer att åtgärda denna andra sårbarhet i en framtida uppdatering.

Denna attack är också ganska enkel att utföra. Man behöver bara utfärda ett enda fastboot-kommando för att inaktivera (eller aktivera) dm-verity: fastboot oem disable dm-verity. För att aktivera det, bara utfärda fastboot oem enable dm-verity. Hanteraren för detta kommando, hämtad från en dump av bootloadern, visas nedan.


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

Utfärdande av detta kommando kommer att ställa in en flagga, som Mr. Hay kallar dmVerity, som används av starthanteraren för att skicka ett kommandoradsargument för kärnan som kan aktivera eller inaktivera dm-verity.

Detta kan användas i kombination med den första sårbarheten att exekvera mycket privilegierad kod på OnePlus 3/3T utan användarens samtycke – och med tillgång till användarens data. Till exempel kunde Mr. Hay installera en applikation till /system/priv-app som gör att applikationen läggs till priv-app-domänen. Detta ger en skadlig applikation tillgång till mycket privilegierade funktioner på enheten. Mr Hay visar att båda dessa sårbarheter utnyttjas samtidigt i videon nedan. Som du kan se, när han startar upp enheten visas applikationen han byggde redan vara förinstallerad.


Slutsats och notering från OnePlus

De potentiella missbruken av dessa två säkerhetsbrister är skrämmande. Vi berömmer Mr Hay för att han avslöjade dessa sårbarheter privat och så snabbt för OnePlus. Ändå kan vi inte låta bli att vara oroade över att sådana snabbstartkommandon är tillgängliga på dessa enheter. När vi skrev en guide om hur man upptäck dolda fastboot-kommandon, vår avsikt var att informera användarna om att det kan finnas några intressanta kommandon de kan använda för att förbättra sin upplevelse. Aldrig trodde vi att sådana mycket privilegierade kommandon skulle sitta i bootloader-koden. Som för "Varför" dessa fastboot-kommandon ingår i firmware, vi fick en "ingen kommentar." 

För nu, om du inte har uppdaterat din OnePlus 3/3T så snart varje Oxygen OS-version har släppts, rekommenderar vi att du uppdatera omedelbart. Uppdatering till Oxygen OS 4.0.2 kommer att skydda dig från den första sårbarheten, men vi får vänta tills OnePlus rullar ut en uppdatering som korrigerar den andra sårbarheten innan vi kan säga att du är helt säker från dessa utnyttjar. Vi måste hålla utkik efter den här typen av bedrifter i framtiden.


Källa: Roee Hay