macOS Kernel & System Extensions
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
macOSのコアはXNUであり、「X is Not Unix」の略です。このカーネルは基本的にMachマイクロカーネル(後で説明します)と**Berkeley Software Distribution(BSD)**の要素で構成されています。XNUはまた、I/O Kitというシステムを介してカーネルドライバのプラットフォームを提供します。XNUカーネルはDarwinオープンソースプロジェクトの一部であり、そのソースコードは自由にアクセス可能です。
セキュリティ研究者やUnix開発者の視点から見ると、macOSはFreeBSDシステムに非常に似ていると感じるかもしれません。洗練されたGUIと多数のカスタムアプリケーションがあります。BSD用に開発されたほとんどのアプリケーションは、macOS上で修正なしにコンパイルして実行できます。Unixユーザーに馴染みのあるコマンドラインツールはすべてmacOSに存在します。しかし、XNUカーネルがMachを組み込んでいるため、従来のUnixライクなシステムとmacOSの間にはいくつかの重要な違いがあり、これらの違いが潜在的な問題を引き起こしたり、独自の利点を提供したりする可能性があります。
XNUのオープンソース版: https://opensource.apple.com/source/xnu/
MachはUNIX互換に設計されたマイクロカーネルです。その主要な設計原則の1つは、カーネル空間で実行されるコードの量を最小限に抑え、ファイルシステム、ネットワーキング、I/Oなどの多くの典型的なカーネル機能をユーザーレベルのタスクとして実行できるようにすることでした。
XNUでは、Machはカーネルが通常処理する多くの重要な低レベル操作、例えばプロセッサスケジューリング、マルチタスク、仮想メモリ管理を担当しています。
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は、XNUカーネル内のオープンソースのオブジェクト指向デバイスドライバフレームワークであり、動的にロードされるデバイスドライバを処理します。これにより、さまざまなハードウェアをサポートするために、カーネルにモジュールコードをその場で追加できます。
macOSはカーネル拡張(.kext)をロードすることに非常に制限があります。これは、コードが高い特権で実行されるためです。実際、デフォルトではバイパスが見つからない限り、ほぼ不可能です。
次のページでは、macOSがkernelcache内にロードする.kext
を回復する方法も見ることができます:
カーネル拡張の代わりに、macOSはシステム拡張を作成しました。これにより、カーネルと相互作用するためのユーザーレベルのAPIが提供されます。この方法で、開発者はカーネル拡張を使用することを避けることができます。
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)