彼らは、Wasmtime に重大な脆弱性を検出しました

脆弱性

これらの欠陥が悪用されると、攻撃者は機密情報に不正にアクセスしたり、一般的に問題を引き起こしたりする可能性があります

数日前、 Wasmtime 6.0.1、5.0.1、および4.0.1の修正アップデートのリリースが発表されました。このアップデートは、重大度が高いと分類された脆弱性(既にCVE-2023-26489としてカタログ化されている)に対処するものです。

この脆弱性により、データ書き込みが、隔離されたWebAssemblyコードに許可されている制限外のメモリ領域で行われる可能性があり、攻撃者が隔離されたWASI環境外で自身のコードを実行するために悪用される可能性があります。

Wasmtime に慣れていない人は、これが WASI (WebAssembly System Interface) 拡張機能を備えた WebAssembly アプリケーションを通常のスタンドアロン アプリケーションとして実行するためのランタイムであることを知っておく必要があります。

WasmtimeはRustで記述されており、この脆弱性は、ハードウェアアーキテクチャに依存しない中間表現をx86_64アーキテクチャ用の実行可能なマシンコードに変換するCraneliftコードジェネレータにおける線形メモリアドレッシング規則の定義における論理エラーに起因します。

修正された脆弱性に関して、特に、WebAssemblyアプリケーションでは、WebAssemblyで許可されている33ビットアドレスではなく、 35ビットの実効アドレスが計算されるようになったため、読み書き操作に許可される仮想メモリの制限が34GBに変更されたことが言及されています。一方、サンドボックス環境設定では、ベースアドレスの6GBが保護されます。

Wasmtime のコード ジェネレーターである Cranelift には、x86_64 ターゲットにバグがあり、アドレス モードの計算で、WebAssembly で定義された 35 ビットの実効アドレスではなく、33 ビットの実効アドレスが誤って計算されます。 このバグは、デフォルトのコード生成構成では、wasm 制御のロード/ストア操作が線形メモリのベースから最大 35 ビット離れたアドレスを読み書きできることを意味します。 

その結果、ベースアドレスから6~34GBの仮想メモリ領域がWebAssemblyアプリケーションからの読み書きに利用可能になった。このメモリ領域は、他のWebAssembly環境やWebAssemblyランタイムコンポーネントを格納するために使用できる。

たとえば、(i32.load (i32.shl (local.get 0) (i32.const 3))) は、WebAssembly アドレス $local0 << 3 からロードされます。Cranelift に変換すると、$local0 << 3 の計算が32 ビット値が 64 ビット値にゼロ拡張され、線形メモリのベース アドレスに追加されます。 Cranelift は、%base + %local0 << 8 を計算する movl(%base, %local0, 3), %dst という形式のステートメントを生成します。

ただし、ここでの誤りは、アドレス計算が 64 ビット値で発生することです。ここで、$local0 << 3 はアドレスを 32 ビット値に切り捨てることになっていました。 これは、アドレスに最大 0 ビットを使用できる %local32 が、追加の 3 ビットのアドレス空間を movl 経由でアクセスできるようにすることを意味します。

最後に、パッケージは常に最新バージョンにアップデートすることが推奨されますが、アップデートが不可能な場合にこの問題を軽減するために使用できるいくつかの解決策があることも述べておきます。

これらのソリューションはいずれもデフォルトではオンになっておらず、明示的な構成が必要であることが言及されています。

  • Wasmtime のバージョンを更新できない場合は、オプション "Config::static_memory_maximum_size(0)" が言及されており、エラーをブロックするための回避策として、任意のリニア メモリ アクセスで必須の個別の境界チェックを有効にします (パフォーマンスが大幅に低下します)。 )。
  • 別のオプションは、「Config::static_memory_guard_size(1 < 36)」設定を使用して、問題のある仮想メモリ範囲にあるガード ページ (ガード ページ、アクセス時に例外をスロー) の数を増やすことです (大量の仮想メモリを予約することにつながります)。メモリと同時 WebAssembly アプリケーションの数の制限)。
  • x86_64 以外のホストを使用できる場合は、このエラーも修正されます。 このバグは、たとえば、Wasmtime や Cranelift の AArch64 バックエンドには影響しません。

最後に、さらに詳しく知りたい場合は、以下のリンクから詳細をご確認いただけます。


Googleで優先ソースとして追加する