Ruby SDK protokolu MCP dostalo pět CVE. Opravy vyšly o tři týdny dřív než hlášení
Databáze bezpečnostních hlášení GitHubu přidala 30. července 2026 k oficiální rubyové knihovně protokolu MCP pět záznamů najednou, dva s vysokou závažností. Všechny opravuje verze 0.23.0, jenže ta vyšla už 7. července. U nejzávažnějšího z nich je navíc oprava jen volitelný hák, který si musí zapnout provozovatel serveru.

Model Context Protocol, zkráceně MCP, je domluva, podle které si jazykový model sáhne na cizí nástroj – na databázi, na souborový systém, na evidenci chyb. Server, který ten nástroj nabízí, běží typicky na vývojářském počítači. Pro Ruby k protokolu existuje oficiální knihovna, gem mcp. Databáze bezpečnostních hlášení GitHubu k ní 30. července 2026 přidala pět záznamů najednou; v registru CVE nesou datum o den dřívější.
Pět záznamů, jedna opravená verze
- CVE-2026-67431 – vysoká, CVSS 4.0 8,3: kdo získá cizí identifikátor relace, může na ni posílat volání nástrojů. Odpověď přijde původnímu klientovi, takže si toho nemusí všimnout.
- CVE-2026-67432 – vysoká, CVSS 3.1 7,5: přenos přečte celé tělo požadavku JSON-RPC do paměti bez horní meze.
- CVE-2026-67430 – střední: relace ve výchozím nastavení nikdy nevypršely.
- CVE-2026-63119 – střední: čtení rámce přes standardní vstup nemělo limit délky řádku.
- CVE-2026-63118 – střední, CVSS 4.0 6,9: přenos vůbec nekontroloval hlavičky
HostaOrigin.
Zasažený rozsah je u všech pěti stejný: verze 0.22.0 a starší. Opravená je 0.23.0.
Opravy byly venku o tři týdny dřív než hlášení
Verze 0.23.0 vyšla 7. července 2026 – shodně to uvádí stránka vydání na GitHubu i záznam na RubyGems. Mezi ní a zveřejněním hlášení stihly vyjít další tři verze, poslední z nich 1.0.0 z 24. července. Poznámky k vydání 0.23.0 opravy vyjmenovávají a u tří z pěti říkají i to, čemu brání; čísla CVE v nich nejsou, protože v té době ještě nebyla přidělená. Táž verze mimochodem označila za odložené funkce Roots, Sampling a Logging.
Nejvážnější nález je v téhle knihovně druhý svého druhu
Rubyové SDK mělo obdobné hlášení už v březnu: CVE-2026-33946 z 27. března popisovalo únos datového proudu SSE zopakovaným identifikátorem relace a opravila ho verze 0.9.2. Proč to nestačilo, stojí v zprávě u nové opravy: dřívější záplata hlídá místo pro čtecí proud, ale s cestou zápisu přes POST nedělá nic.
Nová oprava je hák, ne výchozí chování. Popis knihovny to říká natvrdo: bez validátoru přenos vlastnictví relace nevynucuje. Sám ho vynutit neumí, protože žádnou ověřenou totožnost nedostane – svázat relaci s uživatelem je podle téhož textu věcí nasazované aplikace a specifikace MCP to formuluje jako doporučení, ne příkaz. Knihovna k tomu přidala parametr session_request_validator; volá se u každého požadavku na existující relaci a při nesouhlasu vrátí stav 403. Zapnout si ho musí provozovatel serveru. Náhradní pojistkou je porovnání hlavičky Origin proti té, která u relace padla na začátku – jenže funguje jen tehdy, když ji obě strany posílají, takže klienta mimo prohlížeč nezastaví.
Kontrolu hlaviček měly Python i TypeScript o osm měsíců dřív
CVE-2026-63118 popisuje útok přes přesměrování jména (DNS rebinding): škodlivá stránka v prohlížeči přepíše vlastní doménu na smyčkovou adresu a pak mluví s lokálním serverem MCP jako s vlastní. Server, který nekontroluje, odkud požadavek přišel, jí vypíše seznam nástrojů a spustí je.
Tutéž vadu měly sesterské knihovny dávno: CVE-2025-66414 pro TypeScript a CVE-2025-66416 pro Python vyšly obě 2. prosince 2025. V Ruby je to o necelých osm měsíců později. Samotná záplata je přitom starší než hlášení – commit s kontrolou hlaviček má autorské datum 30. dubna 2026 a do hlavní větve se dostal 28. června. Ve verzi 1.0.0 kontrola běží ve výchozím nastavení, cizí hodnota dostane 403 a povolené jsou smyčkové adresy. Kdo server provozuje za reverzní proxy nebo mimo smyčku, musí seznamy allowed_hosts a allowed_origins rozšířit sám, jinak si odřízne vlastní klienty.
Tři zbylé nálezy míří na paměť
U CVE-2026-67432 je podstatné, že sporná cesta běží dřív, než se ověří relace – je tedy dostupná bez hlavičky s identifikátorem a bez jakéhokoli přihlášení. U CVE-2026-67430 byl jedinou cestou, jak relaci zrušit, výslovný požadavek DELETE od klienta; ve zprávě u opravy stojí měření hlásícího, který z jediného klienta vytvořil a držel 50 000 relací za 26,6 sekundy. CVE-2026-63119 se týká spojení přes standardní vstup a výstup, a tam je dopad menší: druhá strana je běžně rodičovský proces se stejnými právy jako server, takže si škodí sama.
Verze 1.0.0 má k tomu nová výchozí čísla: relace vyprší po 1 800 s nečinnosti, souběžných je nejvýš 10 000 a jeden rámec smí mít 4 MiB. Při zaplnění vrátí server na nové založení relace stav 503 a stávající relace nevyhazuje.
Kolika serverů se to týká, se z veřejných čísel nedozvíte
RubyGems vykazoval 1. srpna 2026 u gemu mcp 8 162 926 stažení celkem, z toho 7 883 337 na verzích 0.22.0 a starších – tedy 96,6 %. Ten podíl jsme si dopočítali z výpisu verzí a jako odhad zasažených instalací neplatí: je to součet za celou historii balíčku, ve kterém jsou hlavně sestavení v průběžné integraci a verze, které dnes nikdo nepoužívá.
Použitelnější vodítko je způsob nasazení. Čtyři z pěti nálezů se týkají přenosu po HTTP; kdo server pouští jen jako podproces přes standardní vstup a výstup, potká z té pětice ten poslední. Hlášení k CVE-2026-67432 ale dodává, že táž příčina má druhý výskyt i ve spojení přes standardní vstup.
Pětka není osamocená
Ve výpisu hlášení GitHubu za 28. července až 1. srpna 2026 jsme napočítali u implementací MCP ještě pět dalších záznamů: čtyři k serveru @dynatrace-oss/dynatrace-mcp-server a jeden k serveru gemini-bridge, kde nástroj četl libovolný soubor mimo pracovní adresář a jeho obsah posílal v odpovědi dál (CVE-2026-54785). S rubyovou pěticí je to deset záznamů u jednoho protokolu za čtyři dny.
Společný jmenovatel většiny z nich je, že server MCP počítá s důvěryhodným okolím – s klientem, který sedí na témže počítači, a s modelem, který posílá jen to, co mu řekl uživatel. Ani jedno dnes neplatí. Rubyová knihovna to u vlastnictví relace řeší tím, že odpovědnost výslovně předá aplikaci nad sebou; kolik serverů ji opravdu převzalo, se zvenčí nezjistí.