macOS Kernel & System Extensions

htARTE (HackTricks AWS Red Team Expert)로부터 AWS 해킹을 제로부터 전문가까지 배우세요 htARTE (HackTricks AWS Red Team Expert)!

HackTricks를 지원하는 다른 방법:

XNU 커널

macOS의 핵심은 XNU로, "X is Not Unix"의 약자입니다. 이 커널은 기본적으로 Mach 마이크로커널(나중에 설명됨)과 **버클리 소프트웨어 배포(BSD)**의 요소로 구성됩니다. XNU는 또한 I/O Kit이라는 시스템을 통해 커널 드라이버에 대한 플랫폼을 제공합니다. XNU 커널은 Darwin 오픈 소스 프로젝트의 일부이며, 소스 코드가 자유롭게 접근 가능합니다.

보안 연구원이나 Unix 개발자의 관점에서 보면, macOS는 우아한 GUI와 다양한 사용자 정의 애플리케이션을 갖춘 FreeBSD 시스템과 매우 유사할 수 있습니다. BSD용으로 개발된 대부분의 애플리케이션은 수정 없이 macOS에서 컴파일 및 실행될 수 있습니다. Unix 사용자에게 익숙한 명령줄 도구들이 macOS에 모두 포함되어 있기 때문입니다. 그러나 XNU 커널에는 Mach가 포함되어 있기 때문에 전통적인 Unix와 macOS 간에는 몇 가지 중요한 차이가 있으며, 이러한 차이로 인해 잠재적인 문제가 발생하거나 독특한 이점을 제공할 수 있습니다.

XNU의 오픈 소스 버전: https://opensource.apple.com/source/xnu/

Mach

Mach는 UNIX 호환성을 갖춘 마이크로커널입니다. 그 중요한 설계 원칙 중 하나는 커널 공간에서 실행되는 코드 양을 최소화하고 파일 시스템, 네트워킹 및 I/O와 같은 일반적인 커널 기능을 사용자 수준 작업으로 실행할 수 있도록 하는 것이었습니다.

XNU에서 Mach는 프로세서 스케줄링, 멀티태스킹 및 가상 메모리 관리와 같은 많은 중요한 저수준 작업을 담당합니다.

BSD

XNU 커널은 또한 FreeBSD 프로젝트에서 파생된 상당한 양의 코드를 통합합니다. 이 코드는 Mach와 함께 커널의 일부로 실행됩니다. 그러나 XNU 내의 FreeBSD 코드는 Mach와의 호환성을 보장하기 위해 수정이 필요했기 때문에 원래 FreeBSD 코드와 상당히 다를 수 있습니다. FreeBSD는 다음을 포함한 많은 커널 작업에 기여합니다:

  • 프로세스 관리

  • 시그널 처리

  • 사용자 및 그룹 관리를 포함한 기본 보안 메커니즘

  • 시스템 콜 인프라

  • TCP/IP 스택 및 소켓

  • 방화벽 및 패킷 필터링

BSD와 Mach 간의 상호 작용을 이해하는 것은 그들의 다른 개념적 프레임워크 때문에 복잡할 수 있습니다. 예를 들어, BSD는 프로세스를 기본 실행 단위로 사용하고, Mach는 스레드를 기반으로 작동합니다. 이 불일치는 XNU에서 각 BSD 프로세스를 정확히 하나의 Mach 스레드를 포함하는 Mach 태스크에 연결함으로써 조화롭게 해결됩니다. BSD의 fork() 시스템 호출을 사용할 때, 커널 내의 BSD 코드는 Mach 함수를 사용하여 태스크 및 스레드 구조를 생성합니다.

또한, Mach와 BSD는 각각 다른 보안 모델을 유지: Mach의 보안 모델은 포트 권한을 기반으로 하며, BSD의 보안 모델은 프로세스 소유권을 기반으로 작동합니다. 이 두 모델 간의 불일치로 인해 로컬 권한 상승 취약점이 가끔 발생하기도 했습니다. 일반 시스템 호출 외에도 Mach 트랩이 있어 사용자 공간 프로그램이 커널과 상호 작용할 수 있습니다. 이러한 다른 요소들이 함께 조합되어 macOS 커널의 다면적이고 하이브리드 아키텍처를 형성합니다.

I/O Kit - 드라이버

I/O Kit은 XNU 커널의 오픈 소스, 객체 지향 장치 드라이버 프레임워크로, 동적으로 로드되는 장치 드라이버를 처리합니다. 이를 통해 다양한 하드웨어를 지원하기 위해 커널에 모듈식 코드를 실시간으로 추가할 수 있습니다.

pagemacOS IOKit

IPC - 프로세스 간 통신

pagemacOS IPC - Inter Process Communication

커널캐시

커널캐시는 XNU 커널의 미리 컴파일되고 미리 연결된 버전으로, 필수 장치 드라이버커널 확장을 포함합니다. 이는 압축된 형식으로 저장되며 부팅 프로세스 중에 메모리로 압축 해제됩니다. 커널캐시는 부팅 시 동적으로 이러한 구성 요소를 로드하고 연결하는 데 소요되는 시간과 리소스를 줄여줌으로써 빠른 부팅 시간을 지원합니다.

iOS에서는 **/System/Library/Caches/com.apple.kernelcaches/kernelcache**에 위치하며 macOS에서는 find / -name kernelcache 2>/dev/null 또는 **mdfind kernelcache | grep kernelcache**로 찾을 수 있습니다.

**kextstat**를 실행하여 로드된 커널 확장을 확인할 수 있습니다.

IMG4

IMG4 파일 형식은 Apple이 iOS 및 macOS 장치에서 펌웨어 구성 요소(예: 커널캐시)를 안전하게 저장하고 확인하기 위해 사용하는 컨테이너 형식입니다. IMG4 형식에는 헤더와 실제 페이로드(커널 또는 부트로더와 같은)를 포함하는 여러 태그가 포함되어 있으며, 서명, 일련의 매니페스트 속성을 포함합니다. 이 형식은 암호화 검증을 지원하여 장치가 펌웨어 구성 요소를 실행하기 전에 그 신뢰성과 무결성을 확인할 수 있습니다.

일반적으로 다음 구성 요소로 구성됩니다:

  • 페이로드 (IM4P):

  • 종종 압축됨 (LZFSE4, LZSS 등)

  • 선택적으로 암호화됨

  • 매니페스트 (IM4M):

  • 서명 포함

  • 추가 키/값 사전

  • 복원 정보 (IM4R):

  • APNonce로도 알려짐

  • 일부 업데이트의 재생 방지

  • 선택 사항: 일반적으로 이것은 찾을 수 없습니다

커널캐시를 압축 해제하세요:

# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

커널캐시 심볼

가끔 애플은 심볼이 포함된 커널캐시를 공개합니다. https://theapplewiki.com의 링크를 따라가면 심볼이 포함된 펌웨어를 다운로드할 수 있습니다.

IPSW

이는 https://ipsw.me/에서 다운로드할 수 있는 애플 펌웨어입니다. 다른 파일들 중에 커널캐시가 포함되어 있습니다. 파일을 추출하려면 그냥 압축을 푸세요.

펌웨어를 추출한 후에는 다음과 같은 파일을 얻게 됩니다: kernelcache.release.iphone14. 이는 IMG4 형식이며, 다음과 같은 명령으로 흥미로운 정보를 추출할 수 있습니다:

pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

다음 명령을 사용하여 추출된 커널캐시에 대한 심볼을 확인할 수 있습니다: nm -a kernelcache.release.iphone14.e | wc -l

이제 우리는 모든 익스텐션 또는 관심 있는 하나를 추출할 수 있습니다:

# List all extensions
kextex -l kernelcache.release.iphone14.e
## Extract com.apple.security.sandbox
kextex -e com.apple.security.sandbox kernelcache.release.iphone14.e

# Extract all
kextex_all kernelcache.release.iphone14.e

# Check the extension for symbols
nm -a binaries/com.apple.security.sandbox | wc -l

macOS 커널 확장자

macOS는 코드가 실행될 때 높은 권한으로 실행되기 때문에 커널 확장자(.kext)를 로드하는 것에 매우 제한적입니다. 사실, 기본적으로는 사실상 불가능합니다(우회 방법을 찾지 않는 이상).

pagemacOS Kernel Extensions

macOS 시스템 확장자

커널 확장자 대신 macOS는 시스템 확장자를 만들었는데, 이는 사용자 수준 API를 제공하여 커널과 상호 작용할 수 있습니다. 이렇게 함으로써 개발자는 커널 확장자를 사용하지 않을 수 있습니다.

pagemacOS System Extensions

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 되는 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

Last updated