アプリの動きを見るために入れた観測の仕組みが、サーバーを止める入口になっていました。OpenTelemetryのPython版の部品opentelemetry-apiに、脆弱性CVE-2026-114603が見つかりました。要求に付く「tracestate」というヘッダーを読む処理が、空白を多く含む長い値に対して、とても時間がかかります。深刻度はMedium(CVSS 3.1で5.3)です。
対象は1.45.0以前で、1.45.1で直っています。1.45.1は2026年10月6日に公開され、プロジェクトの勧告は10月12日に、GitHubの勧告のデータベースには10月23日(日本時間)に載りました。
GitHubの勧告。1.45.0以前が対象、1.45.1で修正出典: GitHub Advisory Database「GHSA-xcq7-p3pf-p88h」(引用)
なぜ処理が止まるのか
OpenTelemetryは、サービスをまたいで処理の流れ(トレース)を追うため、要求のヘッダーで情報を引き継ぎます。tracestateは、その引き継ぎに使うW3Cの決まりのヘッダーの1つです。
勧告によると、opentelemetry-apiは、tracestateを区切るための正規表現で、長さを確かめないまま値を分けていました。空白やタブが続いてコンマが来ない値だと、読む時間が値の長さの二乗に比例して増えます。勧告の測り方では、長さが2倍になるたびに時間が約4倍になりました。
| tracestateの長さ |
1つの要求の処理の時間(勧告の測定) |
| 1万文字 |
約0.06秒 |
| 4万文字 |
約1秒 |
| 8万文字 |
約4秒 |
| 約100KB |
約6秒(空白)〜約12秒(タブ) |
認証は要らず、要求を1回送るだけで起きます。非同期(asyncio)で動くサーバーでは、その間ほかの接続もすべて待たされます。形の合わない値は、警告のログにそのまま全部書き出されるため、ログも膨らみます。
どこから届くか
勧告は、既定の設定(環境変数OTEL_PROPAGATORSの既定はtracecontext,baggage)で、要求を受けるサーバー側の計測が引き継ぎの情報を読むときに届くとしています。例として、ASGIのアプリの計測(opentelemetry-instrumentation-asgi)を挙げています。同じ作りは、2021年3月の1.0.0からありました。
前に置くWebサーバーがヘッダーの大きさを制限していれば、届く前に断られます。勧告の試験の結果は次のとおりです。
| Webサーバー |
長いtracestateの扱い(勧告の試験) |
| gunicorn |
8190バイト以上は断る(431) |
| uvicorn(h11) |
16KiBを超えると断る(400) |
| waitress |
256KiBまで通す |
| uvicorn(httptools。uvicorn[standard]の既定) |
20MBまで通した |
8KiBのヘッダーでも約0.07秒、16KiBで約0.25秒かかるため、上限が16KiBでも、繰り返し送られれば負荷になります。
1.45.1は、読み方を直したうえで、8192文字を超えるtracestateを捨てるようにしています。同じ部品の別の引き継ぎの仕組み(baggage)には、もともと8192バイトの上限がありました。
影響する会社・しない会社
- 影響する: PythonのWebのアプリやAPIで、OpenTelemetryのサーバー側の計測を入れ、opentelemetry-apiの1.45.0以前を使っている会社。とくに、uvicorn[standard]で動かすFastAPIなどのASGIのアプリ
- 確かめる: 社外から要求を受けるサービスで、前にリバースプロキシやロードバランサーを置いている会社。そこでヘッダーの大きさに上限があるかで、届くかどうかが変わります
- 影響しない: OpenTelemetryを入れていない会社、Python以外の言語の版だけを使っている会社。今回の勧告はPython版のopentelemetry-apiが対象です