macOS Kernel Extensions & Debugging

Reading time: 10 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

Kernel extensions (Kexts) は パッケージ で、.kext 拡張子を持ち、macOS カーネル空間に直接ロードされることで、主要なオペレーティングシステムに追加機能を提供します。

要件

明らかに、これは非常に強力であるため、カーネル拡張をロードするのは複雑です。カーネル拡張がロードされるために満たすべき 要件 は以下の通りです:

  • リカバリーモードに入るとき、カーネル 拡張がロードされることを許可する必要があります
  • カーネル拡張は カーネルコード署名証明書で署名されている必要があり、これは Appleによってのみ付与されます。誰が会社とその必要性を詳細にレビューします。
  • カーネル拡張は ノータライズされている必要があり、Appleはそれをマルウェアのチェックができます。
  • 次に、root ユーザーが カーネル拡張をロードできるのは、パッケージ内のファイルが rootに属している必要があります
  • アップロードプロセス中、パッケージは 保護された非rootの場所 に準備される必要があります:/Library/StagedExtensionscom.apple.rootless.storage.KernelExtensionManagement の付与が必要です)。
  • 最後に、ロードを試みると、ユーザーは 確認リクエストを受け取ります 。受け入れられた場合、コンピュータは 再起動 されてロードされる必要があります。

ロードプロセス

カタリナでは次のようでした:検証 プロセスは ユーザーランド で行われることに注目するのは興味深いです。しかし、com.apple.private.security.kext-management の付与を持つアプリケーションのみが カーネルに拡張をロードするよう要求できますkextcachekextloadkextutilkextdsyspolicyd

  1. kextutil cli 拡張のロードのための 検証 プロセスを 開始します
  • kextdMachサービス を使用して送信します。
  1. kextd署名 などのいくつかのことをチェックします
  • 拡張が ロードできるかどうかを確認するために syspolicyd に話します。
  1. syspolicyd は、拡張が以前にロードされていない場合、ユーザーにプロンプトを表示します
  • syspolicyd は結果を kextd に報告します。
  1. kextd は最終的に カーネルに拡張をロードするよう指示できます

もし kextd が利用できない場合、kextutil は同じチェックを実行できます。

列挙 (ロードされた kexts)

bash
# Get loaded kernel extensions
kextstat

# Get dependencies of the kext number 22
kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1

Kernelcache

caution

カーネル拡張は /System/Library/Extensions/ にあることが期待されていますが、このフォルダーに行っても バイナリは見つかりません。これは kernelcache のためであり、.kext を逆コンパイルするには、それを取得する方法を見つける必要があります。

kernelcacheXNUカーネルの事前コンパイルおよび事前リンクされたバージョンであり、重要なデバイス ドライバーカーネル拡張 が含まれています。これは 圧縮 形式で保存され、起動プロセス中にメモリに展開されます。kernelcache は、カーネルと重要なドライバーの実行準備が整ったバージョンを利用することで 起動時間を短縮 し、起動時にこれらのコンポーネントを動的に読み込みおよびリンクするのにかかる時間とリソースを削減します。

Local Kernelcache

iOS では /System/Library/Caches/com.apple.kernelcaches/kernelcache にあり、macOS では次のコマンドで見つけることができます: find / -name "kernelcache" 2>/dev/null
私のmacOSのケースでは、次の場所で見つけました:

  • /System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache

IMG4

IMG4ファイル形式は、AppleがiOSおよびmacOSデバイスでファームウェアコンポーネント(kernelcache など)を安全に 保存および検証 するために使用するコンテナ形式です。IMG4形式にはヘッダーと、実際のペイロード(カーネルやブートローダーなど)、署名、および一連のマニフェストプロパティをカプセル化するいくつかのタグが含まれています。この形式は暗号的検証をサポートしており、デバイスがファームウェアコンポーネントを実行する前にその真正性と整合性を確認できるようにします。

通常、以下のコンポーネントで構成されています:

  • ペイロード (IM4P):
  • よく圧縮されている (LZFSE4, LZSS, …)
  • オプションで暗号化されている
  • マニフェスト (IM4M):
  • 署名を含む
  • 追加のキー/バリューディクショナリ
  • 復元情報 (IM4R):
  • APNonce としても知られる
  • 一部の更新の再生を防ぐ
  • OPTIONAL: 通常は見つからない

Kernelcacheを解凍する:

bash
# img4tool (https://github.com/tihmstar/img4tool
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

ダウンロード

https://github.com/dortania/KdkSupportPkg/releases では、すべてのカーネルデバッグキットを見つけることができます。ダウンロードして、マウントし、Suspicious Package ツールで開き、.kext フォルダーにアクセスして抽出します。

シンボルを確認するには:

bash
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l

時々、Appleはkernelcachesymbols付きでリリースします。これらのページのリンクをたどることで、symbols付きのファームウェアをダウンロードできます。ファームウェアには他のファイルとともにkernelcacheが含まれています。

ファイルをextractするには、まず拡張子を.ipswから.zipに変更し、unzipします。

ファームウェアを抽出すると、kernelcache.release.iphone14のようなファイルが得られます。これはIMG4形式で、興味深い情報を以下のコマンドで抽出できます:

pyimg4:

bash
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

img4tool:

bash
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e

Inspecting kernelcache

カーネルキャッシュにシンボルがあるか確認します。

bash
nm -a kernelcache.release.iphone14.e | wc -l

これで、すべての拡張機能または興味のある拡張機能抽出できます。

bash
# 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

デバッグ

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする