
iOS 15.6でパッチ適用されたCVE-2022-32832脆弱性の概念実証(PoC)と解説
CVE-2022-32832 は、AppleAPFSUserClient::methodDeltaCreateFinalize 外部メソッド(セレクタ 49)の脆弱性です。以下は修正前の逆コンパイル結果です:
__int64 __cdecl AppleAPFSUserClient::methodDeltaCreateFinalize(AppleAPFSUserClient *this, void *a2, IOExternalMethodArguments *args)
{
void *ctx;
__int64 result;
ctx = this->deltaCreateCtx;
if ( !ctx )
return 0xE00002D8LL;
AppleAPFSContainer::deltaCreateTeardown(ctx);
result = 0LL;
this->deltaCreateCtx = 0LL;
return result;
}
AppleAPFSUserClient::externalMethod は、外部メソッド呼び出しを直列化するための同期手法を一切使用していません。これは、攻撃者が同じユーザークライアント上で AppleAPFSUserClient::methodDeltaCreateFinalize への 2 回の呼び出しを競わせることで、delta_create_ctx_t および関連プロパティを二重解放できる可能性があることを意味します。両方の呼び出しが、this->deltaCreateCtx が NULL に設定される前に AppleAPFSContainer::deltaCreateTeardown(delta_create_ctx_t の解放を担当するメソッド)を呼び出すことができるためです。
これを引き起こすには、攻撃者はまず外部メソッド AppleAPFSUserClient::methodDeltaCreatePrepare(セレクタ 36)を使用して、ユーザークライアント上に「delta create context」を作成する必要があります。このメソッドが機能するにはマウントされていないボリュームが必要なため、通常のエクスプロイトの流れでは、攻撃者は外部メソッド AppleAPFSUserClient::methodVolumeCreate を使用して対象ボリュームも作成する必要があり、これにはスーパーユーザー権限が必要です。このため、Apple はこの脆弱性の影響を次のように説明しています:
ルート権限を持つアプリが、カーネル権限で任意のコードを実行できる可能性があります
このリポジトリには、カーネルオブジェクトの参照カウントをアンダーフローさせることで、影響を受ける macOS バージョンでカーネルパニックを引き起こす、この問題の概念実証(PoC)エクスプロイトが含まれています。上記の理由により、このエクスプロイトは root として実行する必要があります。
CVE-2022-32832 は、脆弱なコードを保護するために IOLockLock および IOLockUnlock の呼び出しを AppleAPFSUserClient::methodDeltaCreateFinalize に追加することで修正されました。