macOS Kernel & System Extensions

HackTricksのサポート

XNU カーネル

macOSのコアはXNUであり、「X is Not Unix」の略です。このカーネルは基本的にMachマイクロカーネル(後述します)と**Berkeley Software Distribution(BSD)**の要素から構成されています。XNUはまた、I/O Kitというシステムを介してカーネルドライバを提供します。XNUカーネルはDarwinオープンソースプロジェクトの一部であり、そのソースコードは自由にアクセスできます

セキュリティ研究者やUnix開発者の観点から見ると、macOSは、エレガントなGUIと多くのカスタムアプリケーションを備えたFreeBSDシステムにかなり似ていると感じるかもしれません。BSD向けに開発されたほとんどのアプリケーションは、Unixユーザにとって馴染みのあるコマンドラインツールがmacOSにすべて備わっているため、修正を加えることなくmacOSでコンパイルおよび実行できます。ただし、XNUカーネルにはMachが組み込まれているため、従来のUnixライクなシステムとmacOSの間にはいくつかの重要な違いがあり、これらの違いは潜在的な問題を引き起こすか、独自の利点を提供する可能性があります。

XNUのオープンソースバージョン: https://opensource.apple.com/source/xnu/

Mach

MachはUNIX互換のマイクロカーネルであり、その主要な設計原則の1つは、カーネルスペースで実行されるコードの量を最小限に抑え、ファイルシステム、ネットワーキング、I/Oなどの多くの典型的なカーネル機能をユーザレベルのタスクとして実行することです。

XNUでは、Machはプロセッサスケジューリング、マルチタスキング、および仮想メモリ管理など、通常カーネルが処理する多くの重要な低レベル操作を担当しています。

BSD

XNU カーネルはまた、FreeBSDプロジェクトから派生したコードのかなりの量を組み込んでいます。このコードは、Machと同じアドレス空間内でカーネルの一部として実行されます。ただし、XNU内のFreeBSDコードは、Machとの互換性を確保するために変更が必要であるため、元のFreeBSDコードとは大きく異なる場合があります。 FreeBSDは、次のような多くのカーネル操作に貢献しています:

  • プロセス管理

  • シグナル処理

  • ユーザーおよびグループ管理を含む基本的なセキュリティメカニズム

  • システムコールインフラストラクチャ

  • TCP/IPスタックおよびソケット

  • ファイアウォールおよびパケットフィルタリング

BSDとMachの相互作用を理解することは複雑であり、それぞれ異なる概念フレームワークを持っているためです。たとえば、BSDはプロセスを基本的な実行単位として使用しますが、Machはスレッドに基づいて動作します。この相違は、XNUにおいて、各BSDプロセスを1つのMachスレッドを含むMachタスクに関連付けることで調整されます。BSDのfork()システムコールが使用されると、カーネル内のBSDコードは、タスクとスレッド構造を作成するためにMach関数を使用します。

さらに、MachとBSDはそれぞれ異なるセキュリティモデルを維持しています:Machのセキュリティモデルはポート権限に基づいており、一方、BSDのセキュリティモデルはプロセス所有権に基づいて動作します。これら2つのモデルの相違は、場合によってはローカル特権昇格の脆弱性を引き起こすことがあります。典型的なシステムコールに加えて、ユーザースペースプログラムがカーネルとやり取りするためのMachトラップも存在します。これらの異なる要素が組み合わさり、macOSカーネルの多面的でハイブリッドなアーキテクチャを形成しています。

I/O Kit - ドライバー

I/O KitはXNUカーネル内のオープンソースのオブジェクト指向デバイスドライバーフレームワークであり、動的にロードされるデバイスドライバを処理します。これにより、多様なハードウェアをサポートするために、カーネルにモジュール化されたコードを即座に追加できます。

macOS IOKit

IPC - プロセス間通信

macOS 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

カーネルキャッシュシンボル

時々、Appleはシンボル付きのカーネルキャッシュをリリースします。https://theapplewiki.comのリンクをたどることで、いくつかのファームウェアにシンボルが付いたものをダウンロードできます。

IPSW

これらはAppleのファームウェアで、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

以下のコマンドを使用して、抽出されたkernelcacheのシンボルを確認できます: nm -a kernelcache.release.iphone14.e | wc -l

これにより、すべての拡張機能または興味を持っている1つを抽出できます:

# 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)をロードすることに非常に制限的であり、そのコードが実行される高い特権のためです。実際、デフォルトではほぼ不可能です(バイパスが見つかる限り)。

macOS Kernel Extensions

macOSシステム拡張機能

macOSはカーネル拡張機能の代わりにシステム拡張機能を作成しました。これにより、開発者はカーネル拡張機能を使用する必要がなくなり、ユーザーレベルのAPIを介してカーネルとやり取りできます。

macOS System Extensions

参考文献

HackTricksのサポート

Last updated