概要
VueはHTML、CSS、JSのフレームワークで、きめ細かな反応性を持つウェブ・アプリケーションを開発できる。
Vue 2コンパイラにReDoSの脆弱性(CVE-2024-9506)が確認されました。
OWASPによる:正規表現サービス拒否(ReDoS)は、ほとんどの正規表現の実装が、動作が非常に遅くなる(入力サイズに指数関数的に関係する)極端な状況に達する可能性があるという事実を悪用したサービス拒否攻撃です。攻撃者は、正規表現(Regex)を使用するプログラムがこのような極端な状況に陥り、非常に長い時間ハングするように仕向けることができます。
詳細
モジュール情報
- 製品ビュー
- 影響を受けるパッケージ:compiler-sfc, server-renderer, template-compiler
- Affected versions: >=2.0.0 <3.0.0
- Githubリポジトリ: https://github.com/vuejs/vue
- 公開されたパッケージ https://www.npmjs.com/package/vue
- パッケージマネージャ:npm
脆弱性情報
この深刻度の低い脆弱性は、複数のVueパッケージ内のhtml-parser.ts ファイルに存在します:
- コンパイラ-sfc
- サーバーレンダラー
- テンプレートコンパイラ
- ビューテンプレートコンパイラ
- ビューサーバーレンダラー
html-parser.tsのVueのparseHTML()関数は、以下の場合にReDoS攻撃を受ける可能性があります:
- The template string contains a <script>, <style>, or <textarea> without a matching closing tag
Within the parseHTML() function there is a regular expression (regex) to check for proper closing tags for the three tags listed above. However, due to an improperly written regex, when you pass in something like <script>some very very long text</not-script> it will trigger a ReDoS.
再現の手順
Within Vue 2 client-side application code, create a new Vue instance with a template string that includes a <script> node tag that has a different closing tag (in this case </textarea>).
new Vue({
el: '#app',
template: '
<div>
Hello, world!
<script>${'<'.repeat(1000000)}</textarea>
</div>'
});
- 上記のJavaScriptを読み込むindex.htmlファイルを設定し、新しく作成したVueインスタンスをmount()でマウントします。
<!DOCTYPE html>
<html>
<head>
<title>My first Vue app</title>
</head>
<body>
<div id="app">
Loading..
</div>
</body>
</html>
- ブラウザで、Vueアプリケーションにアクセスします。
http://ローカルホスト:3000
- ブラウザで、ReDoS脆弱性が、ページがテンプレートを解析してVueアプリケーションをマウントするまでの時間をどのように増加させることができるかを観察してください。これはReDoS脆弱性を実証しています。
概念実証
上記と同様のコードによる完全な再現は、こちらでご覧いただけます:
Vue2 HTML Tag Mismatch ReDoS
クレジット
- K(ファインダー)
緩和
Vue 2はサポートが終了しており、この問題に対処するためのアップデートは提供されません。
影響を受けるコンポーネントのユーザーは、以下のいずれかの緩和策を適用してください:
- Vueの新しいバージョンに移行する。
- EOL後のセキュリティ・サポートには、HeroDevsのような商用サポート・パートナーを活用する。
弊社がサポートするオープンソースソフトウェアに新たな脆弱性が修正された場合、いつでもアラートを受け取ることができます。