macOS Kernel & System Extensions
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 IOKitIPC - プロセス間通信
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としても知られています
一部の更新の再生を防止します
オプション:通常、これは見つかりません
カーネルキャッシュを展開する:
カーネルキャッシュシンボル
時々、Appleはシンボル付きのカーネルキャッシュをリリースします。https://theapplewiki.comのリンクをたどることで、いくつかのファームウェアにシンボルが付いたものをダウンロードできます。
IPSW
これらはAppleのファームウェアで、https://ipsw.me/からダウンロードできます。他のファイルの中にはカーネルキャッシュが含まれています。 ファイルを抽出するには、単に解凍するだけです。
ファームウェアを抽出した後、次のようなファイルが得られます: kernelcache.release.iphone14
。これはIMG4形式で、次のコマンドで興味深い情報を抽出できます:
以下のコマンドを使用して、抽出されたkernelcacheのシンボルを確認できます: nm -a kernelcache.release.iphone14.e | wc -l
これにより、すべての拡張機能または興味を持っている1つを抽出できます:
macOSカーネル拡張機能
macOSはカーネル拡張機能(.kext)をロードすることに非常に制限的であり、そのコードが実行される高い特権のためです。実際、デフォルトではほぼ不可能です(バイパスが見つかる限り)。
macOS Kernel ExtensionsmacOSシステム拡張機能
macOSはカーネル拡張機能の代わりにシステム拡張機能を作成しました。これにより、開発者はカーネル拡張機能を使用する必要がなくなり、ユーザーレベルのAPIを介してカーネルとやり取りできます。
macOS System Extensions参考文献
Last updated