[Actualización: segunda vulnerabilidad parcheada] Se descubrieron dos fallas críticas de seguridad en el cargador de arranque OnePlus 3/3T, una parcheada y otra en proceso de solución

Se han descubierto dos fallas relacionadas con el gestor de arranque para OnePlus 3 y OnePlus 3T. Uno ha sido parcheado, el otro está siendo solucionado.

Desde que se publicó este artículo, la versión 4.0.3 de Oxygen OS ha parcheado la segunda vulnerabilidad de seguridad analizada en este artículo, concretamente la dm-verity.

Antes de ingresar al maravilloso mundo del rooteo de Android, ROM personalizadas, kernels y otras modificaciones, primero debe desbloquear el gestor de arranque en su dispositivo.

En algunos dispositivos (especialmente los de marca de operador), esto plantea un problema ya que los usuarios tienen que lidiar con importantes obstáculos técnicos antes de poder desbloquear el gestor de arranque. Otros dispositivos, como los teléfonos Huawei, requieren que usted solicite al OEM un código único de desbloqueo del gestor de arranque, una barrera de entrada menor, pero no muy difícil. Aún mejores son los teléfonos de la serie Google Nexus/Pixel o OnePlus, que solo requieren que marques una opción en la Configuración del desarrollador y luego envíes algunos

arranque rápido comandos.

Pero no importa lo difícil que pueda ser desbloquear el gestor de arranque, una cosa siempre permanecerá constante: el requisito de borrar el dispositivo al desbloquearlo. Esto se hace por razones obvias de seguridad, ya que toda la partición de datos se puede extraer fácilmente una vez que se desbloquea el gestor de arranque. Una entidad maliciosa (con conocimientos técnicos) podría iniciar una recuperación personalizada y extraer una copia de seguridad completa de su dispositivo si obtiene acceso a sus datos. Es por eso que desbloquear su gestor de arranque se considera un riesgo de seguridad y es por eso que su dispositivo se borra después de desbloquearlo. Suponiendo que todo vaya como debería, un usuario normal debería estar a salvo de que los atacantes desbloqueen el gestor de arranque para evitar los métodos de bloqueo estándar de Android. Sin embargo, no todo sale según lo planeado.


Vulnerabilidad de desbloqueo del cargador de arranque OnePlus 3/3T

Un nuevo conjunto de vulnerabilidades fue recién revelado por Roee Hay (@roeehay), el primero de los cuales permite desbloquear el gestor de arranque del OnePlus 3/3T sin confirmación del usuario y sin activar un restablecimiento de fábrica. Esta vulnerabilidad, denominada CVE-2017-5625, se considera una vulnerabilidad de gravedad crítica y afecta a todos los dispositivos OnePlus 3/3T que se ejecutan en OxygenOS 3.2-4.0.1. Los usuarios que ya se han actualizado a la Oxígeno incremental 4.0.2 actualizar no están afectados por esta vulnerabilidad, ya que el Sr. Hay reveló en privado esta falla a OnePlus el 23 de enero para que pudieran solucionar el problema de inmediato.

La falla funciona enviando un comando fastboot oculto y propietario: fastboot oem 4F500301. Al enviar este comando, se omite el estado de bloqueo del cargador de arranque del usuario (incluso cuando "Permitir desbloqueo OEM" no se ha habilitado en la Configuración del desarrollador). El dispositivo no avisa al usuario ni lo limpia como debería; de hecho, ¡el dispositivo seguirá informando que el gestor de arranque está bloqueado! Otro comando de arranque rápido, fastboot oem 4F500302, restablecerá algunas configuraciones del gestor de arranque y puede usarse para bloquear un dispositivo ya desbloqueado.

El Sr. Hay descubrió que el primer comando fastboot establece lo que ha denominado "Bandera mágica" que anula la verificación que determina el estado de bloqueo del gestor de arranque al realizar un comando de flasheo o borrado.

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

Controlador de flash de arranque rápido


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

leer más

Controlador de borrado 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);
}

leer más

CVE-2017-5626 se puede utilizar para ejecutar código del núcleo. Un atacante puede mostrar cualquier imagen de arranque que desee. Sin embargo, si muestran una imagen de inicio modificada, el arranque verificado se activará y advertirá al usuario que se ha detectado una modificación. Una forma de evitar esto es mostrar una imagen de arranque más antigua y sin modificar, una que contenga exploits más antiguos que ya hayan sido parcheados. Aun así, la "advertencia" que recibe sólo dura 5 segundos, se descarta automáticamente y arranca en el estado de inicio verificado donde el código del atacante aún se ejecutará.

Hay menciona que hay muchas maneras en que esta falla puede explotarse de manera maliciosa. Por ejemplo, modificó una imagen de arranque para configurar el modo SELinux en permisivo además de incluir automáticamente el acceso ADB en el arranque. Luego, después de explotar esta vulnerabilidad para mostrar su imagen de arranque modificada, pudo acceder a una shell raíz antes de que el usuario pueda siquiera ingresar sus credenciales.

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

No hace falta decir que esto es bastante grave. Un dispositivo robado o bloqueado que usted cree que es seguro debido a sus medidas de seguridad típicas puede ser completamente derrotado usando este exploit.


Vulnerabilidad de OnePlus 3/3T SELinux

La segunda vulnerabilidad, denominada CVE-2017-5624, afecta todas las versiones de OxygenOS y permite que uno desactivar dm-verity. El Sr. Hay reveló esta vulnerabilidad al equipo de seguridad de OnePlus el 16 de enero, pero cabe señalar que el miembro senior de XDA th3g1zdescubrió de forma independiente esta vulnerabilidad en 23 de enero. Hemos hablado con OnePlus que tiene Confirmaron que han reconocido y solucionarán esta segunda vulnerabilidad. en una futura actualización.

Este ataque también es bastante sencillo de realizar. Sólo es necesario emitir un único comando fastboot para deshabilitar (o habilitar) dm-verity: fastboot oem disable dm-verity. Para habilitarlo, simplemente emita fastboot oem enable dm-verity. A continuación se muestra el controlador de este comando, tomado de un volcado del gestor de arranque.


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

Al emitir este comando se establecerá una bandera, que el Sr. Hay llama dmVerity, que utiliza el gestor de arranque para enviar un argumento de línea de comando del kernel que puede habilitar o deshabilitar dm-verity.

Esto se puede utilizar en combinación con la primera vulnerabilidad para ejecutar código altamente privilegiado en el OnePlus 3/3T sin el consentimiento del usuario y con acceso a los datos del usuario. Por ejemplo, el Sr. Hay pudo instalar una aplicación en /system/priv-app, lo que hace que la aplicación se agregue al dominio priv-app. Esto permite que una aplicación maliciosa acceda a funciones altamente privilegiadas del dispositivo. El Sr. Hay demuestra cómo se explotan ambas vulnerabilidades simultáneamente en el siguiente vídeo. Como puede ver, cuando inicia el dispositivo, se muestra que la aplicación que creó ya está preinstalada.


Conclusión y nota de OnePlus

Los posibles abusos de estas dos vulnerabilidades de seguridad son aterradores. Felicitamos al Sr. Hay por revelar estas vulnerabilidades de forma privada y tan rápida a OnePlus. Aún así, no podemos evitar alarmarnos de que se pueda acceder a dichos comandos de arranque rápido en estos dispositivos. Cuando escribimos una guía sobre cómo descubrir comandos fastboot ocultos, nuestra intención era informar a los usuarios que puede haber algunos comandos interesantes que pueden usar para mejorar su experiencia. Nunca pensamos que comandos tan privilegiados estarían en el código del gestor de arranque.. Como para "por qué" Estos comandos fastboot están incluidos en el firmware, nos dieron un "sin comentarios." 

Por ahora, si no ha actualizado su OnePlus 3/3T tan pronto como se lanza cada versión de Oxygen OS, le recomendamos que actualizar inmediatamente. La actualización a Oxygen OS 4.0.2 te protegerá de la primera vulnerabilidad, pero tendremos que esperar hasta OnePlus lanza una actualización que corrige la segunda vulnerabilidad antes de que podamos decir que está completamente a salvo de estas hazañas. Tendremos que estar atentos a este tipo de hazañas en el futuro.


Fuente: Roee Hay