hacktricks/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md

12 KiB
Raw Blame History

macOSカーネルとシステム拡張

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

XNUカーネル

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

セキュリティ研究者やUnix開発者の観点から見ると、macOSはエレガントなGUIと多数のカスタムアプリケーションを備えたFreeBSDシステムに非常に似ていると感じるかもしれません。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は、次のような多くのカーネル操作に貢献しています。

  • プロセス管理
  • シグナル処理
  • ユーザーとグループの管理を含む基本的なセキュリティメカニズム
  • システムコールインフラストラクチャ
  • 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カーネル内のオープンソースのオブジェクト指向のデバイスドライバフレームワークであり、動的にロードされるデバイスドライバの追加と管理を担当しています。これらのドライバにより、異なるハードウェアとの使用に動的にカーネルにモジュラーコードを追加することができます。これらのドライバは次の場所にあります。

  • /System/Library/Extensions
  • OS Xオペレーティングシステムに組み込まれたKEXTファイル。
  • /Library/Extensions
  • サードパーティのソフトウェアによってインストールされたKEXTファイル
#Use kextstat to print the loaded drivers
kextstat
Executing: /usr/bin/kmutil showloaded
No variant specified, falling back to release
Index Refs Address            Size       Wired      Name (Version) UUID <Linked Against>
1  142 0                  0          0          com.apple.kpi.bsd (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
2   11 0                  0          0          com.apple.kpi.dsep (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
3  170 0                  0          0          com.apple.kpi.iokit (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
4    0 0                  0          0          com.apple.kpi.kasan (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
5  175 0                  0          0          com.apple.kpi.libkern (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
6  154 0                  0          0          com.apple.kpi.mach (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
7   88 0                  0          0          com.apple.kpi.private (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
8  106 0                  0          0          com.apple.kpi.unsupported (20.5.0) 52A1E876-863E-38E3-AC80-09BBAB13B752 <>
9    2 0xffffff8003317000 0xe000     0xe000     com.apple.kec.Libm (1) 6C1342CC-1D74-3D0F-BC43-97D5AD38200A <5>
10   12 0xffffff8003544000 0x92000    0x92000    com.apple.kec.corecrypto (11.1) F5F1255F-6552-3CF4-A9DB-D60EFDEB4A9A <8 7 6 5 3 1>

9までの番号のドライバは、アドレス0にロードされます。これは、それらが実際のドライバではなく、カーネルの一部であり、アンロードすることはできないことを意味します。

特定の拡張機能を見つけるためには、次の方法を使用できます:

kextfind -bundle-id com.apple.iokit.IOReportFamily #Search by full bundle-id
kextfind -bundle-id -substring IOR #Search by substring in bundle-id

カーネル拡張機能の読み込みとアンロードは次のように行います:

kextload com.apple.iokit.IOReportFamily
kextunload com.apple.iokit.IOReportFamily

IPC - プロセス間通信

{% content-ref url="macos-ipc-inter-process-communication/" %} macos-ipc-inter-process-communication {% endcontent-ref %}

macOS カーネル拡張

macOSは、コードが実行される高い特権のため、カーネル拡張.kextを読み込むことが非常に制限されています。実際には、デフォルトではほぼ不可能ですバイパスが見つかる場合を除く

{% content-ref url="macos-kernel-extensions.md" %} macos-kernel-extensions.md {% endcontent-ref %}

macOS システム拡張

macOSは、カーネル拡張の代わりにシステム拡張を作成しました。これにより、開発者はカーネル拡張を使用する必要がなくなります。

{% content-ref url="macos-system-extensions.md" %} macos-system-extensions.md {% endcontent-ref %}

参考文献

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥