Přeskočit na obsah
Tech-Blog Chatujme.cz Chatujme.cz
Bezpečnost

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.

· 87 zhlédnutí

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.

Stránka badhost.org s popisem chyby CVE-2026-48710 a odkazem na skener
Stránka badhost.org shrnuje chybu na jeden odstavec a nabízí skener, kterým si provozovatel může svou adresu vyzkoušet. Foto: vlastní snímek obrazovky, badhost.org (snímek obrazovky)

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

Bezpečnost

CISA Python FastAPI Starlette vLLM

← zpět na výpis