Windows RT no es una versión recortada de Windows 8, esto es lo que se confirma por enésima vez con el jailbreak de Windows RT, aunque realmente no es un jailbreak en toda regla, vamos a ver los detalles de los métodos y por qué un jailbreak no siempre es bueno.

Primero vamos a ver unas cuestiones de concepto para entender bien cuáles son los métodos de jailbreak de Windows RT...y por qué no es un jailbreak en su definición completa.

¿De qué se trata el jailbreak de Windows RT? El origen

Para esto tenemos que ver primero qué se intenta romper, esto es: poder ejecutar aplicaciones de escritorio, ya que Microsoft bloqueó todas las aplicaciones en Windows RT que no fueran el Explorador, IE10, Office 2013 o que no vinieran de la Windows Store. Es decir, Windows RT no es una versión recortada sencillamente de Windows 8, sino que es un port de Windows 8 a la arquitectura ARM, y uno bueno, además.

Este bloqueo se consigue mediante la firma digital de las aplicaciones, habiendo varios niveles en estas firmas para decidir qué aplicaciones se ejecutarán o cuales no se ejecutan, esto es el "nivel mínimo de firma" digital requerido para que una aplicación se ejecute. Este nivel mínimo está representado por un byte en la parte segura del kernel, protegida por UEFI, estos niveles están escritos directamente a nivel de kernel, no son modificables desde el espacio de usuario. Concretamente existen 4 niveles de protección:

  • 0, sin firma.Es el menos seguro de todos, no precisa ninguna firma digital para ejecutar la aplicacion, este es el por defecto en Windows 8, puedes ejecutar lo que quieras.
  • 4, authenticode, es un estándar en la industria que permite a los desarrolladores incluir información sobre ellos en la instalación y poder validad la aplicación, su identidad y su integridad de código.
  • 8, Microsoft, casi que se explica automáticamente, es el nivel predeterminado en Windows RT.
  • 12, Windows es el nivel más alto de autentificación, por lo tanto, el más seguro.

Como os habréis imaginado, entonces, el jailbreak de Windows RT se basó en encontrar este byte y saltarse la protección, esta parte sonará fácil con palabras, pero no es fácil llevarlo a cabo técnicamente, menos descubrirlo.

No podemos acceder al kernel, pero esta variable que representa el nivel mínimo de autorización que necesita una aplicación se debe cargar en memoria principal (RAM) cada vez que el usuario vaya a ejecutar una aplicación, por un motivo sencillo: ¿Cómo se realiza la verificación si no? Ya tenemos el primer indicio de cómo intentar el jailbreak de Windows RT. El siguiente paso, por tanto fue encontrar la librería que hace la autentificación de la firma, que es CI.dll, este proceso fue llevado a cabo en una máquina con Windows 8 con un depurador, luego fue confirmado en Windows RT, al ser este un port de Windows 8. Una vez encontrado, el siguiente paso es ver cómo se puede modificar en memoria, esto significará que el jailbreak de Windows RT no será persistente entre reinicios.

¿Es una amenaza de seguridad? ¿Tiene efectos secundarios?

No, no es una amenaza de seguridad, pero sí es probable que tenga efectos secundarios, sobre todo en la duración de la batería, aunque si te adentras en el proceso viendo la lista de aplicaciones disponibles de momento, es porque este detalle no es demasiado importante para ti o siempre la vas a tener bajo del cargador.

Si bien el jailbreak no implica per se una amenaza de seguridad, sí que se pueden compilar aplicaciones que actúen como viruses y que corran en las tablets con el jailbreak de Windows RT, pero estas se habrán ido con el reinicio, al igual que el jailbreak.

Ejecutando el jailbreak, método rápido

Basado en el trabajo del anterior desarrollador, se ha publicado un método realmente sencillo para tener nuestra Surface o cualquier Windows RT jailbreakeado, lo que significa que podremos ejecutar aplicaciones de escritorio, aunque esto no significa que se puedan ejecutar las mismas aplicaciones que para Windows 7, como sí es posible en Windows 8, ya que las aplicaciones tendrás que estar compiladas específicamente para la arquitectura ARM. Teniendo el código fuente de una aplicación, portarlo es fácil. De hecho ya hay varias portadas y existe una lista de las que ya están probadas y funcionan, mayormente aplicaciones para desarrolladores y emuladores de consolas.

Vamos al lío, para la instalación:

  • Descargamos los archivos necesarios.
  • Descomprimimos los archivos en cualquier carpeta.
  • Ejecutamos "runExploit.bat". La primera vez que lo ejecutamos, si decidimos instalar la parte de Modern UI nos lanzará PowerShell para instalar la aplicación Modern UI en base al archivo .ps1 dentro de binModernUI_App (esto es un sideloading normal).

Nótese que si queremos echarle un vistazo a lo que hace el script nos basta con abrirlo con el bloc de notas, para los curiosos o experimentados.

Como hemos dicho antes, este sistema no perdura entre los reinicios del sistema, así que tenemos que aplicarlo con una pequeña modificación cada vez que encendamos nuestra tablet (cabe mencionar que yo nunca la apago). Vamos a ello:

  • Esperamos unos minutos después de que nos logueemos en nuestra cuenta.
  • Ejecutamos "runExploit.bat" y esperamos unos 20 segundos a que haga su magia.
  • Presionamos la tecla de volumen abajo.
  • Esperamos a que termine el script y respondemos a todo lo que nos pregunte, que es bastante sencillo.

Repetimos esta última parte del proceso cada vez que encendamos la tablet y podremos correr homebrew sin problemas.

¿Cuál es el método largo para el jailbreak de Windows RT?

Aquí empieza la parte complicada, casi exclusiva para personas con altos conocimientos técnicos, por lo que si el ensamblador de ARM o el hexadecimal te suena a chino, con ejecutar el método anterior es suficiente, que hace exactamente lo mismo. Para los curiosos o que entiendan de qué vamos a hablar, empecemos:

Windows asume que ciertos procesos siempre pasan información bien formada al kernel, lo que es una vulnerabilidad en toda regla, basta con attachearse al proceso designado, el problema es que en Windows RT las apps Modern UI no tienen el contexto de seguridad necesario para hacerlo y no podemos correr aplicaciones de escritorio, así que vamos a hacerlo con Visual Studio y un depurador remoto, este depurador remoto puede attachearse al proceso CRSS y manipular el byte del que hablábamos en memoria, que no está exportado en ningún símbolo en el kernel, por cierto.

La función vulnerable es NtUserSetInformationThread, que se llama varias veces desde CRSS, trabajaremos sobre la librería winsrv.dll por ser la que tiene los parámetros indicados para el exploit:

TerminalServerRequestThread+0x230
MOVS R3, #0xC
ADD R2, SP, #0x58
MOVS R1, #9
MOV R0, 0xFFFFFFFE
BL NtUserSetInformationThread

Ahora lo que deberemos hacer es ejecutar el código y poner un punto de ruptura del depurador para poder modificar la estructura de R2 antes de que llame a NtUserSetInformationThread y hacernos con la vulnerabilidad. El problema es que esto no es una solución de por sí viable, ya que necesitamos restar 0×80000, en lugar de 1, que es lo que resta este exploit; esto es debido a que el offset del byte que lleva la información de la firma mínima necesaria es  0x19FFA6.

Para seguir el proceso necesitaremos saber la dirección de memoria donde se aloja el kernel, esto sí que se puede hacer desde una aplicación Modern UI en C++ con la función NtQuerySystemInformation. Para usar esta función necesitaremos hacer unas modificaciones para poder llamar a la API completa de C++ desde una aplicación de la Windows Store.

Pasando otra vez al depurador remoto en Visual Studio, desde la posición 0×10800 en winsrv.dll, corremos:

 push {r5-r8}
    mov r7, 0x80000
    ldr r8, my_addr
loc_loop_begin
    movs r3, 0xC
    add r2, sp, 0x68 ;0x58 org.
    add r5, r2, 4
    str r8, [r5]
    movs r1, 9
    mvn r0, 1
    mov r12, 0x10E1
    svc 1
    subs r7, r7, 1
    cmp r7, 0
    bne loc_loop_begin
    pop {r5-r8}
    mov r0, r0  ;#punto de ruptura
my_addr dcd <DIRECCIÓN>
    end

Obviamente donde pone <DIRECCIÓN> debemos poner la dirección base de nuestro kernel, sumándole 0x19FFA4 + 0x18. Antes de ejecutar esto ponemos un punto de ruptura antes de la llamada al método en  NtUserSetInformationThread en TerminalServerRequestThread, que se activará cuando presionemos un botón de volumen. Luego de esto lo que haremos es redireccionar el registro que guarda el puntero de la siguiente instrucción a la posición de memoria donde está el código que hemos puesto arriba, ejecutamos y redireccionamos al primer punto de ruptura. Cuando volvamos a ejecutar, tendremos el jailbreak de Windows RT.

Recibe cada mañana nuestra newsletter. Una guía para entender lo que importa en relación con la tecnología, la ciencia y la cultura digital.

Procesando...
¡Listo! Ya estás suscrito

También en Hipertextual: