U MCP serveru Dynatrace vyšly čtyři záznamy. Dva jsou o ochranách, které nic nevynutí
Balíček @dynatrace-oss/dynatrace-mcp-server dostal mezi 29. a 31. červencem čtyři bezpečnostní záznamy. Nejvyšší číslo má režim HTTP, který se nikoho neptá na heslo. Dva další míří na anotaci u nástroje a na schvalovací bránu – a ani jedno z toho protokol nevynucuje.
Firma Dynatrace vyvíjí server pro protokol MCP, kterým se agentní nástroje dostanou k datům z její pozorovací platformy – k logům, incidentům, nálezům ze skenu zranitelností. Je pod licencí MIT a z npm si ho v červenci stáhli 75 470krát. Mezi 29. a 31. červencem k němu vyšly čtyři bezpečnostní záznamy naráz.

Za všemi čtyřmi je v poděkování účet yotampe-pluto, u toho nejzávažnějšího vedle něj ještě dva další. Opravy přitom vyšly o týdny dřív, než se popisy objevily: verze 1.8.7 8. června, 2.0.0 16. června a 2.1.1 14. července – tedy 51, 45 a 17 dní před zveřejněním. Popsat nález až po opravě je běžný postup; totéž se stalo u pěti záznamů u knihovny Ruby pro MCP.
Co anotace u nástroje znamená
Server v MCP nabízí klientovi seznam nástrojů a u každého smí připojit anotace – několik nepovinných příznaků, které o nástroji něco tvrdí. Nejznámější je readOnlyHint. Podle schématu protokolu znamená „nástroj nemění své prostředí“ (přeloženo).
Táž pasáž schématu ale hned dodává, že všechny vlastnosti anotací jsou jen nápovědy a že u nich není zaručeno, že chování nástroje popisují věrně. Popis nástrojů ve specifikaci to říká ještě tvrději: klient musí anotace považovat za nedůvěryhodné, pokud nepřicházejí z důvěryhodného serveru. Anotace tedy nic nevynutí. Je to údaj, který server sám o sobě uvede.
Injekce, která obejde popis nástroje
Záznam GHSA-pqh8-p93p-2rx7 (CVSS 4,3) popisuje vkládání dotazovacího jazyka DQL do parametrů, které jsou v popisu nástroje označené jako identifikátory nebo časové rozpětí. Volající se z řetězce dostane ven, přilepí vlastní části dotazu a zbytek toho původního odřízne poznámkou.
Zajímavý na tom není přístup k datům – ten operátorův token stejně dovoluje, protože server nabízí i nástroj na libovolný dotaz. Zajímavé je, co se obejde. Popis nálezu jmenuje výslovně tři věci: omezení na vybraná pole, stropy na počet vypsaných položek, časové okno – a k tomu právě anotaci readOnlyHint: true, kterou podle téhož textu klienti MCP mohou brát jako pokyn ke schválení bez dotazu uživateli. Nástroj tedy o sobě tvrdí, že jen čte, a klient mu na to slovo dá.
Pět nástrojů se ptalo, šestý ne
Druhá vrstva ochrany je schvalovací brána: server si sám vyžádá souhlas obsluhy, než něco zapíše. V tomto serveru to obstarává funkce requestHumanApproval(). Záznam GHSA-pc2w-4mq8-32qw (CVSS 3,7) uvádí, že ze šesti zapisujících nástrojů ji volalo pět. Šestý, zakládající poznámkový sešit v platformě, ne – přibyl v jiném vydání než ostatní a při doplňování bran se na něj zapomnělo.
Ani tahle brána není součást protokolu. Je to řádek v kódu serveru, který tam někdo musí napsat. Když chybí, klient se nemá o co opřít: z venku vypadá takový nástroj stejně jako ty ostatní. Opraveno je to od verze 1.8.7.
Nejvyšší číslo dostal režim HTTP
Nejzávažnější nález GHSA-p7w7-4929-vpj5 (CVSS 7,5) s anotacemi nesouvisí. Server se dá spustit přepínačem --http a v tomto režimu podle popisu neověřoval nic – ani token, ani relaci, ani hlavičky Host a Origin. Kdo se na něj dosáhl po síti, mohl volat nástroje pod přihlašovacími údaji provozovatele. Čtvrtý záznam GHSA-xrmj-5g4g-8987 (CVSS 4,2) popisuje vložení výrazu Jinja2 do definice pracovního postupu, který pak v platformě zůstane i po skončení sezení. Obojí je opravené od verze 2.0.0, poslední vydání je 2.1.2 z 20. července.
Co z toho plyne pro cizí servery
Popisy nálezů jsou u tohohle projektu nezvykle podrobné: jmenují soubor, čísla řádků i úryvek kódu, a u každého je odkaz na návrh změny, kterým se to spravilo. Kdo si chce ověřit, jak nález vznikl, má to celé před sebou.
Podstatné je, že dva ze čtyř nálezů nejsou o chybě v jednom balíčku, ale o tom, jak protokol funguje. Anotace i schvalovací brána jsou obojí věcí serveru. Když klient podle nich rozhoduje, jestli se má zeptat obsluhy, přenáší to rozhodnutí na protistranu – a specifikace ho na to sama upozorňuje. Náš názor: u serveru, který si člověk spouští sám a dá mu vlastní přístupové údaje, to velký problém není. Horší je to u serverů provozovaných někým jiným, kterých v ekosystému MCP přibývá.