[解説] LiquidJSの深刻なメモリ制限バイパス脆弱性 (CVE-2026-69222) とその対策
脆弱性概要 (GHSA-4r6h-5v86-94p3 / CVE-2026-69222)
今回報告された脆弱性「GHSA-4r6h-5v86-94p3 (CVE-2026-69222)」は、JavaScript製のLiquidテンプレートエンジン「LiquidJS」における「Uncontrolled Resource Consumption(リソースの不制御な消費)」に関するものです。深刻度は「High」と評価されており、設定されたメモリ制限を迂回して、アプリケーションに大量のメモリを消費させ、結果としてサービス拒否(DoS)を引き起こす可能性があります。
具体的には、LiquidJSの`join`フィルターの処理に問題があり、攻撃者が細工したテンプレートをレンダリングすることで、意図せずアプリケーションをクラッシュさせることができてしまいます。
脆弱性のメカニズム:`memoryLimit`の迂回
LiquidJSには、テンプレートのレンダリング時に過度なリソース消費を防ぐための「`memoryLimit`」という機能が備わっています。これは、配列の結合や文字列操作など、メモリを消費する可能性のある処理に対して、割り当てられるメモリ量に上限を設けるための「協調的な保護」メカニズムです。
しかし、`join`フィルターの実装(`src/filters/array.ts`)において、`memoryLimit`に計上されるコスト計算に誤りがありました。`join`フィルターは、配列の要素を結合して一つの大きな文字列を生成しますが、その際に`memoryLimit`に計上されるのは、結合される配列の「要素数」に基づいていました。本来、結合によって生成される文字列のメモリ消費は、個々の要素の「長さ」の合計と区切り文字の長さによって決まるため、この「要素数」のみの課金では実態と大きく乖離してしまいます。
この脆弱性を悪用する攻撃者は、まず`split`フィルターと`concat`フィルターを巧妙に利用します。`concat`フィルターも要素数ベースで`memoryLimit`を課金するため、少ないコストで大量の(しかし参照は軽量な)要素を持つ配列を指数関数的に増やすことが可能です。そして、その巨大な配列を`join`フィルターで結合することで、`memoryLimit`が許容する範囲をはるかに超える数ギガバイトもの文字列を強制的に生成させ、Node.jsプロセスをメモリ枯渇(OOM: Out Of Memory)や`RangeError: Invalid string length`でクラッシュさせることが可能になります。
具体的な影響とリスク
この脆弱性の影響は深刻で、攻撃者によって制御可能なLiquidテンプレートをレンダリングするWebアプリケーション(例:ユーザーがカスタムできるメールテンプレート機能、CMSのコンテンツレンダリング部分など)が、サービス拒否攻撃の標的となる可能性があります。`memoryLimit`を設定していても、この脆弱性によって保護が無効化されるため、予期せぬシステムダウンにつながりかねません。
対策
この脆弱性に対する最も効果的な対策は、LiquidJSを修正済みの最新バージョンへ速やかにアップデートすることです。過去にも類似のメモリ課金に関する脆弱性(`replace`, `replace_first`, `date`/`strftime`など)が修正されている経緯から、開発元は迅速に対応を進めていると考えられます。
LiquidJSの公式リリースノートやGitHubリポジトリを確認し、修正を含むバージョン(おそらく`liquidjs@10.x.x`またはそれ以降のバージョンで修正されるでしょう)にアップグレードしてください。
すぐにアップデートが困難な場合は、信頼できないユーザーからのテンプレート入力を避ける、あるいはテンプレートのレンダリング前にサニタイズを強化するなどの暫定的な対策も考えられます。しかし、これらは根本的な解決にはならないため、可能な限り早期のアップデートを強く推奨します。
フロントエンドエンジニアへの影響と注意点
LiquidJSは通常、サーバーサイドのNode.js環境でテンプレートレンダリングに使われることが多いため、Node.jsをバックエンドAPIとして開発・運用しているフロントエンドエンジニアの皆様にとっては、直接的な影響がある問題です。
また、静的サイトジェネレーター(Jekyll、Eleventyなど)の中にはLiquidJS互換のテンプレートエンジンを使用しているものもあります。もしご自身の開発環境やビルドプロセスでLiquidJSを直接的に、あるいは間接的に利用している場合は、ビルド時のリソース消費問題(ローカルDoS)にもつながる可能性はゼロではありません。しかし、この脆弱性の性質上、本番環境でのDoS攻撃が主要な懸念点となります。
ご自身のプロジェクトの依存関係を確認し、LiquidJSが利用されていないか、利用されている場合はそのバージョンが適切に管理されているかを定期的にチェックする習慣をつけましょう。
まとめ
LiquidJSの`join`フィルターにおけるメモリ制限バイパス脆弱性 (CVE-2026-69222) は、アプリケーションのサービス停止を引き起こす可能性がある深刻な問題です。LiquidJSを使用しているプロジェクトでは、この脆弱性情報を早期に把握し、速やかにLiquidJSを最新の修正済みバージョンにアップデートすることで、セキュリティリスクを軽減してください。