PythonStarlette認証・認可の回避悪用確認

Starletteの脆弱性BadHost、Hostヘッダーでパスによる認証の確認を回避されるおそれ。FastAPIを上げても古い版が残る場合の確かめ方

公開 2026-11-01公表 2026-05-22資料確認 2026-11-01Pythonの脆弱性 233件のまとめ
対象製品Starlette
識別番号CVE-2026-48710
影響範囲1.0.0以前・request.urlで判定する場合
修正情報1.0.1(上げるなら1.3.1以上)

Pythonの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だけが実際のパスとずれる

公式アドバイザリにある仕組みを、入口・組み立て直し・起きることの順に並べる。

攻撃者の要求Hostヘッダーに/、?、#などを含める
要求を送る

Starlette 1.0.0以前

URLの組み立て直しHostヘッダーを検証せず、パスとつないでrequest.urlを作る
振り分け実際のパスで行うため、本来のエンドポイントは動く
request.url.pathが別のパスに見える
パスで判定するミドルウェア特定のパスの下だけを守る確認を回避されるおそれ
Starletteが下で動くパッケージ
FastAPI・vLLM・LiteLLM上のパッケージを上げても、Starletteが古いまま残ることがある

出典 Starlette「GHSA-86qp-5c8j-p5mr」(2026-05-22)

02StarletteのBadHostの影響を受ける条件

公式は、前段のプロキシやロードバランサーが不正なHostを拒否または正規化し、かつアプリがX-Forwarded-Hostなど攻撃者が操作できるヘッダーを他の箇所で信頼していない場合に限り、影響が抑えられると説明しています。[1]

対象の版と影響する使い方は次のとおりです。

項目内容
対象starlette 1.0.0以前(発見者のX41 D-Secは0.8.3以上と記載)[1][2]
修正版1.0.1(5月22日公開)
影響する使い方request.urlやrequest.url.pathでアクセスを判定するコード
深刻度CVSS 3.1で6.5(警告)。StarletteとNVDが同じ値。発見者の評価はCVSS 4.0で7(High)[1][2][3]
悪用9月2日にKEVへ追加[4]

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日

Starletteが公表、修正版1.0.1を公開発見者のX41 D-SecもアドバイザリとPoCを公開
6.5Starletteの評価(CVSS 3.1)

5月27日

NVDに登録NVDの評価もCVSS 3.1の6.5

6月4日

GitHub Advisory Databaseに収録

9月2日

CISAがKEVに追加LiteLLMのCVE-2026-42271(6月8日からKEV)と組み合わせられるおそれ
KEV悪用が確認された脆弱性の一覧

10月31日

EPSSの推定
70.3%今後30日に悪用される見込み

出典 米CISA「Known Exploited Vulnerabilities Catalog」(2026-10-30版)、Starlette「GHSA-86qp-5c8j-p5mr」(2026-05-22)

04攻撃を受けていないかの確認

悪用が確認された脆弱性は、更新に加えて、更新前に攻撃を受けていないかを確認します。

  1. 公開していた期間のWebサーバー・アプリケーションのログで、異常終了や不審な要求がないか確認します。
  2. 見覚えのないファイル(Webシェルなど)や、設定・アカウントの変更がないか確認します。
  3. サーバーから見覚えのない宛先への通信がないか確認します。
  4. 痕跡が見つかった場合は、ログや機器の状態を保全し、専門の窓口に相談します。

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の版を確かめて上げる手順

  1. 稼働中の環境で、Starletteの版と、どのパッケージが使っているか(Required-byの行)を確認します。

    ターミナル
    python -m pip show starlette
  2. FastAPIの版も確認します。FastAPI 0.132系以前はStarletteを1.0.0未満に制限しているので、Starletteを1.0.1以上にするには、FastAPIを0.133.0以上にします。[7]

    ターミナル
    python -m pip show fastapi
  3. lockファイルに記録された版を確認します。上のパッケージを更新しても、lockファイルのStarletteが古いままのことがあります。

    ターミナル
    grep -n -i -A1 'name = "starlette"' poetry.lock uv.lock
    grep -n -i 'starlette' requirements*.txt
  4. Starletteを直接指定して上げます。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
  5. 実際に読み込まれる版を確かめます。コードの中でrequest.url.pathで判定している箇所も探します。

    ターミナル
    python -c "import starlette; print(starlette.__version__)"
    grep -rn 'request.url.path' --include='*.py' .

07すぐ上げられないとき

Starletteのアドバイザリが示す対応は更新で、更新できないときの回避策は書かれていません(前段のプロキシで抑えられる条件は、影響を受ける条件の節のとおりです)。発見者のX41 D-Secは、パスではなくエンドポイントで認証すること、request.url.pathの代わりにrequest.scope["path"]を使うこと、不正なHostを拒否するリバースプロキシやASGIサーバーを置くことを挙げています。これは発見者の推奨で、Starletteが示した回避策ではありません。[1][2]

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以上にできるかで並べる。

1.0.1以上にできない
FastAPI0.132系以前1.0.0未満に制限
LiteLLMのプロキシ1.84.0〜1.87系FastAPIを0.124.4に固定
vLLMなし
できるが自動では上がらない
FastAPI0.133.0以降下限だけ。最新の0.162.0も0.46.0以上
LiteLLMのプロキシなし
vLLM0.22.0・0.23.0Starletteの指定なし
1.0.1以上を求める
FastAPIなし
LiteLLMのプロキシ1.88.0以降1.0.1以上を指定
vLLM0.24.0以降1.0.1以上を指定
だから 上のパッケージだけを上げず、Starletteの版を直接確かめて指定する。

出典 PyPI「fastapi 0.162.0」(2026-10-24)、PyPI「litellm 1.88.0」(2026-06-06)、PyPI「vllm 0.24.0」(2026-06-30)

緊急の場合AI攻撃リスク即点検サービス公開情報と、契約後すぐに用意できるアクセスの記録から先に調べ、被害や狙われやすい構成がないかを早く確かめます。

よくある質問

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]

公表は5月なのに、なぜ今確かめるのですか?

9月2日にKEVに追加され、悪用が確認されたためです。提供元の公表は5月22日で、NVDへの登録は5月27日、GitHub Advisory Databaseへの収録は6月4日です(いずれも日本時間)。[1][3][15]

出典・参考資料

  1. Starlette公式:GHSA-86qp-5c8j-p5mr2026-05-22 / 仕組み、対象(1.0.0以前)、修正版1.0.1、影響する使い方、前段のプロキシの条件、CVSS 3.1 6.5
  2. X41 D-Sec:X41-2026-002(発見者のアドバイザリ)2026-05-22 / 0.8.3以上の記載、CVSS 4.0 7(High)、発見者の推奨する対策、PoC
  3. NVD:CVE-2026-487102026-05-27登録(日本時間) / NVDの評価 CVSS 3.1 6.5、登録日
  4. 米CISA:Known Exploited Vulnerabilities Catalog(JSON版 2026.10.30)2026-09-02追加 / KEVへの追加日、CVE-2026-42271と組み合わせられるおそれの記載
  5. X41 D-Sec:starlette-host-header(PoCと検出用の道具)2026-11-01確認 / PoC・検出スクリプト・SemgrepとCodeQLのルールの公開
  6. FIRST:EPSS(CVE-2026-48710)2026-10-31 / 今後30日に悪用される見込みの推定 70.3%
  7. 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は上限なし)
  8. pip公式:User Guide(Only if needed Recursive Upgrade)2026-11-01確認 / --upgradeの初期設定が依存を必要なときだけ上げること
  9. PyPI:litellm 1.84.02026-05-14 / プロキシの依存でFastAPIを0.124.4に固定(1.84.10・1.85.7・1.86.7・1.87.5も同じ)
  10. PyPI:litellm 1.88.02026-06-06 / プロキシの依存でStarlette 1.0.1以上を指定
  11. PyPI:vllm 0.24.02026-06-30 / Starlette 1.0.1以上の指定(0.22.0・0.23.0は指定なし)
  12. LiteLLM公式:GHSA-4xpc-pv4p-pm3w(CVE-2026-49468)2026-05-29 / LiteLLMのHostヘッダーによる認証回避と1.84.0での修正
  13. Starlette公式:リリースノート2026-10-24更新 / 1.0.1の修正、1.0.0で削除された機能、1.1.0〜1.3.1の修正
  14. Starlette公式:GHSA-jp82-jpqv-5vv32026-06-11 / パスからホスト名を偽れる問題、1.3.0での修正
  15. GitHub Advisory Database:GHSA-86qp-5c8j-p5mr2026-06-04収録(日本時間) / 収録日、原公表日との区別

あわせて読みたい記事

Python公表 2026-10-22

Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)

圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。

Python公表 2026-10-23

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の環境での注意を説明します。

Python公表 2026-10-18

Pillowの脆弱性、olefile入りの環境で細工したFlashPix画像を開くとコード実行のおそれ(CVE-2026-112398、修正は13.0.0)

PythonのPillowの脆弱性CVE-2026-112398は、olefileを入れた環境で細工したFlashPix画像をImage.openで開くと、ヒープの範囲外書き込みで任意のコード実行に至るおそれがあります。対象かの見分け方、13.0.0への更新、すぐ上げられないときの対処を説明します。