
CVE-2022-32832の概念実証エクスプロイトと技術分析。これはmacOS上のApple APFSカーネルのレースコンディションであり、権限昇格を可能にします。
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がに設定される前に(を解放するメソッド)を呼び出すことができるからです。
NULLAppleAPFSContainer::deltaCreateTeardowndelta_create_ctx_tこれをトリガーするには、攻撃者はまず外部メソッドAppleAPFSUserClient::methodDeltaCreatePrepare(セレクタ36)を使用してユーザークライアント上に「デルタ作成コンテキスト」を作成する必要があります。これにはアンマウントされたボリュームが必要であり、通常のエクスプロイトの流れでは、攻撃者は外部メソッドAppleAPFSUserClient::methodVolumeCreateを使用してターゲットボリュームも作成する必要があります。これはスーパーユーザー権限を必要とします。このため、Appleはこの脆弱性の影響を次のように説明しました:
An app with root privileges may be able to execute arbitrary code with kernel privileges
このリポジトリには、カーネルオブジェクトの参照カウントをアンダーフローさせることで、脆弱なmacOSバージョンでカーネルパニックを引き起こす概念実証エクスプロイトが含まれています。前述の理由により、このエクスプロイトはrootとして実行する必要があります。
CVE-2022-32832は、脆弱なコードを保護するためにAppleAPFSUserClient::methodDeltaCreateFinalizeにIOLockLockおよびIOLockUnlock呼び出しを追加することで修正されました。