La vulnerabilità del bootloader di OnePlus 3/3T consente il passaggio di SELinux alla modalità permissiva in Fastboot

Una grave vulnerabilità nel bootloader di OnePlus 3/3T consente agli aggressori di alternare lo stato di SELinux da Enforcing a Permissive! Continua a leggere per saperne di più!

IL OnePlus 3 e il OnePlus 3T sono tra i migliori telefoni che puoi acquistare in questo momento. Mentre i prossimi flagship del 2017 devono ancora essere rivelati ai consumatori, in loro assenza il OnePlus 3/3T dominano le prestazioni nel mondo reale ad un prezzo accessibile

Ma, se vogliamo essere onesti nel valutare il dispositivo, dobbiamo riconoscere che, nonostante i migliori sforzi di OnePlus, i OnePlus 3/3T non sono esenti da difetti. Ad esempio, abbiamo già segnalato problemi di sicurezza come OnePlus perde i dettagli IMEI sulla rete quando controlli gli aggiornamenti sul tuo telefono. E ora abbiamo un altro problema di sicurezza da aggiungere alla lista, questa volta con ramificazioni potenzialmente più pericolose.

Una vulnerabilità nel bootloader del OnePlus 3/3T apre le porte ad attacchi dannosi. Come scoperto da Roee Hay del team di ricerca sulla sicurezza delle applicazioni IBM X-Force e 

rivelato sulla piattaforma IBM X-Force Exchange, questa vulnerabilità consente a un utente malintenzionato di manipolare lo stato di SELinux sui dispositivi, commutandolo così in modalità permissiva. Tutto ciò di cui l'attaccante ha bisogno è o l'accesso fisico al dispositivo, o accesso remoto a una connessione ADB al dispositivo.

SELinux, o Security-Enhanced Linux, è un modulo di sicurezza del kernel Linux che consente l'accesso e la gestione delle policy di sicurezza. SELinux è stato introdotto su Android a partire da Android 4.3 ed è stato impostato su Applicazione modalità predefinita da Android 4.4. Questo sistema di controllo degli accessi obbligatorio aiuta a far rispettare i diritti di controllo degli accessi esistenti e tenta di prevenire attacchi di escalation dei privilegi. Ciò funge da ostacolo per il controllo non autorizzato sul tuo dispositivo, come un'app o una vulnerabilità che mira a ottenere l'accesso root in modo dannoso. Impostando SELinux su Applicazione per impostazione predefinita su Android serve come primo passo per proteggere gli utenti normali da tali attacchi.

La vulnerabilità è piuttosto semplice da sfruttare: in effetti, sembra essere un'enorme svista da parte di OnePlus piuttosto che quello che immagineresti possa essere il tuo tipico exploit. Innanzitutto, un utente malintenzionato riavvia OnePlus 3/3T in modalità 'fastboot': se hai accesso fisico, premi semplicemente il pulsante Volume su durante l'avvio, ma in caso contrario puoi eseguire il comando ADB adb reboot bootloader al dispositivo. La modalità di avvio rapido sul dispositivo espone un'interfaccia USB, che non dovrebbe consentire il completamento di alcun comando sensibile alla sicurezza sui dispositivi bloccati. Ma su OnePlus 3/3T, emettendo semplicemente il file fastboot oem selinux permissive Il comando tramite l'interfaccia fastboot attiva/disattiva la modalità SELinux da Applicazione A Permissivo.

fastboot oem selinux permissive
...
OKAY[ 0.045s]
finished. totaltime: 0.047s

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

Per complicare ulteriormente il problema, OnePlus 3 e 3T non possiedono alcuna voce nella schermata "Informazioni" per menzionare l'attuale stato SELinux del dispositivo. Una vittima continuerà a rimanere ignara dello stato compromesso del proprio dispositivo se non ha assistito all'utilizzo attivo dell'exploit. La mancanza di una voce sullo stato di SELinux nella schermata Informazioni manca sia nelle versioni Open Beta basate su Android 6.0 che nelle ROM ufficiali di Android 7.0.

Esistono diverse app per impostare lo stato di SELinux su Permissivo come SELinuxModeChanger applicazione. La commutazione di SELinux tramite questo metodo non consente allo stato di persistere attraverso un riavvio. Però puoi utilizzare gli script per mantenere il Permissivo Stato di SELinux durante i riavvii forzati. Entrambi questi metodi richiedono l'accesso root, il che implica che l'utente sia già a conoscenza dei rischi a cui è esposto. Ma la differenza principale nel cambiare la modalità SELinux in Permissivo utilizzando la vulnerabilità di cui sopra è che non solo persiste durante i riavvii forzati, lo fa senza bisogno dell'accesso root.

Ad oggi non esistono rimedi contro la vulnerabilità.


AGGIORNAMENTO:

Ci siamo rivolti a Sultanxda, uno degli sviluppatori di ROM personalizzate più riconosciuti per i dispositivi OnePlus, per vedere se poteva aiutarci a saperne di più su questo problema. Ha subito scavato nel codice per trovare il sorgente root, questo è quello che ha trovato:

Il modo in cui "fastboot oem selinux " funziona è che aggiunge un ulteriore argomento alla riga di comando del kernel all'avvio di Linux. L'argomento aggiuntivo si presenta sotto forma di "androidboot.selinux=", Dove può essere "permissivo". È qui che le cose si fanno divertenti: "androidboot." gli argomenti sulla riga di comando del kernel vengono analizzati da init. In una normale build di produzione Android (una build "utente"), l'argomento "androidboot.selinux" viene totalmente ignorato e selinux è sempre costretto a imporlo. Quindi questo bug è composto da due problemi:

  1. Gli utenti possono fare in modo che il bootloader passi un flag che normalmente renderebbe selinux permissivo su una build ROM di ingegneria/debug
  2. OnePlus ha modificato l'init di Android per onorare il flag "androidboot.selinux" anche per le build ROM di produzione

Ecco dove l'init di Android è configurato per ignorare il flag "androidboot.selinux" per le build di produzione: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

Il flag ALLOW_DISABLE_SELINUX nel codice sorgente è impostato su 1 solo per userdebug e build di ingegneria

(La mia ROM non è influenzata da questo perché creo la mia ROM in modalità produzione (utente))

Quindi "androidboot.selinux" viene semplicemente ignorato nella mia ROM, il "fastboot oem selinux " sembra essere qualcosa creato da OnePlus, poiché non esiste alcun comando del genere nei sorgenti pubblici del bootloader di CAF. A mente fredda, mi vengono in mente 4 modi per risolvere questo problema per gli utenti con bootloader sbloccati:

  1. Modifica esadecimale il bootloader per cambiare tutte le istanze della stringa "selinux" in qualcosa di diverso (come "sclinux") in modo che il flag non venga riconosciuto dall'init di Android
  2. Modifica esadecimale il binario di inizializzazione di Android in OxygenOS per sostituire tutte le istanze di "androidboot.selinux" in qualcosa di diverso (come "androidboot.sclinux") in modo che Android init non riconosca il file bandiera androidboot.selinux
  3. Aggiunto un hack al driver della riga di comando del kernel simile al mio bypass SafetyNet per nascondere il flag "androidboot.selinux" dall'init di Android

Vorremmo ringraziare Sultanxda per il suo tempo e il suo impegno nell'aiutarci a capire cosa succede dietro le quinte. Abbiamo contattato anche OnePlus, che è a conoscenza della situazione e sta esaminando la questione.


Ci auguriamo che OnePlus riconosca pubblicamente il grave problema e sia trasparente nei suoi piani per risolverlo.