
iOS 26.6의 tmpfs setxattr 핸들러에서 수정된 PAC diversifier 우회에 대한 개념 증명으로, 사용자 공간에서 취약한 서명 경로에 도달 가능함을 보여줍니다.
구성 요소: XNU VFS — default_setxattr_doubleagent (tmpfs VNOP)
영향: iOS / iPadOS 26.6 (23G71) 및 이전 버전
수정 버전: iOS / iPadOS 26.6.1 (23G83)
유형: xattr 핸들러 포인터 서명의 고정 PAC diversifier
영향: 커널 컨텍스트에서 PC 제어; 커널 쓰기 프리미티브와 결합 시 전체 권한 상승
발견자: Bhaswanth Chigurupati, Billy Jheng Bing Jhong, Pan Zhenpeng (@Peterpan0927) — STAR Labs SG Pte. Ltd.
(Apple 보안 권고 — iOS 26.6.1 참조)
default_setxattr_doubleagent는 tmpfs 파일시스템의 VNOP xattr 핸들러로, xattr 핸들러 함수 포인터를 고정된 컴파일 타임 상수 PAC diversifier #0x307a 로 서명합니다.
; XNU 커널 — default_setxattr_doubleagent (디컴파일됨)
handler_ptr = vnode_operations[VNOP_SETXATTR_SLOT]; // vnop 테이블에서 읽기
signed_ptr = PACDA(handler_ptr, 0x307a); // 고정 diversifier로 서명
... call AUTDA(signed_ptr, 0x307a) → BLR // 인증 후 분기
diversifier가 고정되어 있고 공개적으로 알려져 있기 때문에, 커널 쓰기 프리미티브를 가진 공격자는 다음을 수행할 수 있습니다:
forged = PACIA(shellcode_addr, 0x307a)vnode_operations 테이블의 해당 슬롯에 forged를 기록합니다.setxattr() 호출 → 커널이 shellcode_addr을 실행합니다.iOS 26.6 커널 권한 상승 체인에서:
CVE-2026-64788 (IOGPUFamily UAF) → 커널 읽기/쓰기 프리미티브
CVE-2026-65330 (이 버그) → PC 제어 → root (uid=0)
sign_ptr 프리미티브(diversifier #0x307a를 사용한 PACIA)는 탈옥 POC에서 인라인 ARM64e 어셈블리로 구현됩니다. 커널 읽기/쓰기 프리미티브는 다음 용도로 사용됩니다:
v_op 포인터를 찾습니다.vnode_operations[VNOP_SETXATTR_SLOT]에 기록합니다.setxattr("/tmp/trigger", ...)를 통해 실행을 트리거합니다.독립형 PoC(poc_pac_bypass.c)는 취약한 VNOP 경로를 실행합니다:
/var/root/poc65330_test에 테스트 파일 생성XATTR_NAME="com.apple.poc.cve65330.test"로 setxattr() 호출 → default_setxattr_doubleagent에 도달removexattr() 호출PoC는 PAC 포인터를 위조하거나 커널 데이터를 덮어쓰지 않습니다 — 일반적인 setxattr() syscall을 통해 사용자 공간에서 취약한 #0x307a 서명 경로에 도달할 수 있음을 보여줄 뿐입니다.
/var/root/ 파일 생성을 위한 탈옥 또는 샌드박스 이탈 (setxattr 호출 자체는 모든 프로세스에서 도달 가능 — 파일 경로는 샌드박스에서 쓰기 가능한 위치로 조정 가능)# 독립형 C 바이너리 (프레임워크 불필요)
clang -arch arm64 -o poc poc/poc_pac_bypass.c
# 기기 내 실행용 (서명 포함):
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_pac_bypass.c
codesign -s "Apple Development" poc
고정 diversifier 0x307a는 26.6 (23G71) kernelcache의 디스어셈블리에서 검증되었습니다:
; default_setxattr_doubleagent + 0x?? (근사치)
MOVZ x1, #0x307a ; diversifier 상수
PACDA x0, x1 ; 핸들러 포인터 서명
호출 지점의 해당 AUTDA x0, x1은 동일한 상수를 사용하므로, diversifier 0x307a로 PACIA 위조된 모든 포인터가 성공적으로 인증됨을 확인합니다.
| 날짜 | 이벤트 |
|---|---|
| 2026-08-17 | 수정 사항이 포함된 iOS 26.6.1 릴리스 |
| 2026-08-17 | Apple 보안 권고에 크레딧 게시 |