この脆弱性は、OSTIFの資金提供によるvLLMのセキュリティ監査の中で、X41 D-Secによって発見されました。その根本原因は、驚くほど単純でありながら深刻な見落としにあります。Starletteは、攻撃者が自由に操作できるHostヘッダーの値を、事前に検証することなくrequest.urlオブジェクトの再構築に使用していました。フレームワークのルーティングエンジンは生のHTTPパスに基づいてリクエストを適切に処理しますが、認証ミドルウェアは再構築されたURLからrequest.url.pathを読み取るため、ここに決定的な矛盾が生じ、巨大なセキュリティホールが開いてしまうのです 。
StarletteのURL再構築ロジックが、ルーティングされるパスと認証されるパスとの間に危険な不一致を生み出します。HTTPリクエストが到着すると、ルーターはリクエスト行から正しくアクセス先のエンドポイントを特定します。しかし、アプリケーションが後になってユーザーの認可を判断するためにrequest.urlを確認する際、StarletteはHostヘッダーとリクエストパスを連結してURLを再構築し、再解析してしまいます 。
攻撃者はこの挙動を悪用し、例えば、保護されたエンドポイント/admin/secureに対して、以下のように細工したHostヘッダーを付けてリクエストを送信します。
Host: legitimate.com/health?x=
ルーターはリクエストを正しく/admin/secureのハンドラーへ転送します。しかし、認証ミドルウェアがrequest.url.pathを調べると、そこには/healthというパスが見えます。もしミドルウェアが/healthを公開用のヘルスチェックエンドポイントとして許可リストに登録していれば、攻撃者は認証を難なく通過します。パスワードもトークンも、被害者の操作も一切不要です。認証チェックは音もなく迂回されてしまうのです 。
X41 D-Secの勧告は、その驚くべき単純さをこう強調しています。「HTTP Hostヘッダーに1文字挿入するだけで、サーバーを騙すのに十分です」。この混乱を引き起こす具体的な文字は、スラッシュ(/)、疑問符(?)、ハッシュ記号(#)といった、URLの標準的な区切り文字です。Starletteはこれらの文字を検証していませんでした 。
この脆弱性の影響範囲は計り知れません。Starletteは、1週間に約3億2500万回もダウンロードされる、主要なPythonベースのAI推論・オーケストレーションツールのほぼすべてを陰で支えるエンジンです 。バージョン1.0.1より前のStarletteを利用する、以下のような下流プロジェクトすべてが影響を受けます。
影響が確認されているバージョンはStarlette 0.8.3以上、1.0.1未満です。つまり、長年にわたり安定版を運用してきたシステムも、潜在的に脆弱であることを意味します 。
CVE-2026-48710の公式な深刻度評価をめぐり、セキュリティコミュニティで大きな意見の相違が生じています。
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:Nは、機密性と完全性への影響を「低」と評価し、影響範囲を「変更なし」に限定。可用性への影響はないとしています 。CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:Nは、影響範囲を「変更あり」とし、後続システムへの機密性・完全性への影響を「高」と評価。AIエージェントアーキテクチャで発生する、境界を越えた権限昇格の実態をより正確に捉えています 。専門家たちが「6.5」は危険なほど低いと主張する根拠は、以下の3点に集約されます。
SC:H/SI:H(後続システムへの高い影響)という指標でようやく捉えられる、教科書的な「後続影響」です 。2026年5月22日にリリースされたStarlette バージョン1.0.1には、決定的なパッチが含まれています。この修正は、GitHub Security Advisory (GHSA-86qp-5c8j-p5mr) およびX41アドバイザリ (X41-2026-002) で追跡されています 。
このパッチは、以下の2つの中核的な保護機能を実装しています。
request.urlの構築に使用される前に、HostヘッダーがRFC 9112 §3.2 および RFC 3986 §3.2.2 で規定された文法に照らして検証されるようになりました 。scope["server"]にフォールバックします。これにより、request.url.pathは常に実際にルーティングされたパスを一貫して反映するようになります 。FastAPIプロジェクトも、この修正が有効であることを確認し、starletteを1.0.1以上に直ちにアップグレードすることを推奨しています 。
Starletteパッケージのアップグレードは不可欠な第一歩ですが、包括的な防御には多層的なアプローチが必要です。
直ちにパッチを適用する。 AIインフラを実行するすべての仮想環境、コンテナイメージ、デプロイメントパイプラインで、以下を実行します。
pip install --upgrade starlette
影響を受けるすべてのサービスを再起動してください。これは、Starletteを直接使用している場合だけでなく、FastAPI、vLLM、LiteLLM、MCPサーバーのインスタンスにも適用されます 。
依存関係を監査し、バージョンを固定する。 FastAPIなどのフレームワークが、Starletteの最小バージョンを自動的に強制するとは限りません。requirements.txt、pyproject.toml、poetry.lock、または同等のロックファイルで、starlette>=1.0.1を明示的に要求してください。全環境でpip list | grep starletteを実行し、古いインストールを特定します 。
AIスタックの全コンポーネントをスキャンする。 HTTPを提供するあらゆるPythonサービス(カスタムFastAPIアプリ、LLM推論エンドポイント、エージェントオーケストレーション基盤、モデル評価パネル、OpenAI互換プロキシなど)が、脆弱なStarletteバージョンを組み込んでいる可能性があります。インフラストラクチャ全体の監査を実施してください 。
リバースプロキシとWAFを強化する。 nginx、Envoy、HAProxy、Cloudflare、AWS ALBなどで、トラフィックをPythonアプリケーションに転送する前に、不正な形式のHostヘッダーを拒否または無害化するよう設定します。これにより、アプリケーション層のパッチ適用が遅れた場合でも、悪用をブロックする多層防御が提供されます 。
request.url.pathに依存したパス安全性チェックを書き換える。 根本原因は、ルーティングパスとrequest.url.pathの不一致でした。可能な限り、認証ミドルウェアをrequest.scope["path"]を使用するように切り替えてください。これは生のASGIスコープから導出されるため、Hostヘッダーによる汚染を受けません 。X41 D-Secは、パスベースの認証を完全に避け、エンドポイント固有の認証メカニズムを採用することを推奨しています 。
露出状況をテストする。 組織が自社サーバーの脆弱性有無を確認するためのオンラインスキャナが公開されています 。認証境界に対する徹底的なペネトレーションテストと組み合わせることで、見落とされた攻撃対象領域を明らかにできます。
Debianベースのデプロイメントでは、CVE-2026-48710はDebianセキュリティトラッカーで「重要(important)」として追跡されており、影響を受けるスイート向けにパッチ適用済みのstarletteポイントリリースが利用可能です 。bullseye-security相当のリポジトリから修正aptトランザクションを適用し、影響を受けるsystemdユニットファイルを再読み込みしてください 。