CISA zařadila chybu v ověření hlavičky Host ve Starlette mezi zneužívané zranitelnosti
Starlette skládá adresu požadavku z hlavičky Host a do vydání 1.0.1 ji nijak nekontrolovala. Jediný znak navíc proto stačí, aby mezivrstva hlídající přístup viděla jinou cestu, než na kterou požadavek doopravdy míří. Chybu CVE-2026-48710 vede CISA od 2. září mezi zranitelnostmi, u kterých má doklad o zneužití při útocích.
Katalog zneužívaných zranitelností, který vede americká Agentura pro kybernetickou a infrastrukturní bezpečnost (CISA), dostal 2. září sedm nových položek. Šest z nich jsou jména výrobků: Sangoma Switchvox, Kestra, JFrog Artifactory, dvě chyby v zařízeních SonicWall SMA1000 a brána LiteLLM. Sedmá je knihovna, o které nikdo nemluví, protože ji skoro nikdo nepoužívá přímo – Starlette.

Jeden znak v hlavičce
Chyba má číslo CVE-2026-48710 a přezdívku BadHost. Starlette si adresu požadavku, kterou nabízí pod request.url, skládá ze tří kusů: schématu, hodnoty hlavičky Host a cesty z prvního řádku požadavku. Výsledný řetězec pak znovu rozebere. Do vydání 1.0.1 přitom nekontrolovala, jestli hodnota v Host vůbec odpovídá mluvnici, kterou pro ni předepisuje RFC 9112 v oddílu 3.2 – tedy jestli je to jméno stroje a nanejvýš ještě port.
Když se do té hlavičky dostane lomítko, otazník nebo křížek, posunou se při novém rozboru hranice mezi cestou, dotazem a fragmentem. Požadavek GET /foo s hlavičkou Host: example.com/abc?bar= se poskládá na http://example.com/abc?bar=/foo, a request.url.path z toho vrátí /abc.
Směrovač Starlette se ale řídí skutečnou cestou z požadavku, ne tou poskládanou. Obsluha se spustí ta pro /foo, kdežto mezivrstva, která si přečte request.url.path, vidí /abc. Kdo na tom postavil kontrolu přístupu, má ji obejitelnou. Doklad, který k chybě vydala německá firma X41 D-Sec, se vejde na dva řádky:
curl -i -H 'Host: foo' http://target/admin # 403 Forbidden
curl -i -H 'Host: foo?' http://target/admin # 200 OK
Našlo se to při auditu serveru vLLM
Starlette je základ frameworku FastAPI a na FastAPI stojí velká část nástrojů kolem jazykových modelů. X41 D-Sec na chybu narazila 27. ledna 2026 při čtení zdrojového kódu serveru vLLM; ten audit platila nadace OSTIF z peněz projektu Alpha-Omega. Výčet dotčeného softwaru, který OSTIF k chybě zveřejnila, jmenuje vedle vLLM i bránu LiteLLM, Text Generation Inference, servery MCP a rozhraní pro správu modelů.
Že to není jen teorie, ukázala v červnu firma Horizon3. Její výzkumníci spojili BadHost s chybou CVE-2026-42271 v LiteLLM: dvě zkušební koncová místa pro servery MCP tam přijímala celou konfiguraci včetně pole command a spouštěla ji jako podproces. Původně se to bralo jako chyba, ke které je potřeba platný klíč k rozhraní. S BadHostem tahle podmínka padá a zbývá spuštění cizího kódu bez jediné přihlašovací údaje navíc. LiteLLM to opravil 8. května ve verzi 1.83.7 a záznam v katalogu CISA na ten řetěz výslovně odkazuje.
O závažnosti se prameny neshodnou
Kde se prameny rozcházejí, je vážnost. Hlášení správců Starlette dalo chybě podle CVSS 3.1 známku 6,5, tedy střední. X41 D-Sec počítá podle CVSS 4.0 sedmičku a mluví o vysoké závažnosti. Stránka badhost.org, kterou provozují X41 D-Sec, Persistent Security Industries a Bintech, i rozbor na secwest.net píšou rovnou o kritické chybě. OSTIF k odkazu na hlášení z GitHubu připsala, že jeho hodnocení „závažnost té chyby dál v řetězci silně podceňuje“ (v překladu z angličtiny).
Rozdíl dvou tříd není jen slovíčkaření. Podle známky se řídí i to, jak rychle oprava projde distribucemi a jak vysoko ji správce zařadí ve frontě. Vydání Starlette 1.0.1 vyšlo 21. května se seznamem změn o jediné položce a bez zvláštního upozornění, veřejné vyhlášení chyby přišlo den nato. Náskok na nasazení opravy tedy provozovatelé neměli žádný. Podle vlastní časové osy X41 uplynuly od nahlášení do opravy skoro čtyři měsíce, z toho necelé tři ležel navržený patch hotový.
Co s tím
Opravená verze je Starlette 1.0.1 a vyšší. Protože je to skoro vždycky závislost něčeho dalšího, nestačí se podívat na výpis pip list: OSTIF i secwest.net upozorňují, že nástroje kolem jazykových modelů si knihovnu běžně nesou zabalenou v obrazu kontejneru, takže se musí přestavět a znovu nasadit všechno, co ji má připnutou.
Trvalejší je druhá cesta. V mezivrstvách a všude, kde se rozhoduje o přístupu, se místo request.url.path má číst request.scope["path"] – tedy cesta tak, jak ji server ASGI dostal, bez skládání a nového rozboru. Třetí možnost je reverzní proxy, která vadnou hlavičku odmítne; nginx, Apache i Cloudflare to podle X41 dělají ve výchozím nastavení. Aplikace pouštěná přímo na uvicornu, hypercornu, daphne nebo granianu takovou ochranu nemá, a přesně tak bývají zkušební instalace kolem modelů nasazené.
Jestli je konkrétní adresa zranitelná, řekne volně dostupný skener na badhost.org. X41 D-Sec k tomu zveřejnila pravidla pro Semgrep a dotazy pro CodeQL, kterými se dá projet vlastní kód. Ve vlastních záznamech se pokus pozná podle hlavičky Host, ve které stojí lomítko, otazník, křížek, zpětné lomítko nebo zavináč – běžný klient tam žádný z těch znaků neposílá.
Lhůta je delší než u zbytku dávky
U Starlette a LiteLLM dala CISA federálním úřadům čas do 16. září, kdežto zbylým pěti položkám z téže dávky vypršela lhůta už 5. září. Delší termín u těch dvou dává smysl: vyměnit knihovnu schovanou v cizí závislosti trvá déle než nainstalovat záplatu k výrobku. Mimo americkou federální správu je celý katalog jen doporučení – ze zařazení do něj ale plyne, že CISA má doklad o zneužívání téhle chyby při útocích. Jaký ten doklad je, agentura neuvádí.
Zdroje
- CISA: CISA Adds Seven Known Exploited Vulnerabilities to Catalog (2. září 2026) a katalog KEV
- GHSA-86qp-5c8j-p5mr – hlášení správců Starlette
- X41-2026-002: Request Host Header not Validated in Starlette
- OSTIF: Disclosing the BADHOST Vulnerability in Starlette
- Horizon3: CVE-2026-42271 Chained with CVE-2026-48710
- Poznámky k vydání Starlette 1.0.1