Cranelift モジュールにおけるコード生成プロセスの欠陥によるメモリアクセス

Fastly のセキュリティリサーチチーム, Fastly
Compute@Edge をご利用のお客様が使用している WebAssembly モジュールの構築に用いられる Cranelift x64 バックエンドの 0.73.0 にて発見されたバグ CVE-2021-32629 の調査に関する Fastly セキュリティアドバイザリー (FSecA) をご覧ください。このバグは先日、Bytecode Alliance のリリースにおいて公表されました[1]。
この FSecA は、このバグに関する調査の対象範囲と影響を明確に理解し、これまでに実施された対策について説明することを目的にしています。
対象範囲
このセキュリティアドバイザリーは、2021年3月8日から2021年4月22日の間にモジュールがアップロードされた Compute@Edge をご利用のお客様に適用されます。すべてのお客様またはこの期間外にアップロードされたモジュールに適用されるものではありません。
概要
Cranelift x64 バックエンドで発見されたバグにより、レジスタアロケータが64ビットより小さいスピルされた整数値を再読み込みする際、スタックから読み込まれた値に対してゼロ拡張ではなく符号拡張が実行されます。これにより、別の最適化とのインタラクションが影響を受けます。すなわち、32ビットの値を生成する命令によって実際にはデスティネーションレジスタの上位32ビットがゼロで埋められる際、命令セレクタは32ビットから64ビットへのゼロ拡張を行うオペレータを無視します。従って、x64 コンパイラはこれらのゼロで埋められたビットを使用することになります。しかし整数型は i32 のままで、スピル/再読み込みの際にこれらのビットが i32 の最上位ビットとして再構成されます。
この問題は、以下の場合に発生します。
i32 値が 0x8000_0000 以上である
プログラム内の値の定義と使用の間でレジスタ圧力が高くなり、レジスタアロケータによって値がスピルおよび再読み込みされる
デスティネーションの上位32ビットがゼロで埋められる特殊な命令によって値が生成される (add、sub、mul、and、or)
値が64ビットにゼロ拡張される
最終的な64ビット値が使用される
このような状況下において、i32値がポインターである場合、サンドボックスエスケープが可能になることがあります。ヒープアクセス用の通常コードは、WebAssembly のヒープアドレスをゼロ拡張し、64ビットのヒープベースへ追加し、最終的なアドレスにアクセスします。ゼロ拡張が符号拡張となった場合、プログラムはヒープ開始の 2 GiB 前まで遡りメモリにアクセスすることが可能です。
結果として、悪質なモジュールが実行された場合、それ以前のインスタンススロットが実行されていないと、無効な LUCET_MAGIC によるアサーションによってクラッシュが引き起こされるか、境界外のトラップによってプロセスが停止することが予想されます。Fastly の調査では、特製の WebAssembly モジュールによって、Compute@Edge のビルドプロセスで使用される Cranelift コンパイラの脆弱性のあるバージョンをターゲットにすることが可能であることが分かっています。その場合、WebAssembly モジュールは別のサンドボックスでメモリにアクセスするか、Compute@Edge デーモンのコントロールフローを妨害することができます。
この脆弱性は、Compute@Edge の WebAssembly モジュールによる定期的な異常動作のモニタリングによって発見され、KTH Royal Institute of Technology のセキュリティ研究者 Javier Cabrera Arteaga 氏によってアップロードされたモジュールの分析によって特定されました。異常な動作の調査過程で Fastly エンジニアによって特定されたバグは、悪用される可能性があるものとして、Bytecode Alliance の協力の下に公開されました。
対策
Compute@Edge の WebAssembly モジュールを監査したところ、このバグを悪用するために構築された Compute@Edge の WebAssembly モジュールは見つかりませんでした。
問題は完全に対処済みであり、Compute@Edge のお客様によるアクションは必要ありません。以下の点をご確認ください。
今回の問題に影響を受けたモジュールによって処理されたユーザーリクエストはありません
Compute@Edge の Cranelift 実装内にてこの脆弱性に対するパッチを適用済みです
お客様の WebAssembly モジュールはすべて、アップデートされたコンパイラによって再度コンパイルされました
謝辞
このバグは、スウェーデン戦略研究財団の Trustful プロジェクトの協力を得た KTH Royal Institute of Technology のJavier Cabrera Arteaga 氏による報告を受けて、Fastly の開発者によって特定されました。 参照リンク [1] https://github.com/bytecodealliance/wasmtime/security/advisories/GHSA-hpqh-2wqx-7qp5
お問い合わせ
ご質問がある場合は、Fastly のカスタマー・エンジニアリング・チーム (support@fastly.com) またはセキュリティチーム (security@fastly.com) までお問い合わせください。