
CVE-2026-20700 के लिए PoC जो arm64e पर PAC साइनिंग ओरेकल के रूप में dyld के पेज-इन लिंकिंग को प्रदर्शित करता है। इसमें हाथ से तैयार किए गए Mach-O जनरेटर, चेन्ड-फिक्सअप विश्लेषण उपकरण, और iOS 18.5 के लिए निर्धारित क्रैश/एक्सप्लॉइट प्रीसेट शामिल हैं।
dyld के पेज-इन लिंकिंग और चेन्ड फिक्सअप मशीनरी का एक नियंत्रित अन्वेषण, जो CVE-2026-20700 के संदर्भ में PAC साइनिंग ओरेकल के रूप में कार्य करता है।
arm64e पर, हर फंक्शन पॉइंटर हार्डवेयर-प्रमाणित होता है। यहाँ का उद्देश्य यह दिखाना है कि dyld को स्वयं — एक हस्त-निर्मित Mach-O के माध्यम से — निर्देशित किया जा सकता है ताकि वह अपने सामान्य फिक्सअप तंत्र का उपयोग करके आक्रमणकारी-चयनित स्लॉट में PAC-वैध पॉइंटर्स उत्पन्न कर सके।
परीक्षण: iPhone 14 (iOS 18.5, arm64e) पर।
__DATA में चयनित स्लॉट में PAC-वैध फंक्शन पॉइंटर्स लिखता है।fixupPage64 में नियतात्मक क्रैश — दोषपूर्ण page_start/next मान dyld को पेज सीमा से बाहर ले जाते हैं, जो ब्रांच की पहुँच को साबित करता है।dispatch_source_t टाइमर हैंडलर के रूप में पंजीकृत होता है और इवेंट लूप के माध्यम से स्वाभाविक रूप से कॉल किया जाता है, बिना PoC कोड से सीधे आमंत्रण के।dyld-signing-oracle-poc/
├── Makefile ← पूरी पाइपलाइन का आयोजन करता है
├── src/
│ └── launcher.c ← iOS लॉन्चर (2 थ्रेड + डिस्पैच चेन-क्लोज़)
├── generators/
│ ├── gen_exports.py ← exports.c उत्पन्न करता है (N डमी सिंबल)
│ ├── gen_client.py ← client.c उत्पन्न करता है (N इम्पोर्ट, dyld गेट स्ट्रेस)
│ └── gen_malformed_dylib.py ← libmalformed.dylib उत्पन्न करता है (हस्त-निर्मित Mach-O)
├── tools/
│ ├── scan_pointers.py ← Mach-O पॉइंटर सेक्शन को W/R के रूप में वर्गीकृत करता है
│ └── inspect_fixups.py ← LC_DYLD_CHAINED_FIXUPS हेडर को पार्स करता है
└── blog/
├── it/
│ └── dyld-signing-oracle.md ← पूर्ण विवरण इतालवी में
└── en/
└── dyld-signing-oracle.md ← पूर्ण विवरण अंग्रेज़ी में
xcrun --sdk iphoneos --show-sdk-path)# डिफ़ॉल्ट पूर्ण बिल्ड (arm64, 99k सिंबल)
make
# पुनरावृत्ति के लिए तेज़ बिल्ड
make SYMBOLS=10000
# fixupPage64 में नियतात्मक क्रैश (ब्रांच पहुँच प्रमाण)
make stress
# स्थिर अंतर-इमेज राइट-व्हाट-व्हेयर
make exploit
# dyld PAC-वैध पॉइंटर लिखता है → dispatch इसे स्वाभाविक रूप से कॉल करता है
make chain_close
# उत्पन्न चेन्ड-फिक्सअप ब्लॉब लेआउट सत्यापित करें
make verify
# libmalformed.dylib के LC_DYLD_CHAINED_FIXUPS हेडर को पार्स करें
make inspect
# संकलित बाइनरीज़ में पॉइंटर सेक्शन (GOT/गैर-आलसी) स्कैन करें
make scan
# एड-हॉक हस्ताक्षरित (Sideloadly)
make chain_close
# PoCApp.ipa को Sideloadly में खींचें
# वास्तविक प्रमाणपत्र
make resign IDENTITY="iPhone Developer: ..." PROFILE=embedded.mobileprovision
# लॉग मॉनिटर करें
idevicesyslog | grep "POC"
PoCApp के अंदर रनटाइम लोड क्रम:
libexports.dylib — पहले लोड किया गया (RTLD_GLOBAL), किसी भी बाद के dlopen को write_target_value और attacker_hook प्रदान करता है।libclient.dylib — थ्रेड B (128KB स्टैक) द्वारा लोड किया गया; ~99k बाइंड लक्ष्य dyld पेज-इन लिंकिंग गेट पर दबाव डालते हैं।libmalformed.dylib — थ्रेड A द्वारा लोड किया गया; हस्त-निर्मित चेन्ड-फिक्सअप श्रृंखला dyld को _write_target_value (और वैकल्पिक रूप से _attacker_hook) को __DATA+0x10 / +0x20 में हल करने और लिखने के लिए बाध्य करती है।chain_close मोड में, main __DATA+0x20 को टाइमर हैंडलर के रूप में पंजीकृत करता है — इवेंट लूप इसे 1 सेकंड बाद बिना PoC कोड से सीधे आमंत्रण के कॉल करता है।पूर्ण तकनीकी विवरण इतालवी और अंग्रेज़ी में। इसमें शामिल है: PAC हार्डवेयर यांत्रिकी, पॉइंटर निर्माता के रूप में dyld, शून्य से चेन्ड-फिक्सअप एन्कोडिंग, पेज-इन लिंकिंग गेट यांत्रिकी, Mach-O इंजीनियरिंग खामियाँ (sizeofcmds, सेक्शन गणना, स्ट्राइड), कैनरी-सत्यापित डेटा लेआउट, 99k सिंबल गेट, पहुँच का क्रैश प्रमाण, स्थिर अंतर-इमेज प्रिमिटिव, arm64e साइनिंग ओरेकल अवधारणा, डिस्पैच टाइमर चेन-क्लोज़।
| फ़ाइल | द्वारा उत्पन्न |
|---|
exports.c | generators/gen_exports.py + Makefile sentinel symbols |
client.c | generators/gen_client.py |
libmalformed.dylib | generators/gen_malformed_dylib.py |
libexports.dylib | clang from exports.c |
libclient.dylib | clang from client.c |
PoCApp | clang from src/launcher.c |
PoCApp.ipa | Makefile package step |
| चर | डिफ़ॉल्ट | विवरण |
|---|
SYMBOLS | 99000 | libclient में बाइंड लक्ष्य गणना (पूर्व-26.3 गेट के लिए < 100k, 26.3+ के लिए < 64k) |
STACK_KB | 128 | वर्कर थ्रेड स्टैक आकार KB में |
BURN_KB | 0 | dlopen से पहले उपभोग करने के लिए स्टैक KB (0 = स्वचालित) |
MARGIN_KB | 24 | स्वचालित-बर्न मार्जिन |
ARM64E | 0 | DYLD_CHAINED_PTR_ARM64E_USERLAND24 प्रारूप का उपयोग करें |
MALFORM_PAGEIN | 0 | दोषपूर्ण पेज-इन चेन सक्षम करें |
MALFORM_TARGET_OFFSET | — | __DATA के अंदर लक्ष्य ऑफ़सेट (जैसे 0x10) |
CHAIN_CLOSE | 0 | दूसरा स्लॉट → _attacker_hook, dispatch डेमो सक्षम करें |
dispatch_source_t