¿Cuáles son los mecanismos / defectos exactos explotados por las vulnerabilidades de Android “ira contra la jaula” y “z4root”?

Rage Against the Cage (RAtC) explota el hecho de que el daemon de Android Debug Bridge (adb) en dispositivos Android se inicia como root de forma predeterminada y llama a setuid para que elimine sus privilegios a los de una cuenta shell. El demonio ADB es lo que se ejecuta en los teléfonos Android para permitir que los desarrolladores de software Android se comuniquen con los teléfonos en los que están probando su software.

En Linux, un límite de recursos para todo el sistema, RLIMIT_NPROC, define el número máximo de procesos simultáneos permitidos por el sistema (Android, en este caso). RAtC verifica este límite y genera procesos que no hacen nada hasta que se alcanza el límite de Android. Esto se llama una bomba tenedor.

Con el número de procesos al máximo, RAtC mata el proceso de adb en ejecución en el teléfono. El proceso que inicia adb cuando se enciende el teléfono intenta garantizar que adb siempre se esté ejecutando, por lo que reinicia adb. Hay una condición de carrera para que el proceso padre se supere aquí, porque el proceso adb debe generarse mientras RLIMIT_NPROC ya está casi al máximo.

Adb se reinicia de forma predeterminada como root, lo que debe hacer para que los desarrolladores puedan depurar correctamente su software. Luego verifica rápidamente si realmente necesita seguir ejecutándose como root, o si puede degradar sus privilegios porque el acceso a la raíz no es necesario. Lo primero solo es cierto cuando Android se ejecuta en un emulador de espacio aislado en la computadora de un desarrollador o si la compilación de Android es una versión de depuración, por lo que intenta abandonar sus privilegios usando setuid.

Pero la bifurcación de RAtC ya ha maximizado la cantidad de procesos que ya se están ejecutando, por lo que la llamada a setuid falla y adb sigue ejecutándose como root. Con adb ejecutándose como root, podemos hacer lo que queramos en el dispositivo.