[Aggiornamento: seconda vulnerabilità corretta] Due difetti critici di sicurezza del bootloader OnePlus 3/3T scoperti, uno corretto e l'altro risolto

Sono stati scoperti due difetti relativi al bootloader per OnePlus 3 e OnePlus 3T. Uno è stato patchato, l'altro è in fase di risoluzione.

Da quando è stato pubblicato questo articolo, la versione 4.0.3 del sistema operativo Oxygen ha corretto la seconda vulnerabilità di sicurezza discussa in questo articolo, ovvero quella dm-verity.

Prima di entrare nel meraviglioso mondo del rooting Android, delle ROM personalizzate, dei kernel e di altre modifiche, devi prima sbloccare il bootloader sul tuo dispositivo.

Su alcuni dispositivi (in particolare quelli con il marchio dell'operatore), ciò rappresenta un problema poiché gli utenti devono affrontare ostacoli tecnici significativi prima di poter sbloccare il bootloader. Altri dispositivi come i telefoni Huawei richiedono che tu richieda all'OEM un codice di sblocco univoco del bootloader: una barriera minore all'accesso, ma non molto difficile. Ancora migliori sono le serie Google Nexus/Pixel o i telefoni OnePlus che richiedono solo di selezionare un'opzione nelle Impostazioni sviluppatore e quindi inviarne alcuni fastboot comandi.

Ma non importa quanto possa essere difficile sbloccare il bootloader, una cosa rimarrà sempre costante: la necessità di pulire il dispositivo dopo lo sblocco. Questo viene fatto per ovvi motivi di sicurezza, poiché l'intera partizione dati può essere facilmente estratta una volta sbloccato il bootloader. Un'entità dannosa (con il know-how tecnico) potrebbe avviare tramite flash un ripristino personalizzato ed estrarre un backup completo del tuo dispositivo se riesce ad accedere ai tuoi dati. Ecco perché lo sblocco del bootloader è considerato un rischio per la sicurezza ed è il motivo per cui il tuo dispositivo viene cancellato dopo averlo sbloccato. Supponendo che tutto vada come dovrebbe, un utente normale dovrebbe essere al sicuro dagli aggressori che sbloccano il bootloader per aggirare i metodi di blocco standard di Android. Non tutto però va secondo i piani.


Vulnerabilità di sblocco del bootloader OnePlus 3/3T

C'era una nuova serie di vulnerabilità appena divulgato di Roee Hay (@roeehay), il primo dei quali consente di sbloccare il bootloader di OnePlus 3/3T senza conferma dell'utente e senza attivare un ripristino delle impostazioni di fabbrica. Questa vulnerabilità, etichettata CVE-2017-5625, è considerata una vulnerabilità di gravità critica e colpisce tutti i dispositivi OnePlus 3/3T che eseguono OxygenOS 3.2-4.0.1. Utenti che hanno già effettuato l'aggiornamento a OxygenOS incrementale 4.0.2 aggiornamento non sono interessati da questa vulnerabilità, poiché il signor Hay ha rivelato privatamente questo difetto a OnePlus il 23 gennaio in modo da poter risolvere immediatamente il problema.

Il difetto funziona inviando un comando fastboot proprietario e nascosto: fastboot oem 4F500301. Inviando questo comando, lo stato di blocco del bootloader dell'utente viene ignorato (anche quando "Consenti sblocco OEM" non è stato abilitato nelle Impostazioni sviluppatore). Il dispositivo non avvisa l'utente né cancella i dati come dovrebbe: in effetti, il dispositivo segnalerà comunque che il bootloader è bloccato! Un altro comando di avvio rapido, fastboot oem 4F500302, ripristinerà alcune impostazioni del bootloader e potrà essere utilizzato per bloccare un dispositivo già sbloccato.

Il signor Hay ha scoperto che il primo comando fastboot imposta ciò che ha soprannominato "magicFlag" che sovrascrive il controllo che determina lo stato di blocco del bootloader quando si esegue un comando di flashing o cancellazione.

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

Gestore Flash di avvio rapido


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

Per saperne di più

Gestore di cancellazione Fastboot


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

Per saperne di più

È possibile utilizzare CVE-2017-5626 eseguire il codice del kernel. Un utente malintenzionato può eseguire il flashing di qualsiasi immagine di avvio desideri. Tuttavia, se eseguono il flashing di un'immagine di avvio modificata, Verified Boot si avvierà e avviserà l'utente che è stata rilevata una modifica. Un modo per aggirare questo problema è eseguire il flashing di un'immagine di avvio più vecchia e non modificata, contenente exploit precedenti a cui sono state apportate patch. Anche così, l'"avviso" che ti viene dato dura solo 5 secondi e si chiude automaticamente e si avvia nello stato di avvio verificato in cui il codice dell'utente malintenzionato verrà comunque eseguito.

Il signor Hay afferma che ci sono moltissimi modi in cui questo difetto può essere sfruttato in modo dannoso. Ad esempio, ha modificato un'immagine di avvio per impostare la modalità SELinux su permissivo oltre a includere automaticamente l'accesso ADB all'avvio. Quindi, dopo aver sfruttato questa vulnerabilità per eseguire il flashing della sua immagine di avvio modificata, è stato in grado di accedere a un file shell root prima ancora che l'utente possa inserire le proprie credenziali.

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

Inutile dire che la cosa è abbastanza seria. Un dispositivo rubato o bloccato che ritieni sicuro grazie alle tue tipiche misure di sicurezza può essere completamente sconfitto utilizzando questo exploit.


Vulnerabilità di OnePlus 3/3T SELinux

La seconda vulnerabilità, etichettata CVE-2017-5624, colpisce tutte le versioni di OxygenOS e permette di farlo disabilita dm-verity. Il signor Hay ha rivelato questa vulnerabilità al team di sicurezza di OnePlus su 16 gennaio, ma va notato che XDA Senior Member th3g1zscoperto in modo indipendente questa vulnerabilità SU 23 gennaio. Abbiamo parlato con OnePlus che lo ha fatto hanno confermato di aver riconosciuto e di risolvere questa seconda vulnerabilità in un futuro aggiornamento.

Anche questo attacco è abbastanza semplice da eseguire. È sufficiente eseguire un singolo comando fastboot per disabilitare (o abilitare) dm-verity: fastboot oem disable dm-verity. Per abilitarlo, è sufficiente emettere fastboot oem enable dm-verity. Il gestore di questo comando, preso da un dump del bootloader, è mostrato di seguito.


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

L'emissione di questo comando imposterà un flag, che Mr. Hay chiama dmVerity, che viene utilizzato dal bootloader per inviare un argomento della riga di comando del kernel che può abilitare o disabilitare dm-verity.

Questo può essere utilizzato in combinazione con la prima vulnerabilità per eseguire codice altamente privilegiato su OnePlus 3/3T senza il consenso dell'utente - e con accesso ai dati dell'utente. Ad esempio, il signor Hay è riuscito a installare un'applicazione su /system/priv-app che fa sì che l'applicazione venga aggiunta al dominio priv-app. Ciò consente a un'applicazione dannosa di accedere a funzioni altamente privilegiate sul dispositivo. Il signor Hay dimostra che entrambe queste vulnerabilità vengono sfruttate simultaneamente nel video qui sotto. Come puoi vedere, quando avvia il dispositivo, l'applicazione che ha creato risulta essere già preinstallata.


Conclusione e nota da OnePlus

I potenziali abusi di queste due vulnerabilità della sicurezza sono spaventosi. Ci congratuliamo con il signor Hay per aver rivelato queste vulnerabilità in privato e così rapidamente a OnePlus. Tuttavia, non possiamo fare a meno di allarmarci per il fatto che tali comandi di avvio rapido siano accessibili su questi dispositivi. Quando abbiamo scritto una guida su come farlo scopri i comandi fastboot nascosti, la nostra intenzione era informare gli utenti che potrebbero esserci alcuni comandi interessanti che possono utilizzare per migliorare la loro esperienza. Non avremmo mai pensato che comandi così privilegiati sarebbero stati inseriti nel codice del bootloader. Quanto a "Perché" questi comandi fastboot sono inclusi nel firmware, ci è stato fornito un "no comment." 

Per ora, se non hai aggiornato il tuo OnePlus 3/3T non appena è stata rilasciata ogni build del sistema operativo Oxygen, ti consigliamo aggiornare immediatamente. L'aggiornamento a Oxygen OS 4.0.2 ti proteggerà dalla prima vulnerabilità, ma dovremo aspettare fino a OnePlus lancia un aggiornamento che corregge la seconda vulnerabilità prima che possiamo dire che sei completamente al sicuro da queste sfrutta. Dovremo tenere gli occhi aperti per questo tipo di exploit in futuro.


Fonte: Roee Hay