Encontraron una forma de hacer bypass a SELinux
A finales del mes pasado de Mayo, Sean Pesce, un investigador de seguridad compartió información en su blog sobre un método que encontró para eludir el modulo de seguridad SELinux.
En su publicación de blog, compartió una demostración de como es posible poder eludir la prohibición de cargar módulos del kernel, implementada en reglas específicas de SELinux en uno de los dispositivos estudiados (no se especifica qué dispositivo es y cuánto afecta el problema a las reglas de SELinux en firmware y distribuciones).
Para quienes desconocen de SELinux (Security Enhanced Linux) deben saber que este es un módulo de seguridad para el kernel Linux, que mejora la seguridad del sistema y, en caso de violación de la seguridad, evita que se propague por todo el sistema.
SELinux funciona en tres modos; «Disable, Permissive y Enforcing». En el modo Disable, SELinux permanece completamente desactivado. Si SELinux está habilitado, estará en modo Permissive o en modo Ejecutor. En modo permisivo, SELinux solo monitoreará la interacción. En el modo de Enforcing, SELinux también filtrará la interacción con el monitoreo.
Su rigidez de seguridad se puede entender por el hecho de que con SELinux, que incluso si se llega a comprometer el sistema, no se puede acceder a los archivos a los que no se les da acceso.
Ya habiendo explicado muy superficialmente SELinux, sobre el bypass Sean Pesce menciona que el bloqueo de módulos en las reglas de SELinux involucradas se basó en restringir el acceso a la llamada al sistema finit_module, que permite cargar un módulo desde un archivo y se usa en utilidades como insmod.
Recientemente he estado mirando un dispositivo basado en Linux no revelado como un proyecto paralelo personal de fin de semana. Usando algunas técnicas simples que no discutiré aquí, obtuve acceso de shell root. Para evitar revelar detalles innecesarios sobre la implementación de destino, la información, como los nombres de los archivos y los contextos de SELinux, se han modificado en el artículo.
Se menciona que como tal no es necesariamente forzoso el deshabilitar SELinux, pero para evitar muchas complicaciones se carga un módulo kernel personalizado «sería lo mejor». Pero en este caso no, ya que para eludirlo comparte que primeramente decido clonar uno de los módulos del kernel existentes del sistema de archivos del dispositivo usando una secuencia de comandos y el cual es parcheado en la función module_init el cual también se puede usar para cargar módulos del núcleo directamente desde un búfer en la memoria.
Al conectarme con mi shell inverso, rápidamente me di cuenta de que el sistema tenía habilitado SELinux . Aunque la política no era tan estricta como la política estándar que puede encontrar en un dispositivo Android típico, era lo suficientemente estricta como para evitar que hiciera muchas cosas útiles (por ejemplo, montar sistemas de archivos y acceder a archivos en /etc / ) . Afortunadamente, pude escribir y ejecutar archivos en /tmp/ , por lo que todavía tenía una manera fácil de crear y ejecutar herramientas personalizadas.
Menciona ademas que hay dos llamadas al sistema diferentes que se pueden usar para cargar un módulo del kernel: int init_module que carga un módulo kernel almacenado en la memoria, mientras que int finit_module carga un módulo kernel desde el disco.
Con ello se aprovecha la posibilidad de cargar módulos del kernel, los cuales pueden ser compilados como módulos personalizado para hacer algo más avanzado y ya con las configuraciones necesarias se puede obtener una ejecución exitosa del kernel con acceso espacio del usuario.
No se esta eliminando el contexto de SELinux; más bien, estamos haciendo la transición al contexto de la tarea de inicio (en términos generales, este contexto probablemente tenga muy pocas restricciones, si las hay).
Para demostrar el método, se preparó un prototipo de explotación que permite ejecutar código a nivel de kernel cargando su módulo y deshabilitando completamente la protección de SELinux, si tiene acceso de root al sistema limitado usando SELinux.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en la publicación original en el siguiente enlace.