
Análise de causa raiz e PoC de alcançabilidade para CVE-2026-64747, um estouro de buffer na extensão de kernel AppleAVE2. Inclui protocolo de fio IOKit revertido, matemática de estouro e um PoC em userspace que aciona o caminho de configuração.
Análise de causa-raiz e prova de conceito de alcançabilidade para macOS do
CVE-2026-64747, um estouro de buffer na extensão de kernel do codificador de vídeo
AppleAVE2 (com.apple.driver.AppleAVE2) corrigido no macOS 26.6 (kext 905.40.1).
AppleAVE2 — Impacto: um app pode ser capaz de executar código arbitrário com privilégios de kernel. Um estouro de buffer no cálculo do tamanho do buffer de trabalho do codificador foi resolvido com verificação de limites aprimorada.
Este repositório documenta o protocolo de wire IOKit totalmente revertido do
AppleAVE2UserClient (criar sessão → configurar → processamento por quadro), o
local exato do estouro (um calculador de tamanho de buffer de trabalho LRB de 32 bits no
caminho multipass HEVC 10-bit), e um PoC em userspace que abre o user client, conduz
o caminho de configuração pela pilha de validação do kernel e demonstra o
diferencial entre builds vulnerável (905.36.1) e corrigido (905.40.1).
Nível (honesto): alcançabilidade + RE completo do protocolo + matemática de estouro comprovada analiticamente. Não é RCE, nenhum estouro ao vivo demonstrado — o host do laboratório executa o kext corrigido, e uma barreira de capacidade de hardware (presente em ambos os builds) rejeita as dimensões de estouro antes que o calculador vulnerável seja executado. Disparar o estouro exige um alvo cuja tabela de capacidades admita as dimensões necessárias (ver FIRE_READY.md §5-6).
| arquivo | o quê |
|---|---|
poc_ave2_reach.c | PoC em userspace IOKit: abre AppleAVE2UserClient, cria uma sessão, conduz a configuração com as structs revertidas. Nenhuma entitlement necessária. |
ave2_wire.h | O formato de wire revertido: números de seletores, tamanhos de structs e cada deslocamento de campo que importa (largura/altura, encType, views/layers, chroma, profundidade de bits) |
WIRE_FORMAT.md | Referência do formato de wire: layout da tabela de dispatch, peculiaridade PAC, contratos por seletor |
FIRE_READY.md | A matemática do estouro (calculador LRB modo-5), a entrada exata para dispará-lo, evidências de execução no host corrigido e as incógnitas restantes |
evidence/ | Captura do ioreg + logs do kernel das execuções no host corrigido (progressão da pilha de validação) |
clang -O0 -g -arch arm64 -framework IOKit -framework CoreFoundation \
-o poc_ave2_reach poc_ave2_reach.c
./poc_ave2_reach # root não é necessário; o serviço abre a partir do contexto do usuário
O codificador do AppleAVE2 calcula um tamanho de buffer de trabalho LRB (lookaside reference buffer)
com aritmética de 32 bits e sem verificação de estouro. No caminho multipass HEVC
10-bit (calculador invocado com param_2 = 5), dimensões como
64656×8080 (que passam pela restrição w*h ≤ 0x1FFE0000 do driver) fazem a
soma de componentes 0x80000000 — bit de sinal definido. O calculador vulnerável retorna
a soma nua de 32 bits; o tamanho é tratado como negativo a jusante, um
buffer DART/IOMMU subdimensionado é alocado, e o DMA do codificador grava além
dele → corrupção de heap/DART do kernel → execução de código no kernel. O calculador
corrigido adiciona verificações de sinal por componente e uma verificação de soma de 64 bits e registra
LRB size overflow.
__const da metaclasse (linhas de
stride 0x18 = {func, inSize<<32, outSize<<32}, com uma peculiaridade de ponteiro PAC).IOServiceOpen deve usar type=1 (type=0 → criação rejeitada).IOConnectCallAsyncStructMethod (o caminho síncrono é rejeitado na
barreira IO_Config:337 antes da validação).Para fins educacionais e de pesquisa defensiva. O bug está corrigido no macOS atual; teste apenas em hardware que você possui.