Modern Frontend CVEs

対象CVE: CVE-2026-45617

[速報] LiquidJSにReDoS脆弱性(CVE-2026-45617)が発覚!フロントエンドエンジニアが知るべき影響と対策

テンプレートエンジンLiquidJSの`strip_html`フィルターに、悪意のある入力によってサービス全体が停止しうるReDoS(正規表現によるサービス拒否)脆弱性が見つかりました。フロントエンドでLiquidJSを扱うプロジェクトでは、速やかな対応が求められます。

はじめに:LiquidJSのReDoS脆弱性、なぜフロントエンドにも関係するのか?

皆さんのプロジェクトでLiquidJSを使用していますか?ECサイトのShopifyテーマ開発、静的サイトジェネレーター、またはNode.jsバックエンドでサーバーサイドレンダリングを行っている場合、今回の脆弱性は深刻な影響を及ぼす可能性があります。特に、ユーザーからの入力を受け付けてLiquidテンプレートで表示しているケースでは、サービスの安定稼働に直結するため、早急な理解と対策が必要です。

CVE-2026-45617 (GHSA-r7g9-xpmj-5fcq) の概要

今回の脆弱性は、オープンソースのLiquidテンプレートエンジン「LiquidJS」の標準フィルターである`strip_html`に存在します。深刻度は「高 (High)」と評価されており、悪意のあるユーザーが特定の文字列を入力するだけで、サーバーが長時間停止する恐れがあります。

この脆弱性は、ReDoS(Regular expression Denial of Service、正規表現によるサービス拒否)攻撃の一種です。正規表現の処理に存在する非効率な挙動を悪用し、正規表現エンジンが計算に膨大な時間を費やすことで、CPUを飽和させ、アプリケーション全体の応答を停止させるものです。

具体的な脆弱性のメカニズムと影響

`strip_html`フィルターは、HTMLタグをテキストから取り除くために使用されます。この処理には内部的に正規表現が使われていますが、問題はその正規表現のパターンにあります。特に、`<script`や`<style`、`<!--`のような開始タグが大量にあるにも関わらず、対応する閉じタグがない悪意のある入力が与えられた場合、正規表現エンジンは「バックトラッキング」と呼ばれる非常に非効率な処理を繰り返してしまいます。

バックトラッキングとは、正規表現のパターンマッチングにおいて、ある部分でマッチングに失敗した場合に、以前にマッチングした箇所に戻って別のパターンを試す動作です。複雑な正規表現や特定の悪意のある入力が組み合わさると、このバックトラッキングが指数関数的または二次関数的に発生し、CPU使用率が急激に上昇します。

今回の脆弱性では、正規表現の処理時間が入力データの長さに比例して二次関数的に(Nの2乗で)増加することが確認されています。その結果、わずか350KB程度の特定の悪意ある文字列が入力されるだけで、Node.jsのイベントループが約10秒間、完全に停止してしまうことが報告されています。

Node.jsのイベントループが停止するということは、その間に届いた他の全てのリクエストも処理されず、サービス全体がダウンした状態に陥ることを意味します。これは、未認証のユーザーからでも攻撃が可能であり、Webサービスの可用性に深刻な影響を与えるDoS(Denial of Service)攻撃に直結します。

さらに注意すべき点として、LiquidJSの`memoryLimit`オプションを設定していても、正規表現によるCPU使用量はメモリ制限とは異なるため、この脆弱性による保護はされません。

この脆弱性は、主にユーザーが自由に内容を入力できる箇所(コメント欄、プロフィール、投稿コンテンツなど)で`strip_html`フィルターを使用してコンテンツをサニタイズしているシステムに影響します。

フロントエンドエンジニアが取るべき対策

まずは、皆さんのプロジェクトでLiquidJSを使用しているか、そして`strip_html`フィルターをユーザー入力のサニタイズに使用しているかを確認してください。もし該当する場合、以下の対策を速やかに検討・実施してください。

最も直接的な対策は、この脆弱性が修正されたバージョンのLiquidJSにアップデートすることです。公式の修正がリリースされた際には、速やかに最新版に更新しましょう。`package.json`の依存関係を確認し、バージョンアップを計画してください。

もしアップデートがすぐに難しい場合や、より根本的な対策を求める場合は、`strip_html`フィルターが使用する正規表現を、バックトラッキングを発生させない、より安全で効率的なパターンに置き換えることを検討します。提案されている修正案では、各タグのパターンを細かく制御することで、処理時間が入力サイズに比例した線形時間になるように改善されています。

また、正規表現に頼らず、プログラムコードで文字列を一度だけ走査し、タグの開始・終了を検出して不要な部分を削除する「シングルパスのトークナイザー」を実装することも有効な代替手段です。これにより、正規表現の潜在的なリスクを排除できます。

防御的な対策として、ユーザーからの入力文字列の最大長を制限することは非常に重要です。今回の脆弱性では350KBという比較的大きな入力がトリガーになっていますが、これを制限することで攻撃の機会を減らせます。また、`strip_html`フィルターだけに頼らず、HTMLサニタイザーライブラリ(例: DOMPurifyなど)を組み合わせるなど、多層的なサニタイズ処理を実装することも検討しましょう。

まとめ

LiquidJSの`strip_html`フィルターにおけるReDoS脆弱性(CVE-2026-45617)は、サービスの可用性に直接影響を及ぼす深刻な問題です。フロントエンドエンジニアとしては、使用しているライブラリの脆弱性情報に常に目を光らせ、プロジェクトへの影響を評価し、速やかな対策を講じることが重要です。公式の修正パッチの適用はもちろん、入力値の検証強化や代替手段の検討を通じて、より堅牢なシステム構築を目指しましょう。

← ブログ一覧に戻る