macOS Kernel & System Extensions

Support HackTricks

XNU Kernel

macOS의 핵심은 XNU로, "X는 유닉스가 아니다"를 의미합니다. 이 커널은 기본적으로 Mach 마이크로커널(후에 논의될 예정)과 **버클리 소프트웨어 배포(BSD)**의 요소로 구성되어 있습니다. XNU는 또한 I/O Kit이라는 시스템을 통해 커널 드라이버를 위한 플랫폼을 제공합니다. XNU 커널은 다윈 오픈 소스 프로젝트의 일부로, 소스 코드는 자유롭게 접근할 수 있습니다.

보안 연구자나 유닉스 개발자의 관점에서 macOS는 우아한 GUI와 다양한 맞춤형 애플리케이션을 갖춘 FreeBSD 시스템과 매우 유사하게 느껴질 수 있습니다. BSD를 위해 개발된 대부분의 애플리케이션은 수정 없이 macOS에서 컴파일되고 실행될 수 있으며, 유닉스 사용자에게 친숙한 명령줄 도구가 모두 macOS에 존재합니다. 그러나 XNU 커널이 Mach을 포함하고 있기 때문에 전통적인 유닉스 유사 시스템과 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 - Drivers

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

macOS IOKit

IPC - Inter Process Communication

macOS IPC - Inter Process Communication

macOS Kernel Extensions

macOS는 커널 확장(.kext)을 로드하는 데 매우 제한적입니다. 이는 코드가 높은 권한으로 실행되기 때문입니다. 실제로 기본적으로 우회 방법이 발견되지 않는 한 거의 불가능합니다.

다음 페이지에서는 macOS가 kernelcache 내에서 로드하는 .kext를 복구하는 방법도 볼 수 있습니다:

macOS Kernel Extensions

macOS System Extensions

커널 확장을 사용하는 대신 macOS는 커널과 상호작용하기 위한 사용자 수준 API를 제공하는 시스템 확장을 만들었습니다. 이렇게 하면 개발자는 커널 확장을 사용할 필요가 없습니다.

macOS System Extensions

References

Support HackTricks

Last updated