macOS Kernel & System Extensions

Support HackTricks

XNU Kernel

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

セキュリティ研究者やUnix開発者の視点から見ると、macOSFreeBSDシステムに非常に似ていると感じるかもしれません。洗練されたGUIと多数のカスタムアプリケーションを備えています。BSD用に開発されたほとんどのアプリケーションは、macOS上で修正なしにコンパイルして実行できます。Unixユーザーに馴染みのあるコマンドラインツールはすべて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

macOSカーネル拡張

macOSはカーネル拡張(.kext)をロードすることに対して非常に制限が厳しいです。実際、デフォルトではバイパスが見つからない限り、ほぼ不可能です。

次のページでは、macOSがkernelcache内にロードする.kextを回復する方法も見ることができます:

macOS Kernel Extensions

macOSシステム拡張

カーネル拡張の代わりに、macOSはシステム拡張を作成しました。これにより、カーネルと相互作用するためのユーザーレベルのAPIが提供されます。この方法により、開発者はカーネル拡張を使用せずに済みます。

macOS System Extensions

参考文献

Support HackTricks

Last updated