Přeskočit na obsah
Bezpečnost 3 min čtení

Spring AI 2.0.1 nastavila strop na 100 000 relací serveru MCP

Spring AI 2.0.0 dovolovala vzdálenému klientovi bez přihlášení opakovanými inicializacemi postupně vyčerpat paměť serveru. Oprava z 21. srpna omezuje počet relací, ale jejich automatické ukončení po nečinnosti zůstává ve výchozím nastavení vypnuté.

Otevřený rackový server s paměťovými moduly a rozšiřujícími kartami
Relace serveru zůstávají v paměti, dokud je aplikace neodstraní. Foto: Donovan Henneberg-Verity, Flickr (CC BY-SA 2.0)

Každá inicializace založila další relaci

Server MCP používá požadavek initialize jako úvodní podání ruky. Ve Spring AI 2.0.0 po něm vytvořil relaci, přidělil jí identifikátor a uložil ji do mapy v paměti. Počet položek neměl žádný strop. Klient navíc ve výchozím nastavení nemusel být přihlášený.

Vzdálenému klientovi proto stačilo posílat nové inicializace. Server pro každou držel další stav a paměť postupně ubývala, až služba přestala obsluhovat i běžné uživatele. Problém se týkal obou variant přenosu Streamable HTTP, tedy reaktivního WebFluxu i klasického WebMVC. Nešlo o čtení dat ani změnu obsahu; dopad mířil na dostupnost.

CVE-2026-59279 má podle výpočtu Springu známku 7,5 z deseti. Vektor počítá s útokem po síti, nízkou složitostí, nulovým oprávněním a bez zásahu uživatele. Bezpečnostní upozornění Springu uvádí jako dotčenou pouze verzi 2.0.0.

Nové relace nad limit dostanou odpověď 503

Opravující commit přidal do obou serverových transportů hodnotu maxSessions. Pokud ji vývojář nenastaví, platí 100 000. Jakmile mapa relací tohoto počtu dosáhne, další požadavek initialize skončí stavem 503 Service Unavailable a server novou relaci nevytvoří.

Změna řeší i opakovanou inicializaci uvnitř už založené relace. Nese-li požadavek na inicializaci hlavičku Mcp-Session-Id, server ho nově odmítne stavem 400. Běžné požadavky GET a POST naopak zaznamenají nový čas posledního použití relace.

Strop mění neomezený růst na konečné číslo, neříká však, kolik paměti smí server relacím skutečně dát. Podklady neuvádějí velikost jedné relace ani měření spotřeby při výchozích 100 000 položkách. Z toho nelze poctivě vypočítat, zda je výchozí limit bezpečný pro malou haldu paměti.

Úklid nečinných relací je ve výchozím stavu vypnutý

Druhá nová volba se jmenuje sessionIdleTimeout. Po jejím nastavení server pravidelně hledá relace, které se déle nepoužily, odstraní je z mapy a korektně je zavře. Každý platný požadavek čas posledního použití posune.

Výchozí hodnota je ale null, takže se tento úklid sám nezapne. Opuštěné relace mohou dál zůstat v paměti až do jejich výslovného smazání nebo ukončení serveru. Po dosažení limitu dostanou stav 503 i legitimní klienti, dokud se místo neuvolní. Verze 2.0.1 tedy brání nekonečnému přidávání položek, sama od sebe však nepozná, které z nich už nikdo nepotřebuje.

Spring hlídá ještě vztah ke zprávám keep-alive, jimiž server ověřuje živé klienty. Pokud vývojář zapne oba mechanismy, doba nečinnosti musí být delší než interval keep-alive. Jinak sestavení transportu skončí chybou, protože aktivní klient by mohl být odstraněn dřív, než stačí odpovědět.

Záplata vyšla hodinu a 44 minut před záznamem CVE

Spring AI 2.0.1 vyšla 21. srpna v 10:23 UTC. Záznam CVE byl zveřejněn ve 12:07 UTC téhož dne, tedy o hodinu a 44 minut později; stránka bezpečnostního upozornění nese datum 20. srpna. Poznámky k vydání opravu jmenují v oddílu chyb jako „Introduce maxSessions and sessionIdleTimeout“ a odkazují na hlášení číslo 6760.

CISA ve svém doplnění záznamu z 21. srpna neuváděla známé aktivní zneužívání. Útok ale označila za automatizovatelný a technický dopad za částečný. To odpovídá mechanismu: jednotlivé inicializace nevyžadují ruční práci, ale chyba nezasahuje důvěrnost ani správnost dat.

Aktualizace zastaví růst, limit má odpovídat serveru

Spring doporučuje přejít z verze 2.0.0 na otevřenou verzi 2.0.1; zákazníkům placené podpory nabízí také větev 2.0.0.1. Další náhradní opatření v upozornění nepožaduje. Provozovatel má přesto důvod zkontrolovat nastavení konkrétního transportu: výchozích 100 000 relací je obecná hodnota, nikoli číslo odvozené od velikosti jeho paměti a běžného počtu klientů.

U veřejně dostupného serveru dává smysl zvolit limit podle skutečné kapacity a zapnout dobu nečinnosti, která opuštěné relace vrátí do volné kapacity. Přihlášení před vstupem na server navíc zmenší okruh lidí, kteří mohou nové relace zakládat. Samotná aktualizace je nutný první krok; až vlastní limit rozhoduje, kolik rozpracovaných relací bude nasazení ochotné držet.

Zdroje

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

  1. Bezpečnost

    Knihovna Transformers čte podle indexu i soubory mimo složku modelu a opravu nemá

    Když Transformers načítá model rozdělený do víc souborů, vezme jejich jména z indexu ležícího vedle vah a připojí je ke složce modelu bez jediné kontroly. Jméno, které…

  2. Bezpečnost

    Servery MCP rodiny faf mají opravu, tři jejich kopie na npm ji nemají

    Databáze GitHubu vydala 19. srpna 2026 tři bezpečnostní hlášení k balíčkům faf-mcp, claude-faf-mcp a grok-faf-mcp: jejich nástroje si nechaly podstrčit cestu k…

  3. Bezpečnost

    Databáze GitHubu vedla chybu v MONAI jako opravenou ve verzi, která vyšla před hlášením

    Hlášení GHSA-89gg-p5r5-q6r4 o spuštění cizího kódu v knihovně MONAI uvádělo od 7. dubna do 31. července 2026 jako opravenou verzi 1.5.2. Ta přitom vyšla 29. ledna a…

  4. Bezpečnost

    Webhooky MLflow vydaly obsah z vnitřní sítě i nepřihlášenému útočníkovi

    Výchozí server MLflow nechává rozhraní pro webhooky bez přihlášení a jeho pojistku proti SSRF šlo obejít obyčejným přesměrováním. Útočník tak mohl serveru poručit, ať…