[緊急] Node.jsアプリをクラッシュさせるOpenTelemetry Prometheus exporterのDoS脆弱性 (GHSA-q7rr-3cgh-j5r3)
Node.jsアプリに潜むDoSの脅威!OpenTelemetry Prometheus exporterの脆弱性について
フロントエンド開発においても、監視やメトリクス収集は重要な要素です。特にNode.jsでバックエンドやAPIサーバーを構築している場合、OpenTelemetryを利用してPrometheusにメトリクスをエクスポートしている方も多いのではないでしょうか。今回は、この`@opentelemetry/exporter-prometheus`ライブラリに報告された、サービス停止につながる深刻な脆弱性(GHSA-q7rr-3cgh-j5r3, CVE-2026-44902)について、その詳細と対応策を解説します。
脆弱性の概要と仕組み:なぜアプリケーションがクラッシュするのか?
この脆弱性は、Node.jsアプリケーションがOpenTelemetry JS Prometheus exporterを使用している場合に発生します。具体的には、Prometheus metricsのエンドポイント(デフォルトでは`0.0.0.0:9464`)が、URIが壊れたり不正な形式のHTTPリクエストを受け取った際に、URL解析時のエラーハンドリングが適切に行われないことに起因します。
結果として、Node.jsの内部で捕捉されない`TypeError`が発生し、アプリケーションプロセス全体が強制終了(クラッシュ)してしまいます。攻撃者は認証なしで、たった1つの不正なHTTPリクエストを送るだけで、あなたのサービスを停止させることが可能となるため、非常に危険な脆弱性です。
あなたのアプリケーションは大丈夫?影響を受ける条件を確認しよう
以下のいずれかの条件に該当する場合、この脆弱性の影響を受ける可能性があります。
**1. `@opentelemetry/exporter-prometheus` を組み込みサーバーとして直接使用しているケース:**
ご自身のコードで`@opentelemetry/exporter-prometheus`を組み込みサーバーとして直接使用している場合です。例えば、Next.jsのAPIルートやExpressなどのバックエンドで、メトリクス収集のためにこのエクスポーターを導入しているケースが該当します。
**2. 環境変数とSDKを併用しているケース:**
環境変数`OTEL_METRICS_EXPORTER`に`prometheus`が含まれており、かつ`@opentelemetry/sdk-node`または`@opentelemetry/auto-instrumentations-node`を使用している場合も対象です。これは、Node.jsアプリケーションの自動計装やSDKを通じてPrometheus exporterが有効になっているシナリオです。
具体的な影響:サービス停止 (Denial of Service) の危険性
この脆弱性の最も直接的な影響は、アプリケーションのサービス停止(Denial of Service; DoS)です。攻撃者がmetricsエンドポイントに特定の不正なHTTPリクエストを送信するだけで、アプリケーションは即座にクラッシュします。これにより、ユーザーはサービスを利用できなくなり、ビジネスに大きな損害を与える可能性があります。特に認証が不要で実行できるため、誰でも容易に攻撃できてしまう点が深刻です。
最優先で実施すべき対応策:ライブラリの速やかなアップデート
最も推奨される、そして最も効果的な対策は、関連するライブラリを速やかに最新バージョンにアップデートすることです。以下のバージョン以降では、URL構築時のエラーが適切に処理され、プロセスをクラッシュさせる代わりにHTTP 400エラーが返されるようになります。
**アップデート対象ライブラリと推奨バージョン:**
* `@opentelemetry/exporter-prometheus` を **0.217.0** 以降にアップデートしてください。
* `@opentelemetry/sdk-node` を **0.217.0** 以降にアップデートしてください。
* `@opentelemetry/auto-instrumentations-node` を **0.75.0** 以降にアップデートしてください。
これらのアップデートは、`npm`または`yarn`コマンドで簡単に実行できます。
```bash npm install @opentelemetry/exporter-prometheus@latest @opentelemetry/sdk-node@latest @opentelemetry/auto-instrumentations-node@latest # または個別に npm install @opentelemetry/exporter-prometheus@0.217.0 ```
`package.json`の依存関係も確認し、必要であればバージョン指定を更新してください。
アップデートが困難な場合の緩和策(一時的対応)
何らかの事情により、すぐに上記ライブラリのアップデートが難しい場合でも、一時的な緩和策としてmetricsエンドポイントへのアクセスを制限することでリスクを軽減できます。ただし、これらはあくまで一時的な措置であり、最終的にはアップデートを行うことを強く推奨します。
**1. localhostのみにバインドする:**
`PrometheusExporter`のインスタンスを生成する際に、`host`オプションを`127.0.0.1`に設定し、外部からの直接アクセスを制限します。これにより、アプリケーションが動作しているサーバーからのみmetricsエンドポイントにアクセスできるようになります。
```javascript import { PrometheusExporter } from '@opentelemetry/exporter-prometheus'; const exporter = new PrometheusExporter({ port: 9464, host: '127.0.0.1', // ここをlocalhostに設定 }); exporter.startServer(); ```
**2. ファイアウォールやネットワークポリシーを使用する:**
サーバーのファイアウォール設定(例: iptables, security groups)や、Kubernetesなどの環境でのネットワークポリシーを利用して、metricsポート(デフォルト`9464`)へのアクセスを、信頼できるPrometheusスクレイプホストなど、特定のIPアドレスやネットワークに限定します。
**3. リバースプロキシを介して公開する:**
NginxやCaddyなどのリバースプロキシを介してmetricsエンドポイントを公開し、プロキシ側で不正なリクエストのフィルタリング、レートリミット、認証などの追加のセキュリティ対策を講じます。
まとめ
OpenTelemetry Prometheus exporterのDoS脆弱性は、Node.jsアプリケーションの安定稼働に直接影響を及ぼす深刻な問題です。フロントエンドエンジニアの皆さんも、Next.jsのAPIやNode.jsのユーティリティを開発する際に、このライブラリを使用している可能性があるので、一度ご自身のプロジェクトの依存関係を確認してください。
セキュリティは継続的な取り組みです。常に最新の情報をチェックし、依存ライブラリを適切に管理していくことが重要です。