
Анализ первопричины и PoC достижимости для CVE-2026-64747 — переполнения буфера в расширении ядра AppleAVE2. Включает восстановленный проводной протокол IOKit, математику переполнения и пользовательский PoC, управляющий путём настройки.
Анализ первопричины и proof-of-concept достижимости для macOS по
CVE-2026-64747, переполнению буфера в расширении ядра видеокодера AppleAVE2
(com.apple.driver.AppleAVE2), исправленному в macOS 26.6 (kext 905.40.1).
AppleAVE2 — Воздействие: приложение может выполнить произвольный код с привилегиями ядра. Переполнение буфера при вычислении размера рабочего буфера кодера было устранено улучшенной проверкой границ.
Этот репозиторий документирует полностью реверснутый IOKit wire-протокол
AppleAVE2UserClient (создание сессии → конфигурация → обработка каждого
кадра), точное место переполнения (32-битный калькулятор размера рабочего
буфера LRB в HEVC 10-битном многопроходном пути) и userspace PoC, который
открывает user client, проводит путь конфигурации через стек валидации ядра
и демонстрирует разницу между уязвимой (905.36.1) и исправленной (905.40.1)
сборками.
Уровень (честно): достижимость + полный RE протокола + аналитически доказанная математика переполнения. Не RCE, без демонстрации живого переполнения — лабораторный хост работает на исправленном kext, а аппаратный шлюз возможностей (присутствующий в обеих сборках) отклоняет переполняющие размеры до запуска уязвимого калькулятора. Для срабатывания переполнения нужна цель, чья таблица возможностей допускает требуемые размеры (см. FIRE_READY.md §5-6).
| файл | что это |
|---|
poc_ave2_reach.c | IOKit userspace PoC: открывает AppleAVE2UserClient, создаёт сессию, проводит конфигурацию с реверснутыми структурами. Права не требуются. |
ave2_wire.h | Реверснутый wire-формат: номера селекторов, размеры структур и каждое значимое смещение поля (width/height, encType, views/layers, chroma, bit depth) |
WIRE_FORMAT.md | Справочник по wire-формату: раскладка dispatch-таблицы, особенность PAC, контракты по селекторам |
FIRE_READY.md | Математика переполнения (LRB-калькулятор режима 5), точный вход для его срабатывания, доказательства запуска на пропатченном хосте и оставшиеся неизвестные |
evidence/ | Захват ioreg + журналы ядра с запусков на пропатченном хосте (прохождение стека валидации) |
clang -O0 -g -arch arm64 -framework IOKit -framework CoreFoundation \
-o poc_ave2_reach poc_ave2_reach.c
./poc_ave2_reach # root не требуется; сервис открывается из пользовательского контекста
Кодер AppleAVE2 вычисляет размер рабочего буфера LRB (lookaside reference
buffer) с 32-битной арифметикой и без проверки переполнения. В HEVC
10-битном многопроходном пути (калькулятор вызывается с param_2 = 5)
такие размеры, как 64656×8080 (которые проходят ограничение драйвера
w*h ≤ 0x1FFE0000), делают сумму компонентов 0x80000000 — установлен
знаковый бит. Уязвимый калькулятор возвращает голую 32-битную сумму;
размер далее трактуется как отрицательный, выделяется буфер DART/IOMMU
заниженного размера, и DMA кодера записывает за его пределы → повреждение
кучи ядра/DART → выполнение кода в ядре. Исправленный калькулятор добавляет
проверки знака по каждому компоненту и 64-битную проверку суммы и
регистрирует LRB size overflow.
__const метакласса (строки со
шагом 0x18 = {func, inSize<<32, outSize<<32}, с особенностью PAC-указателя).IOServiceOpen обязательно должен использовать type=1 (type=0 →
создание отклоняется).IOConnectCallAsyncStructMethod (синхронный путь отклоняется на
шлюзе IO_Config:337 до валидации).Для образовательных и защитных исследовательских целей. Баг исправлен в текущей macOS; тестируйте только на оборудовании, которым владеете.