
Корневой анализ и proof-of-concept для CVE-2026-64705, переполнения кучи в ядре macOS при обработке xattr в HFS. Включает weaponized HFS+ образ, патчер, парсер и подробное описание для образовательных и защитных исследований.
Анализ первопричины и proof-of-concept для CVE-2026-64705, переполнения буфера в расширении ядра HFS, исправленного в macOS Sonoma 14.8.7 (HT127117):
HFS — Воздействие: приложение может вызвать непредвиденное завершение работы системы или запись в память ядра. Переполнение буфера устранено с помощью улучшенной проверки границ.
PoC представляет собой модифицированный образ диска HFS+. Его монтирование и чтение
специально созданного расширенного атрибута приводит расширение HFS kext в
неограниченный цикл bcopy по 64 байта в 512-байтовый буфер кучи ядра →
переполнение кучи ядра с содержимым, контролируемым атакующим, на диске → паника
на уязвимых сборках. Уровень «крах/паника» — не RCE.
adds/b.hs, завершение при нулевом счётчике и отклонение total==0 / total>expectedhfs_setxattr: %s has a malformed overflow extent, то же для getxattr.| файл | описание |
|---|---|
poc-cve-2026-64705.dmg | Модифицированный образ HFS+ на 32 МБ (файл-триггер + специально созданные записи xattr) |
weaponize.py | Патчер, создавший образ — заново вычисляет каждое смещение из самого образа; работает с любым совместимым базовым образом |
parse_attr.py | Парсер B-дерева атрибутов, используемый для поиска/дампа записей xattr |
BUILD.md | Полная инструкция по сборке из чистого базового образа + точные hex-дельты |
WRITEUP.md | Анализ первопричины: дифф kext (14.8.5 против 14.8.7), уязвимый цикл, механизм |
На системе до исправления (или в жертвенной ВМ — это вызывает панику ядра):
hdiutil attach -nobrowse poc-cve-2026-64705.dmg
xattr -l /Volumes/CVE64705/trigger.txt # переполнение кучи ядра -> паника
На исправленной системе тот же образ монтируется нормально, а триггер отклоняется новым валидатором — вы можете наблюдать дифференциальное доказательство в журнале ядра:
hfs_getxattr: bigattr has a malformed overflow extent
что также подтверждает: специально созданная запись направляет выполнение точно в исправленный (и ранее уязвимый) обход.
hdiutil create -fs HFS+ -size 32m -volname CVE64705 base.dmg
hdiutil attach -nobrowse base.dmg
echo trigger > /Volumes/CVE64705/trigger.txt
xattr -w bigattr "$(head -c 8192 /dev/zero | base64)" /Volumes/CVE64705/trigger.txt
hdiutil detach /Volumes/CVE64705
python3 weaponize.py # -> poc-cve-2026-64705.dmg
Для большого xattr, хранящегося как kHFSPlusAttrForkData, hfs_getxattr_internal
(и зеркальная hfs_setxattr_internal) обходит 8 дескрипторов экстентов записи
переполнения. count_extent_blocks() пропускает любой дескриптор, чей
blockCount превышает ожидаемый итог, и возвращает 32-битную сумму без проверки
переноса или нуля. Если каждый blockCount превышает итог, счётчик возвращается
равным 0, blkcnt никогда не увеличивается, и цикл while (blkcnt < totalblocks)
продолжает копировать по 64 байта, контролируемых атакующим, за итерацию за
пределы буфера кучи размером totalblocks*8 байт. Вариант с целочисленным
переносом (blockCounts, суммирующиеся за 2^32) — та же отсутствующая проверка;
патч 14.8.7 устраняет оба варианта.
В образовательных и оборонительных исследовательских целях. Ошибка исправлена в текущих версиях macOS; тестируйте только на машинах, которыми вы владеете.