macOS Kernel Extensions & Debugging
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)
カーネル拡張(Kext)は、.kext
拡張子を持つ パッケージ であり、macOS カーネル空間に直接ロードされ、主要なオペレーティングシステムに追加機能を提供します。
明らかに、これは非常に強力であるため、カーネル拡張をロードするのは複雑です。カーネル拡張がロードされるために満たすべき 要件 は次のとおりです:
リカバリモードに入るとき、カーネル 拡張がロードされることを許可する必要があります:
カーネル拡張は カーネルコード署名証明書で署名されている必要があり、これは 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
は同じチェックを実行できます。
カーネル拡張は /System/Library/Extensions/
にあることが期待されていますが、このフォルダーに行っても バイナリは見つかりません。これは kernelcache のためであり、.kext
を逆コンパイルするには、それを取得する方法を見つける必要があります。
kernelcache は XNUカーネルの事前コンパイルおよび事前リンクされたバージョンであり、重要なデバイス ドライバー と カーネル拡張 が含まれています。これは 圧縮 形式で保存され、起動プロセス中にメモリに展開されます。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 ファイル形式は、Apple が iOS および macOS デバイスで ファームウェア コンポーネント(kernelcache など)を安全に 保存および検証 するために使用するコンテナ形式です。IMG4 形式にはヘッダーと、実際のペイロード(カーネルやブートローダーなど)、署名、および一連のマニフェストプロパティをカプセル化するいくつかのタグが含まれています。この形式は暗号的検証をサポートしており、デバイスがファームウェアコンポーネントを実行する前に、その真正性と整合性を確認できるようにします。
通常、次のコンポーネントで構成されています:
ペイロード (IM4P):
よく圧縮されています (LZFSE4, LZSS, …)
オプションで暗号化されています
マニフェスト (IM4M):
署名を含みます
追加のキー/値辞書
復元情報 (IM4R):
APNonce としても知られています
一部の更新の再生を防ぎます
OPTIONAL: 通常は見つかりません
カーネルキャッシュを解凍する:
https://github.com/dortania/KdkSupportPkg/releases では、すべてのカーネルデバッグキットを見つけることができます。ダウンロードして、マウントし、Suspicious Package ツールで開き、.kext
フォルダーにアクセスして抽出します。
シンボルを確認するには:
時々、Appleはkernelcacheをsymbols付きでリリースします。これらのページのリンクに従って、symbols付きのファームウェアをダウンロードできます。ファームウェアには他のファイルとともにkernelcacheが含まれています。
ファイルをextractするには、まず拡張子を.ipsw
から.zip
に変更し、unzipします。
ファームウェアを抽出すると、kernelcache.release.iphone14
のようなファイルが得られます。これはIMG4形式で、次のコマンドで興味深い情報を抽出できます:
カーネルキャッシュにシンボルがあるか確認します。
これで、すべての拡張機能または興味のあるものを抽出できます:
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)