Vulnerabilidade do carregador de inicialização OnePlus 3/3T permite a mudança do SELinux para o modo permissivo no Fastboot

Uma vulnerabilidade séria no bootloader OnePlus 3/3T permite que invasores alternem o estado do SELinux de Enforcing para Permissive! Continue lendo para saber mais!

O OnePlus 3 e a OnePlus 3T estão entre os melhores telefones que você pode comprar agora. Embora os próximos carros-chefe de 2017 ainda não tenham sido revelados aos consumidores, na sua ausência o OnePlus 3/3T domina o desempenho no mundo real a um preço acessível.

Mas, se quisermos ser justos na avaliação do dispositivo, precisamos reconhecer que, apesar dos melhores esforços do OnePlus, o OnePlus 3/3T tem seus defeitos. Por exemplo, já reportámos anteriormente sobre questões de segurança, como OnePlus vazando detalhes do IMEI pela rede quando você verifica atualizações em seu telefone. E agora temos outro problema de segurança para adicionar à lista, este com ramificações potencialmente mais perigosas.

Uma vulnerabilidade no bootloader do OnePlus 3/3T abre portas para ataques maliciosos. Conforme encontrado por Roee Hay da equipe de pesquisa de segurança de aplicativos IBM X-Force e 

revelado na plataforma IBM X-Force Exchange, esta vulnerabilidade permite que um invasor manipule o estado do SELinux nos dispositivos, alternando-o para o modo permissivo. Tudo o que o invasor precisa é ou acesso físico para o dispositivo ou acesso remoto a uma conexão ADB para o dispositivo.

SELinux, ou Security-Enhanced Linux, é um módulo de segurança do kernel Linux que permite acesso e gerenciamento de políticas de segurança. SELinux foi introduzido no Android a partir do Android 4.3 e foi configurado para Aplicação modo como padrão desde o Android 4.4. Este sistema de controle de acesso obrigatório ajuda a reforçar os direitos de controle de acesso existentes e tenta evitar ataques de escalonamento de privilégios. Isso funciona como um obstáculo para o controle não autorizado do seu dispositivo, como um aplicativo ou vulnerabilidade que visa obter acesso root de forma maliciosa. Configurando o SELinux para Aplicação por padrão no Android serve como o primeiro passo para proteger usuários normais de tais ataques.

A vulnerabilidade é bastante simples de explorar - na verdade, parece ser um grande descuido por parte do OnePlus, em vez de como você imaginaria que seria uma exploração típica. Primeiro, um invasor reinicia o OnePlus 3/3T no modo 'fastboot' - se você tiver acesso físico, basta pressionar o botão Aumentar volume durante a inicialização, mas se não tiver, você pode emitir o comando ADB adb reboot bootloader para o dispositivo. O modo fastboot no dispositivo expõe uma interface USB, que não deve permitir a conclusão de nenhum comando sensível à segurança em dispositivos bloqueados. Mas no OnePlus 3/3T, basta emitir o fastboot oem selinux permissive comando através da interface fastboot alterna o modo SELinux de Aplicação para Permissivo.

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

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

Para complicar ainda mais o problema, o OnePlus 3 e 3T não possuem nenhuma entrada na ‘Tela Sobre’ para mencionar o estado SELinux atual do dispositivo. A vítima continuará alheia ao estado comprometido de seu dispositivo se não testemunhar o uso ativo da exploração. A falta de uma entrada de estado SELinux na 'Tela Sobre' está faltando tanto nas versões Open Beta baseadas no Android 6.0 quanto nas ROMs oficiais do Android 7.0.

Existem vários aplicativos para alternar o estado do SELinux para Permissivo, como o SELinuxModeChanger aplicativo. Alternar o SELinux por meio deste método não permite que o estado persista durante uma reinicialização. Porém, você pode utilizar scripts para manter o Permissivo Estado do SELinux em reinicializações forçadas. Ambos os métodos requerem acesso root, o que implica que o usuário já tenha conhecimento dos riscos aos quais está exposto. Mas a principal diferença em mudar o modo SELinux para Permissivo usando a vulnerabilidade acima é que ela não apenas persiste durante reinicializações forçadas, faz isso sem precisar de acesso root.

Não existem soluções contra a vulnerabilidade até hoje.


ATUALIZAR:

Entramos em contato com Sultanxda, um dos desenvolvedores de ROM personalizados mais reconhecidos para dispositivos OnePlus, para ver se ele poderia nos ajudar a aprender mais sobre esse problema. Ele prontamente vasculhou o código para encontrar a fonte raiz, e foi isso que ele encontrou:

A maneira como o "fastboot oem selinux "O comando funciona é que ele adiciona um argumento extra à linha de comando do kernel ao inicializar o Linux. O argumento extra vem na forma de "androidboot.selinux=", onde pode ser "permissivo". É aí que as coisas ficam engraçadas: "androidboot."Os argumentos na linha de comando do kernel são analisados ​​pelo init do Android. Em uma compilação de produção normal do Android (uma compilação de "usuário"), o argumento "androidboot.selinux" é totalmente ignorado e o selinux é sempre forçado a ser aplicado. Portanto, esse bug é composto por dois problemas:

  1. Os usuários podem fazer o bootloader passar um sinalizador que normalmente tornaria o selinux permissivo em uma compilação de ROM de engenharia/depuração
  2. OnePlus modificou o init do Android para honrar o sinalizador “androidboot.selinux” mesmo para compilações de ROM de produção

É aqui que o init do Android é configurado para ignorar o sinalizador “androidboot.selinux” para compilações de produção: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

O sinalizador ALLOW_DISABLE_SELINUX no código-fonte é definido apenas como 1 para userdebug e compilações de engenharia

(Minha ROM não é afetada por isso porque eu construo minha ROM no modo de produção (usuário))

Portanto, "androidboot.selinux" é simplesmente ignorado na minha ROM, o "fastboot oem selinux "O comando também parece ser algo que o OnePlus criou, já que tal comando não existe nas fontes públicas do bootloader do CAF. Pensando bem, posso pensar em quatro maneiras de corrigir isso para usuários com bootloaders desbloqueados:

  1. Edite hexadecimalmente o bootloader para alterar todas as instâncias da string "selinux" para algo diferente (como "sclinux") para que o sinalizador não seja reconhecido pelo init do Android
  2. Edite hexadecimalmente o binário de inicialização do Android no OxygenOS para substituir todas as instâncias de "androidboot.selinux" por algo diferente (como "androidboot.sclinux") para que o Android init não reconheça o bandeira androidboot.selinux
  3. Adicione um hack ao driver de linha de comando do kernel semelhante ao meu bypass SafetyNet para ocultar o sinalizador "androidboot.selinux" do init do Android

Gostaríamos de agradecer a Sultanxda por seu tempo e esforço em nos ajudar a descobrir o que está acontecendo nos bastidores. Também entramos em contato com a OnePlus, que está ciente da situação e investigando o assunto.


Esperamos que o OnePlus reconheça publicamente o problema sério e seja transparente em seus planos para corrigi-lo.