
إثبات مفهوم لكتابة خارج الحدود في دالة vfs_attr_pack_internal (getattrlist) الخاصة بـ XNU على iOS 26.6، مع توضيح تلف كومة النواة وملاحظات استغلال لتزوير مؤشرات PAC.
getattrlist داخل vfs_attr_pack_internalالمكوّن: XNU VFS — vfs_attr_pack_internal (استدعاء النظام getattrlist)
المتأثر: iOS / iPadOS 26.6 (23G71) والإصدارات الأقدم
تم الإصلاح في: iOS / iPadOS 26.6.1 (23G83)
النوع: كتابة خارج حدود المخزن المؤقت للمتصل
التأثير: تلف في كومة النواة؛ من سياق النواة (بعد قراءة/كتابة النواة)، يتيح كتابة مؤشر موقّع بـ PAC إلى مخزن مؤقت يتحكم به المهاجم
اكتُشف بواسطة باحث مجهول
(وفقًا لنشرة أمان Apple — iOS 26.6.1)
تقوم vfs_attr_pack_internal بالتكرار عبر خريطة البت للسمات المطلوبة وتكتب كل سمة في مخزن المتصل المؤقت بشكل تسلسلي. وهي لا تتحقق مما إذا كان إزاحة الإخراج الجارية قد تجاوزت bufsize قبل كتابة الفتحة 51 (SETXATTR_SLOT).
بالنسبة لملف باسم مكوّن من 16 حرفًا، يكون إجمالي الإخراج الصالح للسمات هو 0x1a4 (420) بايت. تبدأ الفتحة 51 عند الإزاحة 0x198 (408 بايت). عندما يوفّر المتصل مخزنًا أصغر من 0x198 + 8، تكتب النواة 8 بايت بعد نهاية المخزن:
; vfs_attr_pack_internal (المسار المتأثر، 26.6 / 23G71)
; كتابة الفتحة 51 — لا يوجد فحص لحدود قبل التخزين
str x_attr_data, [buf + 0x198] ; خارج الحدود إذا كان bufsize < 0x198 + 8
أقنعة السمات الصالحة التي تم التحقق منها عبر فحص على الجهاز (getattrlist على اسم ملف مكوّن من 16 حرفًا، iOS 26.6):
| الحقل | القناع |
|---|---|
commonattr | 0xffe7ffff (البتان 19 و20 غير صالحين على هذه النواة) |
fileattr | 0x0000363f |
forkattr | 0xffffe003 |
مع هذه الأقنعة على اسم ملف مكوّن من 16 حرفًا، يكون إجمالي الإخراج = 0x1a4 بايت. يحدث الخروج عن الحدود عند الفتحة 51 (buf+0x198) كلما كان bufsize < 0x1a0.
على iOS 26، تمنع عزل KHEAP_TEMP الكتابة خارج الحدود من إتلاف تخصيصات الكومة المجاورة بشكل مفيد مباشرةً من مساحة المستخدم. يُصنَّف الخطأ على أنه كومة النواة فقط في هذا البحث:
vfs_attr_pack_internal من موقع استدعاء مُتحكَم به.في سلسلة كسر حماية iOS 26.6، يُستخدم هذا الخطأ في المرحلة النهائية لكتابة مؤشر مُزيّف بـ PACIA في تخصيص نواة مجاور لمخزن المُستدعي المؤقت.
يوضح poc_getattrlist_oob.c حدود الخروج عن الحدود بثلاث استدعاءات:
ينشئ إثبات المفهوم اسم ملف مكوّنًا من 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 (344 بايت بعد النهاية) |
| 2 | 0x198 بايت | تبدأ الكتابة خارج الحدود تمامًا عند نهاية المخزن |
| 3 | 0x1a4 بايت | الحجم الصالح الدقيق → نجاح نظيف |