Information Security/iOS

kfd exploit 활용

hackcatml 2024. 2. 9. 22:04
반응형

felix-pb 에 의해 공개된 kfd 는 kernel file descriptor 의 약자로 애플 단말기의 유저단에서 커널 영역의 메모리를 읽고, 쓰는 것을 목표로 하는 프로젝트입니다.

깃헙에 들어가보면 write up 도 자세히 적어놨는데, 제 레벨로는 읽어도 이해가 안되더군요...😵

https://github.com/felix-pb/kfd

 

GitHub - felix-pb/kfd: kfd, short for kernel file descriptor, is a project to read and write kernel memory on Apple devices.

kfd, short for kernel file descriptor, is a project to read and write kernel memory on Apple devices. - GitHub - felix-pb/kfd: kfd, short for kernel file descriptor, is a project to read and write ...

github.com

 

 

그래도 어떻게 커널과 친해질 수 있을까 고민하던중에 kfund 프로젝트를 발견하였습니다.

원래 kfd 를 사용하려면 단말기의 고유한 offset 들을 직접 찾아내고 소스코드에 적어줘야 하는데, kfund 에서는 dynamic 하게 offset 들을 찾아줍니다. 유용한 api도 많이 제공하고 있습니다.

https://github.com/wh1te4ever/kfund

 

GitHub - wh1te4ever/kfund: kfund, short for my fun with kfd exploit.

kfund, short for my fun with kfd exploit. Contribute to wh1te4ever/kfund development by creating an account on GitHub.

github.com

 

 

Jailbreak community 에서 활동하시는 분들 보면 자동으로 엄지척이 올라갑니다. 👍

메모리를 자주 들여다보면 뉴비인 저도 커널과 친숙해지지 않을까 싶어서, kfund 에 frida-gadet 을 삽입하여 kernel memory 를 들여다볼수 있는 툴을 제작하였습니다.

https://github.com/hackcatml/kfd-explorer

 

GitHub - hackcatml/kfd-explorer: iOS kernel memory explorer

iOS kernel memory explorer. Contribute to hackcatml/kfd-explorer development by creating an account on GitHub.

github.com

 

 

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

이렇게 설정하면 단말기 재부팅하기 전까지 아이폰 카메라 셔터음이 나지 않습니다.

 

 

 

 

반응형