kfd exploit 활용
felix-pb 에 의해 공개된 kfd 는 kernel file descriptor 의 약자로 애플 단말기의 유저단에서 커널 영역의 메모리를 읽고, 쓰는 것을 목표로 하는 프로젝트입니다.
깃헙에 들어가보면 write up 도 자세히 적어놨는데, 제 레벨로는 읽어도 이해가 안되더군요...😵
https://github.com/felix-pb/kfd
그래도 어떻게 커널과 친해질 수 있을까 고민하던중에 kfund 프로젝트를 발견하였습니다.
원래 kfd 를 사용하려면 단말기의 고유한 offset 들을 직접 찾아내고 소스코드에 적어줘야 하는데, kfund 에서는 dynamic 하게 offset 들을 찾아줍니다. 유용한 api도 많이 제공하고 있습니다.
https://github.com/wh1te4ever/kfund
Jailbreak community 에서 활동하시는 분들 보면 자동으로 엄지척이 올라갑니다. 👍
메모리를 자주 들여다보면 뉴비인 저도 커널과 친숙해지지 않을까 싶어서, kfund 에 frida-gadet 을 삽입하여 kernel memory 를 들여다볼수 있는 툴을 제작하였습니다.
https://github.com/hackcatml/kfd-explorer
kfund 프로젝트에는 "/System/Library/Audio/UISounds/photoShutter.caf" 파일을 숨겨서 아이폰 카메라를 무음으로 만드는 예시가 있는데요. 이것을 한번 따라 해보려고 합니다.
iPhone11, iOS 16.1.1 에서 테스트하였습니다.
"/System/Library/Audio/UISounds/photoShutter.caf" 파일의 vnode 를 구합니다.
vnode는 커널 메모리 영역에 있는 object 로써, 유닉스 파일 인터페이스(open, read, write, close, readdir, etc.)와 소통하는 역할을 한다고 합니다. (https://man.openbsd.org/vnode.9)
해당 vnode 주소로 이동해보면 iocount, usecount, flag 필드가 보입니다. Offsets 탭에서 해당 필드들이 vnode 로부터 얼만큼 떨어져 있는지 확인할 수 있습니다.
vnode 플래그에는 VISSHADOW (0x008000) 라는 값이 있습니다. https://github.com/apple-oss-distributions/xnu/blob/xnu-8792.41.9/bsd/sys/vnode_internal.h#L297
현재 설정되어 있는 플래그 (0x84800) 와 VISSHADOW 플래그 (0x8000) 를 OR 연산한 값을 덮어씌우면 파일에 접근할 수 없게 됩니다.
(0x84800 | 0x8000) --> 0x8c800
kfund 에서는 flag 값을 덮어씌우기 전에 usecount 및 iocount 값을 1씩 증가시킵니다.
usecount 및 iocount 변화 없이 flag만 설정하면 처음에는 카메라가 무음이었다가 몇분 지나면 다시 카메라 음이 살아나더군요.
어쨌든 따라해보겠습니다.
iocount 및 usecount 1씩 증가한 값 kwrite
VISSHADOW 와 OR 연산한 새로운 flag (0x8c800) kwrite
이렇게 설정하면 단말기 재부팅하기 전까지 아이폰 카메라 셔터음이 나지 않습니다.