[Atualização: segunda vulnerabilidade corrigida] Duas falhas críticas de segurança do bootloader OnePlus 3/3T descobertas, uma corrigida e outra sendo corrigida

Duas falhas relacionadas ao bootloader foram descobertas para o OnePlus 3 e OnePlus 3T. Um foi corrigido, o outro está sendo resolvido.

Desde que este artigo foi publicado, o Oxygen OS versão 4.0.3 corrigiu a segunda vulnerabilidade de segurança discutida neste artigo, nomeadamente a dm-verity.

Antes de entrar no maravilhoso mundo do root do Android, ROMs personalizados, kernels e outras modificações, primeiro você precisa desbloquear o bootloader do seu dispositivo.

Em alguns dispositivos (especialmente os de marca de operadora), isso representa um problema, pois os usuários precisam lidar com obstáculos técnicos significativos antes de desbloquear o bootloader. Outros dispositivos, como os telefones Huawei, exigem que você solicite ao OEM um código exclusivo de desbloqueio do bootloader - uma pequena barreira de entrada, mas não muito difícil. Melhores ainda são os telefones da série Google Nexus/Pixel ou OnePlus, que exigem apenas que você marque uma opção nas configurações do desenvolvedor e envie algumas inicialização rápida comandos.

Mas não importa o quão difícil seja desbloquear seu bootloader, uma coisa sempre permanecerá constante: a necessidade de limpar o dispositivo ao desbloquear. Isso é feito por razões óbvias de segurança, já que toda a sua partição de dados pode ser facilmente extraída assim que o bootloader for desbloqueado. Uma entidade maliciosa (com conhecimento técnico) pode inicializar uma recuperação personalizada e extrair um backup completo do seu dispositivo se obtiver acesso aos seus dados. É por isso que desbloquear seu bootloader é considerado um risco à segurança e é por isso que seu dispositivo é apagado após desbloqueá-lo. Supondo que tudo corra como deveria, um usuário comum deve estar protegido contra invasores que desbloqueiam o bootloader para contornar os métodos de bloqueio padrão do Android. Nem tudo corre conforme o planejado, no entanto.


Vulnerabilidade de desbloqueio do bootloader OnePlus 3/3T

Um novo conjunto de vulnerabilidades foi acabei de divulgar por Roee Hay (@roeehay), o primeiro dos quais permite que o bootloader do OnePlus 3/3T seja desbloqueado sem confirmação do usuário e sem acionar uma redefinição de fábrica. Esta vulnerabilidade, rotulada CVE-2017-5625, é considerada uma vulnerabilidade de gravidade crítica e afeta todos os dispositivos OnePlus 3/3T executados no OxygenOS 3.2-4.0.1. Usuários que já atualizaram para o OxygenOS incremental 4.0.2 atualizar não são afetados por esta vulnerabilidade, já que o Sr. Hay divulgou esta falha em particular ao OnePlus em 23 de janeiro para que eles pudessem corrigir o problema imediatamente.

A falha funciona enviando um comando fastboot oculto e proprietário: fastboot oem 4F500301. Ao enviar este comando, o estado de bloqueio do bootloader do usuário é ignorado (mesmo quando "Permitir desbloqueio OEM" não foi habilitado nas configurações do desenvolvedor). O dispositivo não avisa o usuário nem limpa o dispositivo como deveria - na verdade, o dispositivo ainda reportará que o bootloader está bloqueado! Outro comando fastboot, fastboot oem 4F500302, irá redefinir algumas configurações do bootloader e pode ser usado para bloquear um dispositivo já desbloqueado.

Hay descobriu que o primeiro comando fastboot define o que ele chamou de "bandeira mágica" que substitui a verificação que determina o estado de bloqueio do bootloader ao executar um comando de flash ou apagamento.

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

Manipulador de Flash Fastboot


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

consulte Mais informação

Manipulador de apagamento 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);
}

consulte Mais informação

CVE-2017-5626 pode ser usado para executar o código do kernel. Um invasor pode atualizar qualquer imagem de inicialização que desejar. Porém, se eles exibirem uma imagem de inicialização modificada, o Verified Boot entrará em ação e avisará o usuário que uma modificação foi detectada. Uma maneira de contornar isso é atualizar uma imagem de inicialização mais antiga e não modificada - uma que contenha explorações mais antigas que já foram corrigidas. Mesmo assim, o "aviso" que você recebe dura apenas 5 segundos e é automaticamente descartado e inicializado no estado de inicialização verificada, onde o código do invasor ainda será executado.

Hay menciona que existem inúmeras maneiras pelas quais essa falha pode ser explorada de maneira maliciosa. Por exemplo, ele modificou uma imagem de inicialização para definir o modo SELinux como permissivo bem como incluir automaticamente o acesso ADB na inicialização. Então, depois de explorar essa vulnerabilidade para atualizar sua imagem de inicialização modificada, ele conseguiu acessar um shell root antes que o usuário possa inserir suas credenciais.

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

Escusado será dizer que isto é bastante sério. Um dispositivo roubado ou bloqueado que você considera seguro devido às suas medidas de segurança típicas pode ser completamente derrotado usando esta exploração.


Vulnerabilidade OnePlus 3/3T SELinux

A segunda vulnerabilidade, rotulada CVE-2017-5624, afeta todas as versões do OxygenOS e permite que alguém desabilitar dm-verity. Hay divulgou esta vulnerabilidade à equipe de segurança OnePlus em 16 de janeiro, mas deve-se notar que o membro sênior do XDA th3g1zdescobriu esta vulnerabilidade de forma independente sobre 23 de janeiro. Conversamos com OnePlus que tem confirmaram que reconheceram e corrigirão esta segunda vulnerabilidade em uma atualização futura.

Este ataque também é bastante simples de executar. Basta emitir um único comando fastboot para desabilitar (ou habilitar) o dm-verity: fastboot oem disable dm-verity. Para habilitá-lo, basta emitir fastboot oem enable dm-verity. O manipulador para este comando, retirado de um dump do bootloader, é mostrado abaixo.


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

A emissão deste comando definirá um sinalizador, que o Sr. Hay chama de dmVerity, que é usado pelo bootloader para enviar um argumento de linha de comando do kernel que pode ativar ou desativar o dm-verity.

Isso pode ser usado em combinação com a primeira vulnerabilidade para executar código altamente privilegiado no OnePlus 3/3T sem o consentimento do usuário – e com acesso aos dados do usuário. Por exemplo, o Sr. Hay conseguiu instalar um aplicativo em /system/priv-app que faz com que o aplicativo seja adicionado ao domínio priv-app. Isso permite que um aplicativo malicioso acesse funções altamente privilegiadas no dispositivo. Sr. Hay demonstra essas duas vulnerabilidades sendo exploradas simultaneamente no vídeo abaixo. Como você pode ver, quando ele inicializa o dispositivo, o aplicativo que ele construiu já está pré-instalado.


Conclusão e nota do OnePlus

Os potenciais abusos destas duas vulnerabilidades de segurança são assustadores. Parabenizamos o Sr. Hay por divulgar essas vulnerabilidades de forma privada e tão rápida ao OnePlus. Ainda assim, não podemos deixar de ficar alarmados com o fato de tais comandos fastboot estarem acessíveis nesses dispositivos. Quando escrevemos um guia sobre como descubra comandos fastboot ocultos, nossa intenção era informar aos usuários que pode haver alguns comandos interessantes que eles podem usar para aprimorar sua experiência. Nunca pensamos que comandos tão altamente privilegiados estariam no código do bootloader. Quanto a "por que" esses comandos fastboot estão incluídos no firmware, recebemos um "sem comentários." 

Por enquanto, se você não atualizou seu OnePlus 3/3T assim que cada versão do Oxygen OS foi lançada, recomendamos que você atualize imediatamente. A atualização para o Oxygen OS 4.0.2 irá protegê-lo da primeira vulnerabilidade, mas teremos que esperar até o OnePlus lança uma atualização que corrige a segunda vulnerabilidade antes que possamos dizer que você está totalmente protegido contra elas façanhas. Teremos que ficar atentos a esse tipo de exploração no futuro.


Fonte: Roee Hay