Open Enclave、重大なUse-After-Free脆弱性を0.19.22で修正

概要

Open Enclave SDKのメンテナーは、悪意あるホストがIntel SGXエンクレーブの安全性を破れてしまう3件の深刻なバグを修正しました。最も深刻なのはuse-after-free脆弱性(GHSA-2rx6-6737-vpgh、CVSS 9.3)で、コード実行、メモリ漏えい、封印データ(sealed data)の偽造が可能になります。開発者は直ちにOpen Enclave 0.19.22へ更新し、エンクレーブファイルを再ビルドする必要があります。

重要な理由

Open Enclaveは、Intel SGXなどのハードウェアエンクレーブ向けにプライベートなアプリを構築するためのオープンソースツールです。SGXの脅威モデルでは、攻撃者がホストOSを掌握していても、エンクレーブは自身の鍵とメモリを守らなければなりません。しかし、今回の3件の脆弱性により、悪意あるホストがこの根幹となるハードウェア上の防御を破れてしまいます。

3件はいずれもセキュリティ研究者のredthing1氏が発見し、プロジェクトの開発者に報告しました。公開された報告には、3件すべてについて動作する概念実証(PoC)のエクスプロイトファイルが含まれています。この研究者は、主要な稼働中サービスが使う未改変の署名済みエンクレーブに対しても、重大な脆弱性のPoCを試し、成功させています。現時点で、実環境での攻撃は確認されていません。正確な導入数は非公開ですが、クラウド事業者や企業のチームがLinuxおよびWindowsのホストでこのSDKを利用しています。

攻撃の仕組み

Attesterレジストリのuse-after-free(GHSA-2rx6-6737-vpgh)

1件目のGHSA-2rx6-6737-vpgh(CVSS 9.3)は、トラステッドランタイム内のSGX attesterリストに存在するuse-after-free脆弱性(CWE-416)です。ホストがoe_get_report_v2_ecall()を呼び出すと、エンクレーブはattesterリストを初期化してロックを解放します。その後、オブジェクトをロックしないままプラグインのポインタを参照します。標準のplatform.edlテンプレートがこの呼び出しをインポートしているため、複数スレッドを使うSGXエンクレーブのほぼすべてが影響を受けます。

その結果、悪意あるホストは、参照の直後にレポート用スレッドを一時停止し、別のスレッドでOE_ECALL_DESTRUCTORを実行できます。このデストラクタがattester配列を解放しても、一時停止中のスレッドは古いポインタを保持したままです。続いてホストは別のECALLを開始し、細工した入力で解放済みのヒープメモリを上書きします。get_reportポインタはRBPレジスタのフィールドとオフセット0x28を共有しているため、ホストは呼び出し先をoe_continue_execution()に向けられます。スレッドが再開すると、ホストはエンクレーブのレジスタを掌握し、メモリの読み取り、EGETKEYによる鍵の窃取、SGXレポートの偽造が可能になります。

Collateralのヒープオーバーリードとunsealポリシーの回避

2件目のGHSA-vxrq-p5g4-m499(CVSS 7.1)は、SGXクォート検証のcollateralチェックにおける境界外読み取り(CWE-125)です。OCALLの間、ホストはOE_OKを返しつつ、エンクレーブのバッファサイズより大きい書き込みバイト数を申告できます。この検証の欠落は、7つのcollateralバッファすべてに影響します。oe_create_sgx_endorsements()が未検証のサイズでデータをコピーすると、ヒープバッファを最大200 KiB超えて読み取ってしまいます。PoCはこのバグを利用して65,536バイトのヒープを漏えいさせ、X25519の秘密鍵を盗み出しています。

3件目のGHSA-crp7-6hh4-pgfx(CVSS 7.1)は、oe_unseal()における検証の不備(CWE-345)が原因です。この関数は、データブロブの封印を解除する際、sgx_key_request_t構造体のヘッダーを読み取りますが、key_policyがMRENCLAVEまたはMRSIGNERのいずれかであることを強制していません。key_policyを0に設定すると、同じホスト上の別の悪意あるエンクレーブがEGETKEYを介して全く同じ鍵を導出できます。その結果、標的のエンクレーブが受け入れる封印データを偽造できてしまいます。

影響を受けるバージョン

3件のバグはいずれも、Intel SGXシステム上で動作するOpen Enclave SDKの0.19.22より前のバージョンに影響します。

パッチと緩和策

開発者は3件すべてをOpen Enclaveバージョン0.19.22で修正しました。各エンクレーブファイルは、トラステッドなOpen Enclaveランタイムを直接リンクしています。そのため、ホスト側のSDKパッケージを更新するだけでは、稼働中のアプリは保護されません。チームはOpen Enclave 0.19.22へ更新し、すべてのSGXエンクレーブファイルを再ビルドしたうえで、古いエンクレーブビルドへの信頼を無効化する必要があります。

翻訳元: https://meterpreter.org/open-enclave-use-after-free-ghsa-2rx6-6737-vpgh-fixed/

本記事は meterpreter.org の記事を翻訳・要約したものです。