An Analysis of Modern Web Security Vulnerabilities Inside WebAssembly Applications

この論文は、WebAssembly モジュールにおけるバッファオーバーフローなどのバイナリ脆弱性が、SQL インジェクションや XS-Leaks といった Web 固有のセキュリティ侵害を引き起こし、既存の防御策を無効化する可能性を示し、そのリスクを軽減するためのベストプラクティスを提案しています。

Lorenzo Corrias, Lorenzo Pisu, Davide Maiorca, Giorgio Giacinto

公開日 Wed, 11 Ma
📖 1 分で読めます☕ さくっと読める

Each language version is independently generated for its own context, not a direct translation.

🍳 要約:料理屋の「魔法の箱」が暴走した話

1. 背景:なぜ WebAssembly(WASM)が必要なのか?

昔のウェブサイト(JavaScript)は、**「手書きのレシピ」**で料理を作っているようなものでした。美味しいですが、大人数に料理を出すには少し時間がかかります。

そこで登場したのが**WebAssembly(WASM)です。これは「すでに完成された、高速な冷凍食品」**のようなものです。

  • メリット: 非常に速く、重い処理(画像編集やゲームなど)もサクサク動きます。Figma や Google アースなど、多くの有名サイトがこれを使っています。
  • 問題点: この「冷凍食品(WASM)」は、中身が**「C 言語」という古い言語で作られています。C 言語には、昔ながらの「調理ミス(バグ)」**が潜んでいることがあり、それがウェブサイト全体を危険にさらす可能性があります。

2. 発見:小さなミスをきっかけに、大惨事が起きる

研究者たちは、「C 言語の『調理ミス』が、ウェブサイトの『セキュリティ』をどう壊すか」をシミュレーションしました。

【3 つの具体的なシナリオ】

① SQL インジェクション(データベースへの侵入)

  • 状況: 料理屋(WASM)が、客の注文(入力)をデータベースに記録します。通常は「注文内容」をそのまま記録する安全な方法を使っています。
  • 攻撃: しかし、料理屋の棚(メモリ)に**「隣りの皿が溢れて、注文メモを書き換える」というミス(バッファオーバーフロー)があると、客は「普通の注文」を装いながら、実は「データベースのルールを書き換える指令」**を混ぜ込むことができます。
  • 結果: 本来は「自分の注文だけ」を見るはずなのに、「全店の顧客リスト」や「パスワード」を盗み見られてしまうことになります。

② サーバーサイドテンプレートインジェクション(SSTI)

  • 状況: 料理屋が「今日のメニュー表(HTML)」を作るために、一時的な「秘密の暗号(ノンス)」を使います。
  • 攻撃: 料理屋の棚が溢れるミス(バッファオーバーフロー)や、使い捨ての皿を再利用するミス(Use After Free)があると、その「秘密の暗号」の場所に、**「料理屋の厨房で勝手に料理を作る命令」**を書き込まれてしまいます。
  • 結果: ウェブサイトは「安全な暗号だ」と信じてその命令を実行してしまい、サーバー自体が乗っ取られたり、悪意のあるコードが実行されたりします。

③ XS-Leaks(情報漏洩の「待ち時間」攻撃)

  • 状況: 料理屋が、客の秘密の好み(パスワードなど)を照合します。通常は、外部からは中身が見えません。
  • 攻撃: 料理屋に**「非常に複雑な計算(正規表現の悪用)」**をさせるよう仕向けます。
    • 「秘密の言葉が『A』から始まる」→ 計算が簡単で、**「すぐに返事」**が来る。
    • 「秘密の言葉が『A』から始まらない」→ 計算が複雑で、「長い間待たされる」
  • 結果: 客は中身を見られませんが、**「返事が来るまでの時間」を測ることで、「秘密の言葉が何文字目まで合っているか」**を推理し、最終的にパスワードをすべて解読してしまいます。

3. なぜこれが難しいのか?(研究者の視点)

  • 従来の対策は効かない: 「SQL インジェクション対策として『準備済みステートメント』を使う」という一般的なルールは、**「料理屋自体が壊れている(メモリが書き換わる)」**状態では無効になります。
  • 見えない敵: ウェブサイト自体は安全に見えても、裏で動いている「冷凍食品(WASM)」が壊れていると、全体が危険にさらされます。

4. 対策:どうすれば安全に使えるのか?

研究者は、以下の「安全な調理マニュアル」を提案しています。

  1. 境界線を厳しく守る: JavaScript(注文係)と WASM(料理屋)の間でやり取りするデータは、**「すべて怪しいもの」**として扱い、厳重にチェックする。
  2. 必要なものだけ渡す: 料理屋に渡す道具(関数やメモリ)は、最低限のものに絞る。余計な道具があれば、それを使って悪さをする可能性があるから。
  3. 安全な調理器具を使う: コンパイラ(料理を作る機械)に、**「棚が溢れたらアラートを出す機能」「使い捨ての皿を再利用しない機能」**をオンにする。少し遅くなるかもしれないが、安全は最優先。

💡 結論

WebAssembly は素晴らしい技術ですが、**「高速だからといって、中身(C 言語のバグ)を甘く見てはいけない」**という教訓です。

まるで**「高機能な自動調理機」**を導入したレストランが、その機械の内部に潜む小さな故障によって、客の財布を盗まれるようなものです。開発者は、この「魔法の箱」の中身も、従来のウェブサイトと同じくらい慎重に守る必要があります。