
kfd, short for kernel file descriptor, is a project to read and write kernel memory on Apple devices.
簡単な免責事項:他のデバイスやiOSバージョン向けのオフセットを追加するつもりはありません。
「kfd」は、kernel file descriptor(カーネルファイルディスクリプタ)の略で、Appleデバイスのカーネルメモリを読み書きするためのプロジェクトです。このプロジェクトは、ダングリングPTEを取得するために悪用可能なさまざまな脆弱性を活用します。このダングリングPTEは、以降「PUAFプリミティブ」(physical use-after-free の略)と呼びます。次に、それらの物理ページ内に特定のカーネルオブジェクトを再割り当てし、ダングリングPTEを通じてユーザースペースから直接操作することで、「KRKWプリミティブ」(kernel read/write の略)を達成します。エクスプロイトコードはライブラリ libkfd に完全に含まれていますが、このプロジェクトには iOS および macOS 用のシンプルな実行可能ラッパーも含まれています。libkfdの公開APIは非常に小さく、直感的です:
enum puaf_method {
puaf_physpuppet,
puaf_smith,
puaf_landa,
};
enum kread_method {
kread_kqueue_workloop_ctl,
kread_sem_open,
};
enum kwrite_method {
kwrite_dup,
kwrite_sem_open,
};
u64 kopen(u64 puaf_pages, u64 puaf_method, u64 kread_method, u64 kwrite_method);
void kread(u64 kfd, u64 kaddr, void* uaddr, u64 size);
void kwrite(u64 kfd, void* uaddr, u64 kaddr, u64 size);
void kclose(u64 kfd);
kopen() は、概念的には「kernel file descriptor(カーネルファイルディスクリプタ)」を開きます。以下の4つの引数を取ります:
puaf_pages: ダングリングPTEを持つ物理ページの目標数。puaf_method: PUAFプリミティブを取得するために使用する方法。以下のオプションがあります:
puaf_physpuppet:
puaf_smith:
puaf_landa:
kread_method: 初期の kread() プリミティブを取得するために使用する方法。kwrite_method: 初期の kwrite() プリミティブを取得するために使用する方法。エクスプロイトが成功すると、kopen() は64ビットの不透明なファイルディスクリプタを返します。実際には、これはlibkfdが必要とする構造体へのユーザースペースポインタにすぎません。ただし、その構造体はライブラリの外部からアクセスすべきではないため、不透明な整数として返されます。エクスプロイトが失敗した場合、ライブラリはエラーメッセージを表示し、30秒間スリープしてから、ステータスコード1で終了します。KRKW後にクリーンアップを必要とする一部のPUAFメソッド(例:puaf_smith)では、終了時にカーネルがパニックを起こす可能性があるため、30秒間スリープします。
kread() と kwrite() は、それぞれ copyout() と copyin() のユーザースペース版です。kread_method と kwrite_method のオプションについては、別の 解説記事 で説明されていることに注意してください。さらに、これらのメソッドによって付与される初期プリミティブを使用して、より優れたKRKWプリミティブをブートストラップできます。最後に、kclose() はカーネルファイルディスクリプタを単に閉じます。これらはすべて、最初の引数として kopen() が返す不透明な整数を受け取ります。
Xcodeで、プロジェクトのルートフォルダを開き、iOSデバイスを接続します。
ターミナルで、プロジェクトのルートフォルダに移動します。
必要に応じて、グローバルおよびプロセスごとのファイルディスクリプタ制限を増やすと、特に複数回連続して実行する場合の成功率が向上します。その場合は、コマンド make s を入力し、sudoパスワードを入力してください。
make b を入力します。make r を入力します。make br を入力します。このREADMEでは、kfdプロジェクトの概要を説明しました。PUAFプリミティブが達成されると、残りのエクスプロイトは汎用的になります。そこで、エクスプロイトの共通部分を専用の解説記事にまとめました:
さらに、PUAFプリミティブを達成するために使用される脆弱性固有の部分を、発見時系列順に以下のとおり個別の解説記事に分けました:
ただし、これらの解説記事は、XNU仮想メモリシステムにすでに精通している読者を対象に書かれていることに注意してください。