Modern Frontend CVEs

対象CVE: CVE-2026-107375

[緊急] JHipster製WebFluxアプリに深刻なSQLインジェクション脆弱性(CVE-2026-107375)

JHipsterで生成されたリアクティブ(WebFlux + R2DBC)アプリケーションにおいて、`sort`パラメータを悪用したSQLインジェクションの脆弱性が発見されました。低権限ユーザーでも任意のSQL実行が可能です。

はじめに:JHipsterとSQLインジェクション

日本のフロントエンドエンジニアの皆さん、こんにちは!普段JavaScript/TypeScriptやフロントエンドフレームワークでの開発に注力されている方も多いかと思いますが、私たちが連携するバックエンドのセキュリティ脆弱性は、アプリケーション全体の信頼性に直結します。今回は、人気のフルスタックアプリケーションジェネレーターであるJHipsterに発見された、深刻なSQLインジェクション脆弱性について解説します。

JHipsterはnpmパッケージとしても提供されるジェネレーターで、Spring Bootを基盤としたバックエンドと、Angular、React、Vueなどのモダンなフロントエンドを統合したアプリケーションを素早く生成できます。そのため、バックエンドがJavaであっても、JHipsterを日頃から利用しているフロントエンドエンジニアにとっては無関係ではありません。

脆弱性の概要

今回の脆弱性は以下の通りです。

<ul><li><strong>ID:</strong> GHSA-r223-96jv-q533</li><li><strong>CVE:</strong> CVE-2026-107375</li><li><strong>深刻度:</strong> High</li><li><strong>対象:</strong> `jhipster/generator-jhipster` (npmパッケージ `generator-jhipster`) で生成されたリアクティブ(Spring WebFlux + Spring Data R2DBC + SQL)アプリケーション</li><li><strong>概要:</strong> ページネーションされたエンティティリストのエンドポイント(例: `GET /api/<entity>?sort=...`)において、`sort`リクエストパラメータに対するSQLインジェクションの脆弱性が存在します。</li></ul>

脆弱性の詳細:なぜ危険なのか?

この脆弱性は、JHipsterが生成するリアクティブアプリケーションのコード、具体的には `EntityManager_reactive.java.ejs` テンプレート内の `createOrderByFields(...)` メソッドに起因します。このメソッドは、ユーザーから提供される `sort` パラメータの値を検証やエスケープなしに、そのままSQLクエリの `ORDER BY` 句に連結してしまいます。

例えば、フロントエンドからAPIに対して `GET /api/products?sort=id;DROP TABLE product;--` のようなリクエストが送信された場合、バックエンドのSQLクエリは以下のように解釈されてしまいます。(これはPoCで実際に確認されています)

```sql SELECT e.id AS e_id, e.name AS e_name, e.price AS e_price FROM product e ORDER BY e_id;DROP TABLE product;-- ASC LIMIT 20 OFFSET 0 ```

これにより、認証された低権限のユーザー(デフォルトの自己登録フローで取得したアカウントを含む)であっても、**任意のSQLコマンドを実行できてしまいます**。その結果、データベース内のあらゆるテーブル(管理者ユーザーのパスワードハッシュを含む `jhi_user` テーブルなど)から情報を読み取ったり、データを変更・削除したり、最悪の場合にはテーブルを削除したりすることが可能です。これは機密性(Confidentiality)、完全性(Integrity)、可用性(Availability)のすべてに影響を与える、非常に深刻な脆弱性です。

<strong>フロントエンドエンジニアへの示唆:</strong> 私たちがAPIに渡すクエリパラメータは、バックエンドの処理に直接影響を与えます。今回のケースでは、たった一つの`sort`パラメータが悪用されることで、アプリケーションの根幹が揺るがされる可能性があります。APIリクエストの構成や、ユーザー入力のバリデーションの重要性を再認識するきっかけとなります。

影響を受けるバージョンと確認方法

この脆弱性の影響を受けるのは、`generator-jhipster` の <strong>v7.0.0 から v9.2.0</strong> で生成されたリアクティブアプリケーションです。JPA(非リアクティブ)パスやNoSQLバックエンドを使用しているアプリケーションは影響を受けません。

<strong>ご自身のプロジェクトが影響を受けるかどうかの確認方法:</strong>

<ul><li><strong>`generator-jhipster` のバージョン確認:</strong> プロジェクトの `package.json` または `yarn.lock`/`pnpm-lock.yaml` で、`generator-jhipster` のバージョンが v7.0.0からv9.2.0の範囲内にあるか確認してください。</li><li><strong>バックエンドコードの確認:</strong> Spring Bootアプリケーションのソースコードで、`src/main/java/<package>/repository/EntityManager.java` 内の `createOrderByFields` メソッドが、ユーザー入力(`propertyName`)を未検証のままSQLに連結していないか確認してください。特に、`OrderByField.from(table.column(propertyName)...)` のようなパターンが該当します。</li><li><strong>リアクティブアプリケーションかどうかの確認:</strong> プロジェクトがSpring WebFluxとSpring Data R2DBCを使用しており、SQLデータベースをバックエンドとしているかを確認してください。</li></ul>

対策と推奨事項

最も推奨される対策は、脆弱性が修正された最新バージョンの `generator-jhipster` を使用して、**アプリケーションを再生成すること**です。修正が適用されたジェネレーターは、`sort` プロパティをエンティティのメタモデルに対して検証するか、引用符付きの安全なSQL識別子としてレンダリングするように変更されます。

緊急の対応としては、既存のアプリケーションにおいて、`EntityManager.createOrderByFields` メソッド、または関連するAPIエンドポイントで、`sort` パラメータに対する**厳格な入力検証**をバックエンドに追加してください。具体的には、許可されたカラム名のみをホワイトリスト方式で許可し、それ以外の値は拒否するように実装することが重要です。**決してユーザー入力をそのままSQLに連結してはなりません。**

<strong>フロントエンドエンジニアとしての意識向上:</strong>

<ul><li><strong>API設計への関心:</strong> バックエンドAPIがどのような入力を受け付け、どのように処理するのかに関心を持つことで、潜在的な脆弱性パターンを早期に発見できる可能性があります。</li><li><strong>入力検証の徹底:</strong> フロントエンドでの入力検証はユーザーエクスペリエンス向上と負荷軽減に役立ちますが、セキュリティ上の最終的な検証はバックエンドで行われるべきです。しかし、フロントエンド側でも不審な値がバックエンドに渡されないよう、できる限りの対策を講じましょう。</li><li><strong>セキュリティ学習の継続:</strong> SQLインジェクションのような基本的な脆弱性パターンから、より高度なものまで、継続的に学習することで、セキュアなアプリケーション開発に貢献できます。</li></ul>

まとめ:セキュリティはチーム全体の責任

今回のJHipsterの脆弱性は、バックエンドのコードジェネレーターに起因するものですが、その影響はアプリケーション全体に及びます。フロントエンドエンジニアも、バックエンドのセキュリティ脆弱性を「自分ごと」として捉え、開発チーム全体でセキュアなコードを書く文化を育むことが重要です。最新の情報を常にキャッチアップし、安全なアプリケーション開発を心がけましょう。

← ブログ一覧に戻る