
XNU के vfs_attr_pack_internal (getattrlist) में आउट-ऑफ-बाउंड राइट के लिए प्रूफ-ऑफ-कॉन्सेप्ट, iOS 26.6 पर कर्नेल हीप भ्रष्टाचार और PAC पॉइंटर फोर्जिंग के लिए शोषण नोट्स का प्रदर्शन करता है।
vfs_attr_pack_internal में getattrlist OOB राइटघटक: XNU VFS — vfs_attr_pack_internal (getattrlist syscall)
प्रभावित: iOS / iPadOS 26.6 (23G71) और पुराने संस्करण
समाधान: iOS / iPadOS 26.6.1 (23G83) में
प्रकार: कॉलर बफर में आउट-ऑफ-बाउंड्स राइट
प्रभाव: कर्नेल हीप भ्रष्टाचार; कर्नेल संदर्भ से (कर्नेल r/w के बाद), एक PAC-हस्ताक्षरित पॉइंटर को हमलावर-नियंत्रित बफर में लिखने में सक्षम बनाता है
एक अनाम शोधकर्ता द्वारा खोजा गया
(Apple सुरक्षा सलाहकार — iOS 26.6.1 के अनुसार)
vfs_attr_pack_internal अनुरोधित विशेषता बिटमैप पर पुनरावृत्ति करता है और प्रत्येक विशेषता को क्रमिक रूप से कॉलर के बफर में लिखता है। यह विशेषता स्लॉट 51 (SETXATTR_SLOT) लिखने से पहले यह जाँच नहीं करता कि चालू आउटपुट ऑफसेट bufsize से अधिक हो गया है या नहीं।
16-वर्ण वाले नाम वाली फ़ाइल के लिए, पूर्ण वैध विशेषता आउटपुट 0x1a4 (420) बाइट्स है। स्लॉट 51 ऑफसेट 0x198 (408 बाइट्स) पर शुरू होता है। जब कॉलर 0x198 + 8 से छोटा बफर प्रदान करता है, तो कर्नेल बफर के अंत से 8 बाइट्स आगे लिखता है:
; vfs_attr_pack_internal (प्रभावित पथ, 26.6 / 23G71)
; स्लॉट 51 राइट — स्टोर से पहले कोई बाउंड्स जाँच नहीं
str x_attr_data, [buf + 0x198] ; OOB यदि bufsize < 0x198 + 8
डिवाइस-परीक्षण द्वारा सत्यापित वैध विशेषता मास्क (16-वर्ण वाले फ़ाइलनाम पर getattrlist, iOS 26.6):
| फ़ील्ड | मास्क |
|---|---|
commonattr | 0xffe7ffff (बिट 19, 20 इस कर्नेल पर अमान्य हैं) |
fileattr | 0x0000363f |
forkattr | 0xffffe003 |
16-वर्ण वाले फ़ाइलनाम पर इन मास्क के साथ, कुल आउटपुट = 0x1a4 बाइट्स। OOB स्लॉट 51 (buf+0x198) पर होता है जब भी bufsize < 0x1a0।
iOS 26 पर, KHEAP_TEMP अलगाव OOB राइट को यूज़रस्पेस से आसन्न हीप आवंटन को उपयोगी तरीके से सीधे भ्रष्ट करने से रोकता है। इस शोध में बग को केवल कर्नेल-हीप के रूप में वर्गीकृत किया गया है:
vfs_attr_pack_internal ट्रिगर करें।iOS 26.6 जेलब्रेक श्रृंखला में, इस बग का उपयोग अंतिम चरण में कॉलर बफर के आसन्न कर्नेल आवंटन में PACIA-जाली पॉइंटर लिखने के लिए किया जाता है।
poc_getattrlist_oob.c तीन कॉल के साथ OOB सीमा प्रदर्शित करता है:
PoC परीक्षण लक्ष्य के रूप में 16-वर्ण वाला फ़ाइलनाम (/var/root/aaaaaaaaaaaaaaaa) बनाता है, तीनों getattrlist() कॉल चलाता है, और रिटर्न कोड प्रिंट करता है। एक कर्नेल पैनिक लॉग (यदि ट्रिगर होता है) buf+0x198 पर एक फॉल्ट दिखाएगा।
/var/root/ राइट एक्सेस (16-वर्ण वाली परीक्षण फ़ाइल बनाने के लिए; पथ को किसी भी लिखने योग्य स्थान पर समायोजित किया जा सकता है)# स्टैंडअलोन C बाइनरी — कोई फ्रेमवर्क आवश्यक नहीं
clang -arch arm64 -o poc poc/poc_getattrlist_oob.c
# डिवाइस पर चलाने के लिए:
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_getattrlist_oob.c
codesign -s "Apple Development" poc
| दिनांक | घटना |
|---|---|
| 2026-08-17 | iOS 26.6.1 समाधान के साथ जारी किया गया |
| 2026-08-17 | Apple ने सुरक्षा सलाहकार में श्रेय प्रकाशित किया |
| कॉल | बफर आकार | अपेक्षित परिणाम |
|---|
| 1 | 64 बाइट्स | कर्नेल 0x1a4 बाइट्स लिखता है → buf+0x198 पर OOB (अंत से 344 B आगे) |
| 2 | 0x198 बाइट्स | OOB राइट बफर के अंत से ठीक शुरू होता है |
| 3 | 0x1a4 बाइट्स | सटीक वैध आकार → स्वच्छ सफलता |