
webkit; but pwned
Este programa definitivamente no es spyware.
Ejecútalo en tu dispositivo iOS de 64 bits lo antes posible.
Tu cooperación será recompensada.
[ Versión en vivo en totally-not.spyware.lol ]
El frontend y el exploit de WebKit están en /root.
El exploit del kernel está en /glue.
La post-explotación está en /glue/dep.
DoubleH3lix y Meridian se pueden compilar de forma independiente como bibliotecas estáticas con make headless y make all respectivamente, en sus directorios.
Luego se usan para compilar el payload en /glue, que es el binario que se ejecuta desde JIT después del exploit de WebKit. Se puede compilar con solo un make, y compilará todas las dependencias según sea necesario.
Y todo eso finalmente se une con el exploit de WebKit ejecutando make en /root, que de nuevo compilará las dependencias según sea necesario.
Originalmente queríamos hacer un backport del parche de WebKit a 10.x, pero finalmente nos rendimos.
Consulta /patch para más detalles, pero la idea principal es:
Una parte del error de WebKit eran predicciones incorrectas en JSC::DFG::clobberize, que es básicamente un enorme switch-case. El arreglo consistía en redirigir algunos valores a bloques que ya se usan para otros valores.
En las versiones que comprobamos, el compilador había generado tablas de salto para eso, así que nuestra idea habría sido simplemente encontrar y parchear todas esas tablas de salto, ya que el código correcto ya estaría presente.
El problema es que los valores de los que depende todo han cambiado cientos de veces durante la vida útil de iOS 10 (sí, mucho más a menudo de lo que ha habido versiones de iOS), y parece que no hay puntos de referencia en ningún sitio cercano en el código, por lo que nos resulta prácticamente imposible determinar qué valores parchear. :(