2021年5月21日
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値がポインターである場合、サンドボックスエスケープが可能になることがあります。ヒープアクセス用の通常コードは、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 のお客様によるアクションは必要ありません。以下の点をご確認ください。
このバグは、スウェーデン戦略研究財団の 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) までお問い合わせください。