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

Zapnuté MCP v Chainlitu dovolovalo bez přihlášení spouštět příkazy na serveru

Kdo v Chainlitu ručně zapnul podporu MCP, vystavil rozhraní, přes které mohl nepřihlášený klient poslat příkaz operačnímu systému. Další chyba dovolovala serveru podstrčit adresu ve vnitřní síti i vlastní hlavičky požadavku. Verze 2.12.0 obě cesty zavírá, ale starou konfiguraci je před aktualizací nutné přepsat.

Řady serverových skříní v datovém centru
Chyby dopadaly na stroj, na kterém Chainlit běžel, i na služby dostupné z jeho sítě. Foto: cbowns, Flickr (CC BY-SA 2.0)

Chainlit je otevřený systém v Pythonu pro stavbu konverzačních aplikací s umělou inteligencí. Přes Model Context Protocol (MCP) může taková aplikace připojit další nástroje a zdroje dat. Právě rozhraní POST /mcp ale až do verze 2.11.1 nechávalo část rozhodování na klientovi, který se k němu připojil.

Projekt 25. srpna vydal Chainlit 2.12.0 a s ním dvě bezpečnostní opravy. Kritická CVE-2026-45018 dostala hodnocení 9,8 z deseti. Druhá, CVE-2026-45019, má známku 7,2 a týká se požadavků do vnitřní sítě. Obě platí pro vydání od 2.4.0rc0 do 2.11.1, jen když provozovatel nastavil features.mcp.enabled = true. Od verze 2.7.0 je MCP ve výchozím nastavení vypnuté.

Kontrola hlídala program, argumenty už ne

Pro připojení nástroje přes standardní vstup a výstup posílal klient serveru pole fullCommand, tedy celý příkaz včetně argumentů. Chainlit jej rozdělil na části a porovnal jméno spouštěného programu se seznamem povolených programů. Co následuje za ním, už nekontroloval. Některé povolené programy přitom umějí argumentem vyvolat další příkaz operačního systému.

Výsledek nebyla jen možnost spustit jiný nástroj MCP. Podle hlášení mohl nepřihlášený útočník, který se dostal k rozhraní, vykonat libovolný příkaz s právy procesu Chainlitu. Spuštění navíc nastalo dřív, než se dokončilo navázání spojení MCP, takže neúspěšné spojení útok nezastavilo. V horším případě tak šlo číst soubory a tajné údaje aplikace, měnit je nebo se ze serveru vydat dál do vnitřní sítě.

Samostatná chyba mířila na přenosy SSE a streamable-http. Klient u nich posílal cílovou adresu a volitelné hlavičky HTTP. Server neomezoval schéma, hostitele ani privátní adresy a hodnoty předal knihovně MCP. Útočník proto mohl přimět Chainlit, aby zavolal službu, která zvenku vůbec dostupná není, případně metadatovou službu cloudového stroje. Odpověď se mu sice nevrátila, takže šlo o takzvaný slepý SSRF, požadavek však mohl obsahovat i podstrčenou hlavičku Authorization nebo Cookie a provést změnu bez nutnosti číst výsledek.

Oprava nepřidává chytřejší filtr příkazu

Chainlit se nepokusil sepsat delší seznam zakázaných argumentů. Pole fullCommand z požadavku odstranil celé. Servery MCP pro přenos stdio teď předem zapisuje provozovatel do souboru .chainlit/config.toml jako položky [[features.mcp.servers]]. Klient pošle jen jejich jméno a server k němu dohledá vlastní příkaz. Hranice je tím zřetelná: návštěvník si vybírá z připravených možností, ale neskládá proces, který se spustí.

U spojení přes síť je nový výchozí stav rovněž zákaz. Uživatelské servery se musejí výslovně zapnout volbou features.mcp.user_servers.enabled a jejich cíle omezit neprázdným seznamem allowed_urls. Kontrola rozebírá schéma, hostitele, port i cestu, odmítá nejednoznačné zápisy cesty a vybrané nebezpečné hlavičky zahazuje. Přesměrování HTTP se už nesledují a cíl se znovu ověřuje u každého odchozího požadavku.

Oprava přesto nedělá ze zapnutého MCP bezúdržbovou funkci. Hlášení upozorňuje, že instalace bez nastaveného přihlašování dovolí anonymnímu klientovi vyvolat předem připravený server stdio i po aktualizaci. Příkaz už nezmění, může však zakládat další procesy. U uživatelských síťových serverů navíc zůstává hlavička Authorization povolená záměrně, protože ji připojená služba může potřebovat. Bezpečnost proto stojí i na úzkém seznamu adres a na přihlášení, ne pouze na čísle verze.

Aktualizace je záměrně nekompatibilní

Vydání 2.12.0 je na PyPI od 25. srpna. Kdo MCP nepoužívá, může na ně přejít běžně. Kdo je zapnuté má, musí nejdřív převést staré oddíly [features.mcp.sse], [features.mcp.stdio] a [features.mcp.streamable-http] na nový společný seznam serverů. Staré klíče aplikace při zapnutém MCP rozpozná a start ukončí chybou. Není to vedlejší rozbití kompatibility: tiché přijetí původního nastavení by zachovalo právě model, ve kterém klient dodává příkaz nebo adresu.

Kdo nemůže aktualizovat hned, má podle obou hlášení nastavit features.mcp.enabled = false. Tím zavře obě chyby současně. Omezení odchozího provozu ze serveru a zapnuté přihlašování snižují dopad, ale původní vadný návrh samy neopravují.

Časová osa ukazuje, že nešlo o opravu po veřejném závodě s útočníky. Výzkumníci ze SPL Security poslali nález projektu neveřejně 8. dubna a Chainlit zveřejnil podrobnosti spolu s opravenou verzí. Národní databáze zranitelností NVD převzala obě čísla tentýž den; u kritické chyby uvádí, že existuje ukázka zneužití. Veřejné hlášení ani databáze ale zatím netvrdí, že byla chyba zneužívána proti cizím systémům.

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

    Doloženou opravu chyby Plugin4Shell mají ze čtyř agentů jen Claude Code a Codex

    Firma Air Security v září popsala, jak u Claude Code, Codexu, GitHub Copilotu a Gemini CLI podvrhnout plugin, který tržiště připnulo na prověřený commit. Anthropic chybu…

  2. Bezpečnost

    Agenti z Tencent Cloud se hlásili jako Claude, styl jejich kódu ale Claudovi neodpovídá

    Agenti AI běžící na Tencent Cloud se mezi 28. zářím a 8. říjnem 2026 přes 2 600krát pokusili stáhnout data z mapové služby Amap, obcházeli její ochranu proti robotům a…

  3. Bezpečnost

    Compliance API Clauda vrací firemní správě i osobní pokyny zaměstnanců

    Rozhraní Compliance API vrací od 15. října text, který si každý člen firemní organizace uložil jako svůj vlastní pokyn pro Clauda. Koncový bod je v betě a spadá pod…

  4. Bezpečnost

    Grok v simulaci poslal 187 zpráv kvůli vrácení jízdného po lhůtě

    Šest AI asistentů mělo získat 350 liber za zrušený vlak, přestože zákaznice zmeškala lhůtu k žádosti. Grok v simulaci poslal 187 zpráv a Claude Fable sdílel soukromou…