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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
基本情報
Kernel extensions (Kexts) は パッケージ で、.kext
拡張子を持ち、macOS カーネル空間に直接ロードされることで、主要なオペレーティングシステムに追加機能を提供します。
要件
明らかに、これは非常に強力であるため、カーネル拡張をロードするのは複雑です。カーネル拡張がロードされるために満たすべき 要件 は以下の通りです:
- リカバリーモードに入るとき、カーネル 拡張がロードされることを許可する必要があります:
.png)
- カーネル拡張は カーネルコード署名証明書で署名されている必要があり、これは Appleによってのみ付与されます。誰が会社とその必要性を詳細にレビューします。
- カーネル拡張は ノータライズされている必要があり、Appleはそれをマルウェアのチェックができます。
- 次に、root ユーザーが カーネル拡張をロードできるのは、パッケージ内のファイルが rootに属している必要があります。
- アップロードプロセス中、パッケージは 保護された非rootの場所 に準備される必要があります:
/Library/StagedExtensions
(com.apple.rootless.storage.KernelExtensionManagement
の付与が必要です)。 - 最後に、ロードを試みると、ユーザーは 確認リクエストを受け取ります 。受け入れられた場合、コンピュータは 再起動 されてロードされる必要があります。
ロードプロセス
カタリナでは次のようでした:検証 プロセスは ユーザーランド で行われることに注目するのは興味深いです。しかし、com.apple.private.security.kext-management
の付与を持つアプリケーションのみが カーネルに拡張をロードするよう要求できます:kextcache
、kextload
、kextutil
、kextd
、syspolicyd
kextutil
cli が 拡張のロードのための 検証 プロセスを 開始します
kextd
に Machサービス を使用して送信します。
kextd
は 署名 などのいくつかのことをチェックします
- 拡張が ロードできるかどうかを確認するために
syspolicyd
に話します。
syspolicyd
は、拡張が以前にロードされていない場合、ユーザーにプロンプトを表示します。
syspolicyd
は結果をkextd
に報告します。
kextd
は最終的に カーネルに拡張をロードするよう指示できます
もし kextd
が利用できない場合、kextutil
は同じチェックを実行できます。
列挙 (ロードされた kexts)
# 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
を逆コンパイルするには、それを取得する方法を見つける必要があります。
kernelcache は XNUカーネルの事前コンパイルおよび事前リンクされたバージョンであり、重要なデバイス ドライバー と カーネル拡張 が含まれています。これは 圧縮 形式で保存され、起動プロセス中にメモリに展開されます。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を解凍する:
# 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
フォルダーにアクセスして抽出します。
シンボルを確認するには:
nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
時々、Appleはkernelcacheをsymbols付きでリリースします。これらのページのリンクをたどることで、symbols付きのファームウェアをダウンロードできます。ファームウェアには他のファイルとともにkernelcacheが含まれています。
ファイルをextractするには、まず拡張子を.ipsw
から.zip
に変更し、unzipします。
ファームウェアを抽出すると、kernelcache.release.iphone14
のようなファイルが得られます。これはIMG4形式で、興味深い情報を以下のコマンドで抽出できます:
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
Inspecting kernelcache
カーネルキャッシュにシンボルがあるか確認します。
nm -a kernelcache.release.iphone14.e | wc -l
これで、すべての拡張機能または興味のある拡張機能を抽出できます。
# 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
デバッグ
参考文献
- https://www.makeuseof.com/how-to-enable-third-party-kernel-extensions-apple-silicon-mac/
- https://www.youtube.com/watch?v=hGKOskSiaQo
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。