Modern Frontend CVEs

対象CVE: CVE-2026-63460

[注意喚起] VendureのReDoS脆弱性:SQLite利用時のDoSリスクとNode.jsイベントループの罠

バックエンドフレームワークVendureにおいて、SQLite使用時に正規表現の不適切な処理により認証不要なサービス拒否(ReDoS)が発生する脆弱性が発見されました。フロントエンドエンジニアもAPI設計や依存ライブラリの選定で知っておくべき、イベントループをブロックする危険性について解説します。

はじめに:なぜフロントエンドエンジニアがこのバックエンドの脆弱性を知るべきか?

フロントエンドエンジニアの皆さんは、「バックエンドの脆弱性だから自分には関係ない」と思われるかもしれません。しかし、現在のWeb開発ではフロントエンドとバックエンドの境界が曖昧になり、API連携が開発の中心です。今回の脆弱性は、正規表現の危険性、Node.jsのイベントループの特性、そして認証なしでAPI経由でシステム全体が停止しうるという点で、フロントエンド開発者にとっても見過ごせない内容です。ビルドツール、サーバーサイドレンダリング、Next.js/Nuxt.jsのようなフルスタックフレームワークを利用する中で、この知識はきっと役立つでしょう。

脆弱性の概要:ReDoS(正規表現DoS)とは?

今回報告されたのは、GHSA-jgm3-qmp2-c4p7 / CVE-2026-63460として知られる、eコマースフレームワークVendureの脆弱性です。深刻度は「High」に分類されています。

脆弱性の種類は「ReDoS(Regular Expression Denial of Service)」、つまり「正規表現によるサービス拒否」です。特定の、悪意を持って設計された正規表現パターンと入力文字列の組み合わせが与えられると、正規表現エンジンのマッチング処理に指数関数的な時間がかかり、CPUリソースを著しく消費し続ける現象を指します。結果として、アプリケーションやサーバーが応答不能になり、サービスが停止してしまいます。

脆弱性の詳細:VendureとSQLite環境下の危険性

この脆弱性が問題となるのは、主に以下の3つの条件が重なった場合です。

1. **SQLiteバックエンドの利用**:<br>この脆弱性は、Vendureが`better-sqlite3`や`sqljs`といったSQLiteドライバーを使用している場合にのみ影響を受けます。SQLiteは通常、開発環境やテスト環境、あるいは小規模な単一サーバーデプロイメントで利用されることがほとんどです。本番環境でよく使われるPostgreSQLやMySQL/MariaDBでは、正規表現処理がデータベースエンジン側で行われるため、Node.jsのイベントループをブロックすることはありません。

2. **`regex`フィルターと認証不要アクセス**:<br>VendureのShop GraphQL APIでは、`StringOperators.regex`フィルターが公開されています。特に、商品情報を取得する`products`リゾルバーには`@Allow`デコレーターが設定されておらず、認証なしに誰でもアクセス可能です。つまり、攻撃者はログインすることなく、このAPIを通じて悪意のある正規表現パターンを送信できてしまいます。

3. **正規表現の不適切な処理とイベントループのブロック**:<br>SQLiteドライバーは、SQLの`REGEXP`演算子を処理するために、Node.jsのJavaScriptユーザー定義関数(UDF)を登録しています。このUDF内で、ユーザーから送信された正規表現パターンが、長さ制限、タイムアウト、安全性の検証などなしに、直接`new RegExp(pattern, 'i').test(value)`として実行されます。このUDFはNode.jsのメインイベントループ上で同期的に動作するため、ReDoSパターンが投入されると、正規表現の評価が完了するまでイベントループ全体がブロックされ、サーバーは他のどのリクエストも処理できなくなります。

発生する影響:サービス停止と業務中断

この脆弱性が悪用されると、以下のような深刻な影響が発生します。

悪意のあるインターネットユーザーが、認証なしで単一のHTTPリクエストを送信するだけで、Vendureサーバー全体が応答不能になります。これは、ショップのストアフロントだけでなく、管理パネルも含まれます。正規表現の評価が完了するまで、サーバーは数十秒から数分間、完全に停止し、利用者は一切の操作ができなくなります。攻撃者は、少ないリソースでこのリクエストを繰り返すことにより、持続的なサービス拒否状態を容易に作り出すことが可能です。

フロントエンドエンジニアが考えるべきこと

この脆弱性はバックエンドに起因するものですが、フロントエンドエンジニアが学ぶべき教訓がいくつかあります。

1. **API入力値の検証の重要性**: フロントエンド側で入力フォームやAPIに送信する値について、安易な信頼は禁物です。可能な範囲で入力値のバリデーションを行うことは、セキュリティの第一歩です。ただし、正規表現の安全性検証のような本質的な対策はバックエンドで行われるべきでしょう。

2. **依存ライブラリの脆弱性チェック**: 開発に使用しているライブラリやフレームワーク(Node.jsベースのビルドツール、サーバー、APIクライアントなど)の脆弱性情報を常に把握し、最新の状態に保つことが重要です。CI/CDパイプラインに脆弱性スキャンツールを組み込むことも効果的です。

3. **バックエンドとの連携と設計**: APIの設計段階で、バックエンドエンジニアと協力し、特に正規表現のように計算負荷が高い、あるいはユーザー入力に依存する処理については、その安全性や性能への影響を十分に議論することが大切です。

4. **Node.jsイベントループの理解**: Node.jsアプリケーションのパフォーマンスと応答性は、イベントループの健全性に大きく依存しています。同期的に実行される可能性のある処理や、計算コストの高い処理がイベントループをブロックしないよう、設計段階から意識する知識は、フロントエンドに限らずNode.jsを使う全てのエンジニアにとって不可欠です。

対策:ReDoSからシステムを守るために

この脆弱性に対する根本的な対策はバックエンド側で行われるべきですが、知っておくことで安全なAPI設計や利用を検討できます。

1. **正規表現の安全性の検証**: 正規表現オブジェクトを構築する前に、`safe-regex2`や`recheck`のようなライブラリを使用して、与えられたパターンがカタストロフィック・バックトラッキングを引き起こす危険性がないかを検証し、危険なパターンを拒否します。

2. **パターン長の制限**: GraphQLのバリデーションレイヤーで、`StringOperators.regex`の値に最大長(例えば100文字)を設けることで、過度に複雑な正規表現パターンを防ぎます。

3. **ワーカー・スレッドでの実行**: 計算負荷の高い正規表現処理や、イベントループをブロックする可能性のある処理を、Node.jsの`worker_threads`を利用してメインイベントループから分離します。これにより、正規表現処理がハングしてもサーバー全体が停止することを防ぎ、タイムアウト機構も導入できます。

4. **認証の要求**: 防御策として、`ShopProductsResolver.products`などのフィルター可能なリストクエリに`@Allow(Permission.Authenticated)`デコレーターを追加し、匿名アクセスを制限します(ただし、これはビジネス要件に反しない場合に限られます)。

まとめ

今回のVendureのReDoS脆弱性は、正規表現の潜在的な危険性、Node.jsイベントループの特性、そして認証と入力検証の重要性を改めて浮き彫りにしました。フロントエンドエンジニアの皆さんも、ビルドシステム、サーバーサイドレンダリング、API連携など、様々な場面でNode.jsや正規表現に触れる機会があります。たとえバックエンドの脆弱性であっても、その根本原因と影響を理解し、自身の開発プロセスやAPI利用においてセキュリティ意識を高めることが、より堅牢なWebアプリケーション開発につながるでしょう。

← ブログ一覧に戻る