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

Server mcp-searxng posílal heslo k instanci SearXNG klientovi hned po připojení

Prostředník mezi asistentem a vyhledávačem SearXNG posílal ve verzi 1.11.0 celý obsah proměnné SEARXNG_URL, tedy i jméno a heslo v ní zapsané, jako logovací zprávu klientovi. Druhou cestou byla chybová hláška o špatném formátu adresy. Funkci na začernění měl projekt v kódu od konce června, jen ji na těch dvou místech nevolal.

Úvodní stránka vyhledávače SearXNG s vyhledávacím polem uprostřed
SearXNG se dá provozovat vlastní, a bývá pak zavřený za jménem a heslem. Foto: Benpiano800, Wikimedia Commons (CC BY 4.0)

Balíček mcp-searxng stojí mezi asistentem a vyhledávačem SearXNG. Dá modelu dva nástroje, hledání a přečtení zadané adresy, a dotazy za něj vyřídí sám. Kdo si SearXNG provozuje doma nebo ve firmě, mívá ho zavřený za jménem a heslem, a návod k verzi 1.11.0 říká, kam je zapsat: rovnou do adresy v proměnné SEARXNG_URL, tedy ve tvaru https://user:password@search.example.com.

Co se s tou adresou dělo dál, popisuje hlášení GHSA-hjwh-xvfw-qrwj zveřejněné 19. srpna. Číslo CVE nedostalo, závažnost mu autor navrhl střední (CVSS 5,5) a týká se všech vydání pod 1.12.0.

Adresa odešla celá dvěma cestami

První je úvodní hlášení serveru. Jakmile se klient připojí přes standardní vstup a výstup, pošle mu server několik zpráv typu notifications/message o verzi, úrovni logování a prostředí. Poslední z nich začíná slovy SearXNG URLs a nese hodnotu proměnné přesně tak, jak ji server načetl. Tedy včetně jména a hesla. Je to týž kanál, kterým se ke klientovi dostávají výsledky nástrojů.

Druhá cesta vede přes kontrolu formátu. Když se adresa nedala rozebrat, vrátila funkce validateSearxngInstanceUrl hlášku SEARXNG_URL invalid format: a za ní tutéž adresu celou; ta se zapsala do logu a klientovi se vrátila jako chyba JSON-RPC. Server ji navíc při startu vypisoval na chybový výstup, to ale jen tehdy, když ho spustil člověk v terminálu.

Rozdíl proti obyčejnému úniku do logu dělá to, kdo je na druhé straně. Klientem MCP je nástrojová vrstva asistenta, takže heslo k vyhledávači skončí tam, kde se pracuje s textem, který si model odnáší dál.

Začerňovat projekt uměl už měsíc předtím

Nešlo o chybějící funkci. Soubor src/searxng-instances.ts obsahoval už ve verzi 1.11.0 funkci redactSearxngInstanceUrl, která z adresy vyhodí jméno i heslo a vrátí ji bez nich; přibyla tam commitem z 30. června, jehož popis slibuje začernění údajů v chybách, logu a záznamech o původu dat. Na obou místech výš se prostě nezavolala.

Dorovnal to commit z 25. července nazvaný security(diagnostics): redact authentication data: jednadvacet souborů, 1 139 přidaných řádků a nový soubor diagnostic-sanitizer.ts, kterým teď prochází výstup procesu, logovací zprávy MCP, chyby JSON-RPC i diagnostika serveru HTTP. Hláška o špatném formátu adresu už neopakuje vůbec, píše jen pořadí položky. O den později vyšla verze 1.12.0.

V manifestu je proměnná nově označená za tajnou

Změna se nedotkla jen kódu. Soubor .mcp/server.json, kterým se balíček hlásí do registru MCP, měl u SEARXNG_URL ve verzi 1.11.0 příznak isSecret nastavený na false a proměnné AUTH_USERNAMEAUTH_PASSWORD nevypisoval vůbec. Ve verzi 1.12.0 jsou v manifestu všechny tři a všechny mají isSecret: true. Klient, který schéma čte, tak ví, že hodnotu nemá ukazovat ani ukládat.

Za zmínku stojí, že projekt na věc neupozornil až hlášením. Poznámky k vydání 1.12.0 mají vlastní oddíl Security a stojí v něm i věta, že kdo starší verzi provozoval, má po aktualizaci vyměnit přihlašovací údaje a omezit přístup k uloženým logům. Záznam v databázi GitHubu k tomu přibyl o čtyřiadvacet dní později. Že se hlášení a oprava rozejdou o týdny, není u serverů MCP nic výjimečného – u brány ContextForge zná databáze jen jedno hlášení ze čtyř.

Týž den vyšla i dvě hlášení o čtení vnitřních adres

Devatenáctého srpna přibyly u téhož balíčku ještě dva záznamy, CVE-2026-54688CVE-2026-54689. Oba míří na nástroj web_url_read, který stáhne zadanou adresu a vrátí ji modelu jako text. Adresu přitom vybírá model, takže ji lze ovlivnit podstrčeným pokynem ve stránce, kterou zrovna čte – podvrženým datům neodolal ani Claude Code, ani Codex.

Pojistka proti vnitřním adresám v kódu byla, jenže se zapínala proměnnou MCP_HTTP_HARDEN, která je vypnutá. Ve výchozím nastavení tedy nástroj sáhl i na smyčku 127.0.0.1 nebo na adresu 169.254.169.254, na které cloudové stroje vydávají metadata instance. Druhý záznam pak popisuje tři způsoby, jak pojistku obejít i po zapnutí: adresou 0.0.0.0, zápisem adresy IPv4 v podobě IPv6 a přesměrováním, jehož cíl se už neověřoval.

Obojí je opravené od verze 1.2.1 ze 7. června, tedy deset týdnů před zveřejněním obou záznamů. Kontrola od té doby běží vždy a vypnout ji jde jen výslovně, proměnnou MCP_HTTP_ALLOW_PRIVATE_URLS, a prochází jí i cíl přesměrování. V dnešní verzi 2.0.0 z 21. srpna je seznam zakázaných rozsahů delší, než hlášení žádalo: vedle privátních rozsahů a smyčky pokrývá i 0.0.0.0/8, adresy typu link-local, sdílený rozsah 100.64.0.0/10 používaný poskytovateli a překrytými sítěmi, testovací rozsahy z dokumentace i protějšky v IPv6.

Co z toho plyne pro provoz

Kdo balíček instaloval kdykoli letos a pak ho neaktualizoval, má nejspíš verzi z doby, kdy platilo aspoň jedno z těch tří hlášení. Na npm je pod značkou latest od 21. srpna verze 2.0.0. Kdo měl heslo k SearXNG napsané v SEARXNG_URL a běžel na 1.11.0 nebo 1.11.1, samotnou aktualizací hotovo nemá: to heslo prošlo přes klienta a přes logy, takže patří vyměnit.

Obecnější poučení z toho plyne jedno. Server MCP posílá klientovi kromě odpovědí nástrojů i svoje logovací zprávy a chybové hlášky, a to je stejný cíl jako výsledek hledání. Co v nich nemá co dělat, tam nesmí ani omylem – a příznak isSecret v manifestu je zatím jediné místo, kde to server umí říct klientovi dopředu.

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

    Přihlášený uživatel OpenShift AI může načíst společné klíče NVIDIA

    Red Hat zveřejnil 7. září zranitelnost CVE-2026-86332 se skóre 6,5. Přihlášený uživatel dashboardu OpenShift AI může bez správcovského oprávnění načíst společný klíč…

  2. Bezpečnost

    Hlídač agentů v API OpenAI umí konverzaci zastavit, hotové kroky ale nevrátí zpět

    Spolu s modelem GPT-6 Astra ohlásilo OpenAI 3. září 2026 systém, který na pozadí čte uvažování agenta a při podezření na nezamýšlený přenos dat nebo destruktivní zásah…

  3. Bezpečnost

    Dynamicky sestavený Bifrost mohl bez přihlášení spustit modul z webu

    Správní rozhraní AI brány Bifrost před verzí 2.0.0 přijímalo od nepřihlášeného volajícího internetovou adresu vlastního zásuvného modulu. V dynamickém sestavení mohl…

  4. Bezpečnost

    Souběžné načtení dvou vektorů promptu obešlo ve vLLM pojistku proti loňské díře

    Záznam CVE-2026-73557 popisuje, že pojistka, kterou vLLM přidal v prosinci 2025 proti chybě CVE-2025-62164, stála na přepínači společném pro celý proces. Když server…