La vulnerabilidad del cargador de arranque OnePlus 3/3T permite cambiar SELinux al modo permisivo en Fastboot

¡Una vulnerabilidad grave en el gestor de arranque de OnePlus 3/3T permite a los atacantes cambiar el estado de SELinux de Enforcing a Permissive! ¡Siga leyendo para saber más!

El OnePlus 3 y el OnePlus 3T se encuentran entre los mejores teléfonos que puedes comprar ahora mismo. Si bien los próximos buques insignia de 2017 aún no se han revelado a los consumidores, en su ausencia, el OnePlus 3/3T domina el rendimiento en el mundo real a un precio asequible.

Pero, si queremos ser justos al evaluar el dispositivo, debemos reconocer que a pesar de los mejores esfuerzos de OnePlus, el OnePlus 3/3T no está exento de fallas. Por ejemplo, hemos informado anteriormente sobre problemas de seguridad como OnePlus filtra detalles de IMEI a través de la red cuando busca actualizaciones en su teléfono. Y ahora tenemos otro problema de seguridad que agregar a la lista, éste con ramificaciones potencialmente más peligrosas.

Una vulnerabilidad en el gestor de arranque del OnePlus 3/3T abre las puertas a ataques maliciosos. Según lo descubierto por Roee Hay del equipo de investigación de seguridad de aplicaciones IBM X-Force y 

revelado en la plataforma IBM X-Force Exchange, esta vulnerabilidad permite a un atacante manipular el estado SELinux en los dispositivos, convirtiéndolo así en modo permisivo. Todo lo que el atacante necesita es ya sea acceso físico al dispositivo, o acceso remoto a una conexión ADB al dispositivo.

SELinux, o Linux con seguridad mejorada, es un módulo de seguridad del kernel de Linux que permite el acceso y la gestión de políticas de seguridad. SELinux se introdujo en Android a partir de Android 4.3 y se configuró para hacer cumplir Modo por defecto desde Android 4.4. Este sistema de control de acceso obligatorio ayuda a hacer cumplir los derechos de control de acceso existentes e intenta evitar ataques de escalada de privilegios. Esto actúa como un obstáculo para el control no autorizado de su dispositivo, como una aplicación o una vulnerabilidad que pretende obtener acceso raíz de forma maliciosa. Configuración de SELinux para hacer cumplir de forma predeterminada en Android sirve como primer paso para proteger a los usuarios normales de este tipo de ataques.

La vulnerabilidad es bastante sencilla de explotar; de hecho, parece ser un gran descuido por parte de OnePlus en lugar de lo que uno imaginaría que sería un exploit típico. Primero, un atacante reinicia el OnePlus 3/3T en modo 'fastboot': si tiene acceso físico, simplemente presione el botón Subir volumen durante el arranque, pero si no lo tiene, puede emitir el comando ADB. adb reboot bootloader al dispositivo. El modo fastboot del dispositivo expone una interfaz USB, que no debería permitir que se complete ningún comando sensible a la seguridad en dispositivos bloqueados. Pero en el OnePlus 3/3T, basta con emitir el fastboot oem selinux permissive El comando a través de la interfaz fastboot alterna el modo SELinux de hacer cumplir a Permisivo.

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

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

Para complicar aún más el problema, OnePlus 3 y 3T no poseen ninguna entrada en la 'Pantalla Acerca de' que mencione el estado actual de SELinux del dispositivo. Una víctima seguirá siendo ajena al estado comprometido de su dispositivo si no fue testigo del uso activo del exploit. La falta de una entrada de estado de SELinux en la 'Pantalla Acerca de' falta tanto en las versiones Open Beta basadas en Android 6.0 como en las ROM oficiales de Android 7.0.

Existen varias aplicaciones para cambiar el estado de SELinux a Permisivo, como por ejemplo SELinuxModeCambiador solicitud. Alternar SELinux a través de este método no permite que el estado persista durante un reinicio. Aunque puedes utilizar guiones para mantener el Permisivo Estado de SELinux durante reinicios completos. Ambos métodos requieren acceso root, lo que implica que el usuario ya tiene conocimiento de los riesgos a los que está expuesto. Pero la principal diferencia con cambiar el modo SELinux a Permisivo usar la vulnerabilidad anterior es que no solo persiste durante reinicios completos, lo hace sin necesidad de acceso root.

A día de hoy no existen remedios contra esta vulnerabilidad.


ACTUALIZAR:

Nos acercamos a sultanxda, uno de los desarrolladores de ROM personalizados más reconocidos para dispositivos OnePlus, para ver si podía ayudarnos a aprender más sobre este tema. Rápidamente buscó en el código para encontrar la fuente raíz, esto es lo que encontró:

La forma en que "fastboot oem selinux "El comando funciona es que agrega un argumento adicional a la línea de comando del kernel al iniciar Linux. El argumento adicional viene en forma de "androidboot.selinux=", dónde puede ser "permisivo". Ahí es donde la cosa se pone divertida: "androidboot."Los argumentos en la línea de comando del kernel son analizados por el init de Android. En una compilación de producción normal de Android (una compilación de "usuario"), el argumento "androidboot.selinux" se ignora por completo y selinux siempre se ve obligado a aplicarlo. Entonces este error se compone de dos problemas:

  1. Los usuarios pueden hacer que el gestor de arranque pase un indicador que normalmente haría que Selinux sea permisivo en una compilación de ROM de ingeniería/depuración.
  2. OnePlus modificó el inicio de Android para respetar el indicador "androidboot.selinux" incluso para compilaciones de ROM de producción.

Aquí es donde el init de Android está configurado para ignorar el indicador "androidboot.selinux" para las compilaciones de producción: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

El indicador ALLOW_DISABLE_SELINUX en el código fuente solo está establecido en 1 para compilaciones de ingeniería y depuración del usuario.

(Mi ROM no se ve afectada por esto porque construyo mi ROM en modo de producción (usuario))

Entonces "androidboot.selinux" simplemente se ignora en mi ROM, el "fastboot oem selinux" "El comando también parece ser algo que creó OnePlus, ya que no existe tal comando en las fuentes públicas del gestor de arranque de CAF. En lo más alto de mi cabeza, se me ocurren 4 formas de solucionar este problema para usuarios con cargadores de arranque desbloqueados:

  1. Edite hexadecimalmente el gestor de arranque para cambiar todas las instancias de la cadena "selinux" a algo diferente (como "sclinux") para que el inicio de Android no reconozca la bandera.
  2. Edite hexadecimalmente el binario de inicio de Android en OxygenOS para reemplazar todas las instancias de "androidboot.selinux" a algo diferente (como "androidboot.sclinux") para que Android init no reconozca el bandera androidboot.selinux
  3. Agregue un truco al controlador de línea de comando del kernel similar a mi bypass SafetyNet para ocultar el indicador "androidboot.selinux" del inicio de Android.

Nos gustaría agradecer a Sultanxda por su tiempo y esfuerzo al ayudarnos a descubrir qué sucede detrás de escena. También nos comunicamos con OnePlus, que está al tanto de la situación y está investigando el asunto.


Esperamos que OnePlus reconozca públicamente el grave problema y sea transparente en sus planes para solucionarlo.