Starletteの脆弱性BadHost、Hostヘッダーでパスによる認証の確認を回避されるおそれ。FastAPIを上げても古い版が残る場合の確かめ方
CVE-2026-48710PythonのWebフレームワークの土台であるStarletteで、細工したHostヘッダーにより、パスで判定するアクセスの確認を回避されるおそれがある脆弱性(通称BadHost、CVE-2026-48710)が、2026年5月22日にStarletteから公表されました。9月2日には、米CISAの悪用確認の一覧(KEV)に追加されています。StarletteはFastAPIやvLLM、LiteLLMの下で動くため、上のパッケージを上げてもStarletteが古いまま残ることがあります。
- 米国のCISAが、悪用が確認された脆弱性の一覧(KEV)に追加しています。
- 対象はStarlette 1.0.0以前で、修正版は1.0.1です。0系に修正版は無く、1系への更新が要ります。
- 影響するのは、ミドルウェアなどが
request.urlやrequest.url.pathでアクセスを判定している場合です。深刻度はStarletteの評価でCVSS 3.1の6.5(警告)です。 - FastAPIは最新版でもStarletteに0.46.0以上しか求めないため、pipでFastAPIだけを上げても古いStarletteは残ります。Starletteの版を直接確かめます。
01StarletteのBadHostで起きることと仕組み
Starletteは、受け取った要求のURL(request.url)を、Hostヘッダーとパスをつないで組み立て直します。公式アドバイザリによると、1.0.0以前はこのときHostヘッダーを検証していませんでした。Hostに/、?、#などを含めると、組み立て直したURLのパスが、実際に要求されたパスとずれます。[1]
振り分け(ルーティング)は実際のパスで行われるため、本来のエンドポイントは動いたまま、request.url.pathだけが別のパスに見えます。特定のパスの下だけを守るミドルウェアがrequest.url.pathで判定していると、その確認を回避されるおそれがあります。[1]
細工したHostヘッダーで、request.url.pathだけが実際のパスとずれる
公式アドバイザリにある仕組みを、入口・組み立て直し・起きることの順に並べる。
Starlette 1.0.0以前
出典 Starlette「GHSA-86qp-5c8j-p5mr」(2026-05-22)
02StarletteのBadHostの影響を受ける条件
公式は、前段のプロキシやロードバランサーが不正なHostを拒否または正規化し、かつアプリがX-Forwarded-Hostなど攻撃者が操作できるヘッダーを他の箇所で信頼していない場合に限り、影響が抑えられると説明しています。[1]
対象の版と影響する使い方は次のとおりです。
03悪用の状況
米国のCISAは2026年9月2日、CVE-2026-48710を「悪用が確認された脆弱性の一覧(KEV)」に追加しました。実際の攻撃で使われていることを示すため、優先して対応します。
発見者のX41 D-Secは、再現用のアプリと攻撃のコード(PoC)、検出用のスクリプトを公開しています。今後30日に悪用される見込みの推定(EPSS)は70.3%です(10月31日時点)。KEVの説明には、LiteLLMのコマンド実行の脆弱性(CVE-2026-42271、6月8日からKEV)と組み合わせられるおそれがあると書かれています。[4][5][6]
5月22日に公表、9月2日にKEVへ追加され、悪用の見込みの推定は70.3%
公表、データベースへの登録、KEVへの追加の日付を並べる(日本時間)。
2026年5月22日
5月27日
6月4日
9月2日
10月31日
出典 米CISA「Known Exploited Vulnerabilities Catalog」(2026-10-30版)、Starlette「GHSA-86qp-5c8j-p5mr」(2026-05-22)
04攻撃を受けていないかの確認
悪用が確認された脆弱性は、更新に加えて、更新前に攻撃を受けていないかを確認します。
- 公開していた期間のWebサーバー・アプリケーションのログで、異常終了や不審な要求がないか確認します。
- 見覚えのないファイル(Webシェルなど)や、設定・アカウントの変更がないか確認します。
- サーバーから見覚えのない宛先への通信がないか確認します。
- 痕跡が見つかった場合は、ログや機器の状態を保全し、専門の窓口に相談します。
05Starletteの対象の版と推奨する版
1.0.1は、Hostヘッダーを規格(RFC 9112・RFC 3986)の文法で確かめ、不正な値のときは接続の情報(scope["server"])を使うように直した版です。その後、パスの側からホスト名を偽れる低い深刻度の問題(GHSA-jp82-jpqv-5vv3)が1.3.0で、別の高い深刻度の問題(CVE-2026-54283など)が1.1.0と1.3.1で直っています。上げるなら1.3.1以上にします。[1][13][14]
0系には修正版が無いため、0.52.1以前からは1系への更新になります。1.0.0では、on_startup・on_shutdown、on_event()、@app.route()などの古い書き方が削除されました。Starletteを直接使っているアプリは、検証環境で起動と動作を確かめます。最新の1.10.0はPython 3.11以上が必要で、Python 3.10の環境には1.7.0までが入ります。[13]
06Starletteの版を確かめて上げる手順
稼働中の環境で、Starletteの版と、どのパッケージが使っているか(Required-byの行)を確認します。
ターミナルpython -m pip show starletteFastAPIの版も確認します。FastAPI 0.132系以前はStarletteを1.0.0未満に制限しているので、Starletteを1.0.1以上にするには、FastAPIを0.133.0以上にします。[7]
ターミナルpython -m pip show fastapilockファイルに記録された版を確認します。上のパッケージを更新しても、lockファイルのStarletteが古いままのことがあります。
ターミナルgrep -n -i -A1 'name = "starlette"' poetry.lock uv.lock grep -n -i 'starlette' requirements*.txtStarletteを直接指定して上げます。FastAPIを使っている場合は一緒に指定します。uvやPoetryでは、lockファイルのStarletteだけを更新できます(使っているツールの行を実行します)。
ターミナルpython -m pip install --upgrade "starlette>=1.3.1" "fastapi>=0.133.0" uv lock --upgrade-package starlette poetry update starlette実際に読み込まれる版を確かめます。コードの中で
request.url.pathで判定している箇所も探します。ターミナルpython -c "import starlette; print(starlette.__version__)" grep -rn 'request.url.path' --include='*.py' .
07すぐ上げられないとき
08FastAPI・vLLM・LiteLLMを上げても、古いStarletteが残る理由
pipの--upgradeは、指定したパッケージを上げ、その依存は条件を満たしていればそのまま残します(初期設定のonly-if-needed)。FastAPIは、11月1日時点の最新版0.162.0でも、Starletteに0.46.0以上しか求めていません。そのため、古いStarletteが入った環境でFastAPIだけを上げても、Starletteは対象の版のまま残ります。[7][8]
逆に、上のパッケージが古いStarletteしか許さない場合もあります。PyPIに登録された依存の指定は次のとおりです。[7][9][10][11]
| パッケージと版 | Starletteへの指定 | 1.0.1以上にできるか |
|---|---|---|
| FastAPI 0.132系以前 | 1.0.0未満(0.128系以前は0.51.0未満) | できない。0.133.0以上が要る |
| FastAPI 0.133.0以降 | 下限だけ(0.135.0以降は0.46.0以上) | できるが、自動では上がらない |
| LiteLLMのプロキシの1.84.0〜1.87系 | FastAPIを0.124.4に固定(Starletteは0.51.0未満) | できない |
| LiteLLMのプロキシの1.88.0以降 | 1.0.1以上 | できる |
| vLLM 0.22.0・0.23.0 | 指定なし(FastAPI 0.115.0以上) | 自動では上がらない |
| vLLM 0.24.0以降 | 1.0.1以上 | できる |
LiteLLMは1.84.0で、自分の認証の判定がStarletteの組み立て直したパスに頼っていた問題(CVE-2026-49468)を直しました。これはLiteLLM側の修正で、同じ環境のStarletteの版は変わりません。LiteLLMそのものの脆弱性と版の切り分けは、LiteLLMの脆弱性とバージョンの記事で説明しています。[12]
脆弱性の公表・更新一覧で、Pythonの関連情報を調べることもできます。
FastAPI・LiteLLM・vLLMの版によって、Starletteを1.0.1以上にできるかが分かれる
PyPIに登録された依存の指定を、1.0.1以上にできるかで並べる。
出典 PyPI「fastapi 0.162.0」(2026-10-24)、PyPI「litellm 1.88.0」(2026-06-06)、PyPI「vllm 0.24.0」(2026-06-30)

よくある質問
FastAPIを使っていますが、対象ですか?
FastAPIの下のStarletteが1.0.0以前で、アクセスの判定にrequest.urlを使うコード(自作のミドルウェアなど)がある場合が対象です。FastAPIの版ではなく、Starletteの版で判断します。[1]
FastAPIを最新にすれば直りますか?
直るとは限りません。FastAPIはStarletteの下限しか決めていないため、古いStarletteが入ったままになることがあります。python -m pip show starletteで版を確かめます。[7]
前段にnginxやロードバランサーがあれば大丈夫ですか?
公式は、前段が不正なHostを拒否または正規化し、アプリがX-Forwarded-Hostなども信頼していない場合に限り、影響が抑えられると説明しています。前段の設定を確かめないまま、対象外とは判断できません。[1]
出典・参考資料
- Starlette公式:GHSA-86qp-5c8j-p5mr2026-05-22 / 仕組み、対象(1.0.0以前)、修正版1.0.1、影響する使い方、前段のプロキシの条件、CVSS 3.1 6.5
- X41 D-Sec:X41-2026-002(発見者のアドバイザリ)2026-05-22 / 0.8.3以上の記載、CVSS 4.0 7(High)、発見者の推奨する対策、PoC
- NVD:CVE-2026-487102026-05-27登録(日本時間) / NVDの評価 CVSS 3.1 6.5、登録日
- 米CISA:Known Exploited Vulnerabilities Catalog(JSON版 2026.10.30)2026-09-02追加 / KEVへの追加日、CVE-2026-42271と組み合わせられるおそれの記載
- X41 D-Sec:starlette-host-header(PoCと検出用の道具)2026-11-01確認 / PoC・検出スクリプト・SemgrepとCodeQLのルールの公開
- FIRST:EPSS(CVE-2026-48710)2026-10-31 / 今後30日に悪用される見込みの推定 70.3%
- PyPI:FastAPI 0.162.02026-10-24 / 最新版のStarletteの指定(0.46.0以上)。各版の指定はPyPIの版ごとの頁で確認(0.132.1は1.0.0未満、0.128.0は0.51.0未満、0.133.0は上限なし)
- pip公式:User Guide(Only if needed Recursive Upgrade)2026-11-01確認 / --upgradeの初期設定が依存を必要なときだけ上げること
- PyPI:litellm 1.84.02026-05-14 / プロキシの依存でFastAPIを0.124.4に固定(1.84.10・1.85.7・1.86.7・1.87.5も同じ)
- PyPI:litellm 1.88.02026-06-06 / プロキシの依存でStarlette 1.0.1以上を指定
- PyPI:vllm 0.24.02026-06-30 / Starlette 1.0.1以上の指定(0.22.0・0.23.0は指定なし)
- LiteLLM公式:GHSA-4xpc-pv4p-pm3w(CVE-2026-49468)2026-05-29 / LiteLLMのHostヘッダーによる認証回避と1.84.0での修正
- Starlette公式:リリースノート2026-10-24更新 / 1.0.1の修正、1.0.0で削除された機能、1.1.0〜1.3.1の修正
- Starlette公式:GHSA-jp82-jpqv-5vv32026-06-11 / パスからホスト名を偽れる問題、1.3.0での修正
- GitHub Advisory Database:GHSA-86qp-5c8j-p5mr2026-06-04収録(日本時間) / 収録日、原公表日との区別
あわせて読みたい記事
Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)
圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。
TwistedのHTTP/2の脆弱性、1接続でCPUを使い切らせるおそれと、HTTP/2が有効かの確かめ方・26.10.0への更新(GHSA-vpp8-g58w-m8mp)
Python向けTwistedのHTTP/2サーバーに、認証なしの1接続でCPUを使い切らせる脆弱性があり、10月30日に正式版26.10.0で直りました。HTTP/2が動く条件(h2とTLS)の確かめ方、修正の効き方、CVE番号の扱い、Python 3.9の環境での注意を説明します。
Pillowの脆弱性、olefile入りの環境で細工したFlashPix画像を開くとコード実行のおそれ(CVE-2026-112398、修正は13.0.0)
PythonのPillowの脆弱性CVE-2026-112398は、olefileを入れた環境で細工したFlashPix画像をImage.openで開くと、ヒープの範囲外書き込みで任意のコード実行に至るおそれがあります。対象かの見分け方、13.0.0への更新、すぐ上げられないときの対処を説明します。