Amantes del Root en Android, la seguridad en Lollipop juega en contra

Les comentaba cuando se presentó Android 4.3 que a partir de entonces SELinux, la herramienta de seguridad de Linux, vendría activada por defecto (en Android 4.2 Google dejó a elección del fabricante activarlo o no). Pues bien, precisamente esta característica cobra protagonismo en Android L, con un efecto secundario menos halagüeño.

Lollipop

Poniéndonos en antecedentes, SELinux es un componente de Linux basado en la confianza, es decir, un sistema que gestiona servicios del sistema operativo según sus permisos, de tal manera que genera grupos de aplicaciones “de confianza” que pueden escalar privilegios sin tener por ello que permitir una escalada de privilegios en el resto de herramientas.

Puesto que Android está basado en Linux, el funcionamiento sería el mismo. Si una aplicación por ejemplo necesita acceso a la cámara, el desarrollador habrá pedido dicho acceso a la hora de instalarla, por lo que la aplicación puede lanzar los servicios de cámara. Pero imaginemos que para sacar la fotografía necesita además acceso al sensor de proximidad (enfoque) o al flash, que en este supuesto caso, no estaban contemplados en los permisos iniciales de la cámara. SELinux se encarga de que pueda romper la sandbox para esos casos específicos, y no por ejemplo para acceder a la lectura o envío de SMS, ya que no tendría sentido para una petición de cámara.

Cuando queremos rootear un dispositivo (fíjese que no hablo únicamente de Android), lo que hacemos en verdad es instalar un sistema que se salta el sandbox del SO y accede al inicio como SuperUsuario, de tal manera que por un lado, tenemos acceso a permisos que el usuario base de Android no podría, y por otro, corremos mayor riesgo al exponer nuestro sistema a permisos que podrían comprometer la privacidad e integridad del mismo. Ganamos control a cambio de mayor responsabilidad, a fin de cuentas.

Para realizar este paso, en la mayoría de casos utilizamos un script que reinicia el terminal y se ejecuta al inicio del arranque del sistema, en vez de como usuario normal, como SuperUsuario. Al pasar a utilizar SELinux por defecto, el sistema de confianza se mantiene en el arranque, por lo que entiende que la petición es ilegítima y la cancela.

¿Qué quiere decir esto? Que la manera sencilla que teníamos de rootear el terminal en Android Lollipop no funciona ¿La solución? Evitar que SELinux gestione esos permisos específicos en el arranque.

Y aquí viene el problema. Para conseguir esto, necesitamos ser SU, y para ser SU, necesitamos rootear el terminal, o bien contar con una ROM que por defecto (en kernel) venga rooteada ¿Entiende la situación?

La verdad es que el problema es complejo de solucionar, ya que, a no ser que se encuentre una forma de vulnerar SELinux, la única manera de rootear un terminal sería si el fabricante liberara el kernel (botloader desbloqueado), algo que suele ocurrir con los Nexus, pero no con la mayoría de marcas. Y en el primer caso, estaríamos ante un problema crítico de seguridad, ya que podría ser usado tanto para que esos usuarios avanzados que nos gusta trastear podamos vivir al límite la experiencia Android, como para que cualquier atacante preparara malware que se salta precisamente aquel componente de Android que llega para evitar problemas de seguridad y privacidad mayores.

Veremos cómo evoluciona el tema, pero soy bastante pesimista. O bien el rootear quedará restringido a un número cada vez menor de familias de terminales (que me de ahora cuenta, Nexus, SONY, HTC y parece que pronto LG), o bien volveremos a estar como antes, con un sistema operativo que atesora casi todo el mercado móvil tan vulnerable como hasta ahora a escalada de privilegios. Y ojo, que soy pesimista no porque el root se acabe, sino más bien por el posible exploit que nos acabaremos comiendo con SELinux :(.

Qué difícil resulta aveces contentar a todos…

Tiene a su disposición la explicación técnica (sí, pese a lo que parezca, esta entrada tenía como objetivo ser entendible por los profanos) en la cuenta de Google+ de Chainfire (EN).