[技術解説] OpenTelemetry JaegerPropagatorにおけるDoS脆弱性 (GHSA-45rx-2jwx-cxfr / CVE-2026-59892)
はじめに
日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、OpenTelemetryのJaegerPropagatorに発見されたサービス運用妨害(Denial of Service: DoS)の脆弱性(GHSA-45rx-2jwx-cxfr / CVE-2026-59892)について解説します。この脆弱性は、特定の条件下でNode.jsアプリケーションを予期せずシャットダウンさせる可能性があり、皆さんの開発・運用環境に直接的な影響を及ぼす可能性があります。OpenTelemetryを利用している場合は、ぜひ最後までお読みいただき、ご自身のプロジェクトが影響を受けるか確認してください。
脆弱性の詳細
この脆弱性は、OpenTelemetry JavaScriptのトレーシングにおけるJaeger Propagator(`@opentelemetry/propagator-jaeger`)に存在します。具体的には、このコンポーネントが受信HTTPヘッダー値のデコードに `decodeURIComponent()` 関数を使用する際に、不正なパーセントエンコードされた値(例: `%` のみ)が渡されると、デコードエラーの処理が不足しているため、`URIError` をスローしてしまいます。
`JaegerPropagator.extract()` メソッドは、`uber-trace-id` ヘッダーや `uberctx-*` ヘッダーの値に対して `decodeURIComponent()` を呼び出します。通常、HTTPヘッダーには正しくエンコードされた値が期待されますが、もし攻撃者が不正なパーセントエンコード文字列を含むこれらのヘッダーを送信した場合、Node.jsプロセスがキャッチされない `URIError` を受け取ります。単一の未処理の例外は `uncaughtException` として伝播し、結果としてアプリケーションのNode.jsプロセス全体が停止してしまいます。
深刻度と影響
この脆弱性は深刻度「High」と評価されています。主な影響は「サービス運用妨害 (Denial of Service; DoS)」です。詳細な内容は以下の通りです。
認証されていないリモートの攻撃者でも、影響を受けるサービスに対して単一の悪意あるHTTPリクエストを送信するだけで、そのプロセスを強制終了させることが可能です。これにより、アプリケーションが応答不能となり、サービスが停止します。幸いにも、この脆弱性による機密性の侵害やデータの完全性への影響(データ漏洩や改ざんなど)は報告されていません。
あなたのプロジェクトは影響を受けますか?
この脆弱性は、OpenTelemetryの特定の、オプトイン構成を使用している場合にのみ影響を受けます。OpenTelemetryのデフォルトのプロパゲーター(W3C TraceContextおよびBaggage)を使用している場合は、この脆弱性の影響を受けません。
以下の条件を両方満たす場合に、あなたのプロジェクトは影響を受けます。あなたの `package.json` や環境設定を確認してください。
1. **`@opentelemetry/propagator-jaeger` が依存関係ツリーに存在するかどうか。**
2. **`JaegerPropagator` がアクティブなプロパゲーターとして登録されているかどうか。** これは以下のいずれかの方法で確認できます。
* 環境変数 `OTEL_PROPAGATORS` が `jaeger` に設定されている場合。
* コード内で `propagation.setGlobalPropagator(new JaegerPropagator())` を直接呼び出している場合。
**注意:** もし `JaegerPropagator` が `CompositePropagator` (例: `OTEL_PROPAGATORS=jaeger,tracecontext`) と組み合わせて使用されている場合、プロセスは即座に終了しません。`CompositePropagator` がエラーをキャッチするためです。しかし、この場合も影響を受けるリクエストではコンテキストの抽出がサイレントに失敗します。そのため、この場合でもアップグレードを強く推奨します。
対策と緩和策
最も効果的で推奨される対策は、`@opentelemetry/propagator-jaeger` パッケージをバージョン `2.9.0` 以降にアップデートすることです。パッチが適用されたバージョンでは、不正なデコード値を安全に無視するようになり、`URIError` がスローされなくなります。
アップデート方法は、ご使用のパッケージマネージャーによって異なります(例: `npm update @opentelemetry/propagator-jaeger` または `yarn upgrade @opentelemetry/propagator-jaeger`)。
もし直ちにパッケージのアップデートが難しい場合は、以下の暫定的な緩和策を検討してください。
トレーシングコンテキストヘッダーは、通常、信頼できない発信元から直接受け入れるべきではありません。サービスのエッジ(リバースプロキシ、APIゲートウェイ、ロードバランサーなど)で、`uber-trace-id` および `uberctx-*` ヘッダーをフィルタリングまたは検証し、信頼できるアップストリームサービスのみがこれらのヘッダーを設定できるように設定することを検討してください。例として、nginxやEnvoyなどの設定で、これらのヘッダーを削除または正規表現で検証するルールを追加することができます。
まとめ
OpenTelemetryのJaegerPropagatorにおけるDoS脆弱性は、Node.jsアプリケーションの可用性に深刻な影響を与える可能性があります。対象となる環境を使用している場合は、できるだけ早く `@opentelemetry/propagator-jaeger` をバージョン `2.9.0` 以降にアップデートしてください。
継続的なセキュリティ対策は、安定したサービス運用に不可欠です。日頃から依存パッケージのセキュリティ情報をチェックし、最新の状態を保つよう心がけましょう。