
kfd, short for kernel file descriptor, is a project to read and write kernel memory on Apple devices.
빠른 고지: 저는 다른 기기 및 iOS 버전에 대한 오프셋을 추가할 의도가 없습니다.
kfd는 커널 파일 디스크립터(kernel file descriptor)의 약자로, Apple 기기에서 커널 메모리를 읽고 쓰기 위한 프로젝트입니다. 이 프로젝트는 댕글링 PTE를 얻기 위해 악용될 수 있는 다양한 취약점을 활용하며, 이를 PUAF 프리미티브(physical use-after-free의 약자)라고 부릅니다. 그런 다음 해당 물리 페이지 내부에 특정 커널 객체를 재할당하고, 댕글링 PTE를 통해 사용자 공간에서 직접 조작하여 KRKW 프리미티브(kernel read/write의 약자)를 달성합니다. 익스플로잇 코드는 libkfd 라이브러리에 완전히 포함되어 있지만, 이 프로젝트에는 iOS 및 macOS용 간단한 실행 래퍼도 포함되어 있습니다. libkfd의 공개 API는 상당히 작고 직관적입니다:
enum puaf_method {
puaf_physpuppet,
puaf_smith,
puaf_landa,
};
enum kread_method {
kread_kqueue_workloop_ctl,
kread_sem_open,
};
enum kwrite_method {
kwrite_dup,
kwrite_sem_open,
};
u64 kopen(u64 puaf_pages, u64 puaf_method, u64 kread_method, u64 kwrite_method);
void kread(u64 kfd, u64 kaddr, void* uaddr, u64 size);
void kwrite(u64 kfd, void* uaddr, u64 kaddr, u64 size);
void kclose(u64 kfd);
kopen()은 개념적으로 "커널 파일 디스크립터"를 엽니다. 다음 4개의 인자를 받습니다:
puaf_pages: 댕글링 PTE가 있는 물리 페이지의 목표 개수.puaf_method: PUAF 프리미티브를 얻는 데 사용되는 방법. 옵션은 다음과 같습니다:
puaf_physpuppet:
puaf_smith:
puaf_landa:
kread_method: 초기 kread() 프리미티브를 얻는 데 사용되는 방법.kwrite_method: 초기 kwrite() 프리미티브를 얻는 데 사용되는 방법.익스플로잇이 성공하면 kopen()은 64비트 불투명 파일 디스크립터를 반환합니다. 실제로 이 값은
libkfd에 필요한 구조체를 가리키는 사용자 공간 포인터일 뿐입니다. 그러나 해당 구조체는 라이브러리
외부에서 접근하면 안 되므로 불투명 정수로 반환됩니다. 익스플로잇이 실패하면 라이브러리는 오류
메시지를 출력하고 30초 동안 대기한 후 상태 코드 1로 종료됩니다. KRKW 이후 약간의 정리가 필요한
특정 PUAF 방법(예: puaf_smith)의 경우, 종료 시 커널이 패닉할 수 있으므로 30초간 대기하는
것입니다.
kread()와 kwrite()는 각각 copyout() 및 copyin()의 사용자 공간에 해당하는 기능입니다.
참고로 kread_method 및 kwrite_method의 옵션은 별도의
분석 문서에 설명되어 있습니다. 또한 이러한 방법으로 얻은 초기
프리미티브는 더 나은 KRKW 프리미티브를 구축하는 데 사용할 수 있습니다. 마지막으로 kclose()는
커널 파일 디스크립터를 단순히 닫습니다. 이 모든 함수는 첫 번째 인자로 kopen()이 반환한 불투명
정수를 받습니다.
Xcode에서 프로젝트의 루트 폴더를 열고 iOS 기기를 연결하세요.
터미널에서 프로젝트의 루트 폴더로 이동합니다.
선택적으로, 전역 및 프로세스별 파일 디스크립터 제한을 늘리면 특히 연속으로 여러 번 실행할 때
성공률이 향상되므로 make s 명령을 입력하고 sudo 비밀번호를 입력하세요.
make b 명령을 입력하세요.make r 명령을 입력하세요.make br 명령을 입력하세요.이 README는 kfd 프로젝트에 대한 높은 수준의 개요를 제시했습니다. PUAF 프리미티브가 달성되면 나머지 익스플로잇은 공통적입니다. 따라서 익스플로잇의 공통 부분을 전용 분석 문서로 옮겼습니다:
또한 PUAF 프리미티브를 달성하는 데 사용된 익스플로잇의 취약점별 부분을 별도의 분석 문서로 나누었으며, 아래에 발견 순서대로 나열했습니다:
그러나 이러한 분석 문서는 XNU 가상 메모리 시스템에 이미 익숙한 독자를 대상으로 작성되었음을 유의하세요.