
Доказательство концепции для записи за пределами границ в XNU vfs_attr_pack_internal (getattrlist) на iOS 26.6, демонстрирующее повреждение кучи ядра и заметки по эксплуатации для подделки указателей PAC.
vfs_attr_pack_internal (getattrlist)Компонент: XNU VFS — vfs_attr_pack_internal (системный вызов getattrlist)
Затронуто: iOS / iPadOS 26.6 (23G71) и более ранние версии
Исправлено в: iOS / iPadOS 26.6.1 (23G83)
Тип: запись за пределами буфера вызывающего кода
Воздействие: повреждение кучи ядра; из контекста ядра (после получения доступа на чтение/запись к ядру) позволяет записать PAC-подписанный указатель в буфер, контролируемый атакующим
Обнаружено анонимным исследователем
(согласно Apple Security Advisory — 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
Допустимые маски атрибутов, подтверждённые проверкой на устройстве (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 демонстрирует границу выхода за пределы буфера с помощью трёх вызовов:
| Вызов | Размер буфера | Ожидаемый результат |
|---|---|---|
| 1 | 64 байта | Ядро записывает 0x1a4 байт → выход за границы на buf+0x198 (344 Б за концом) |
| 2 | 0x198 байт | Запись за пределами буфера начинается ровно в конце буфера |
| 3 | 0x1a4 байт | Точный допустимый размер → чистый успех |
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 опубликовала авторов в бюллетене безопасности |