Knihovna ash_ai spouštěla text promptu jako zdrojový kód Elixiru
Šest záznamů CVE zveřejněných 31. srpna míří na jedinou knihovnu: rozšíření ash_ai, které do elixirového frameworku Ash přidává práci s jazykovými modely. Nejzávažnější z nich má známku 8,9 a týká se všech vydání od května 2025. Opravu nese jedině verze 1.0.0, a ta zároveň mění závislosti.

Balíček ash_ai dodává elixirovému frameworku Ash to, co dnes chce skoro každá aplikace: akce, které se ptají jazykového modelu, nástroje, jež model smí volat, server protokolu MCP a převod textu na vektory. Hex u něj eviduje 216 025 stažení, z toho 7 303 za poslední týden. Od 31. srpna k němu vede šest čísel CVE.
Šest záznamů a jedno vydání
Časová osa je krátká. Verze 1.0.0 se objevila na Hexu 30. srpna ve 23:21 UTC, hlášení na GitHubu o dvě minuty později, záznamy CVE pak 31. srpna v 1:16 a 2:17. Čísla nepřidělil ani MITRE, ani GitHub, ale Erlang Ecosystem Foundation, která pro erlangovský a elixirový ekosystém funguje jako přidělovatel čísel.
Popisy stojí za přečtení, i když člověk Elixir nepíše. Každý z nich jmenuje dotčený modul, funkci, mechanismus i to, co přesně oprava dělá. Podle nás je to nad běžnou podrobnost bezpečnostních hlášení.
Text promptu se překládal jako program
Nejtěžší z šestice je CVE-2026-77956 se známkou CVSS 4.0 ve výši 8,9. Modul AshAi.Actions.Prompt pouštěl obsah promptu přes EEx.eval_string/2. EEx je šablonovací systém Elixiru a jeho vyhodnocení znamená, že se text přeloží a spustí jako zdrojový kód.
Dokumentovaná podoba prompt: fn input, context -> ... end přitom dovoluje sestavit ten text z argumentů akce. Když do něj aplikace zapojí data z požadavku, projde šablonovacím vyhodnocením i všechno, co poslal volající. Stane se to ještě před dotazem na model a nevyžaduje to žádné přihlášení nad rámec toho dostat se k promptové akci. Dotčená jsou vydání od 0.1.0, tedy od prvního zveřejnění balíčku 14. května 2025.
V opravném commitu je jedna podrobnost, která se v popisu CVE neobjevuje. Na dotčených řádcích stály tři poznámky sobelow_skip ["RCE.EEx"]. Sobelow je statický bezpečnostní analyzátor pro Elixir a Phoenix a jeho kontrola RCE.EEx hlásí přesně tohle: uživatelský vstup předaný vyhodnocovacím funkcím EEx může skončit spuštěním cizího kódu. Poznámky tu kontrolu na dotčených řádcích vypínaly. Po opravě zůstala jediná, a to u větve, kde se vyhodnocují jen staticky nastavené šablony.
Podobný případ jsme popisovali u Xinference, jen obráceně: tam se jako kód spouštěla odpověď modelu, tady vstup do něj.
Server MCP věřil hlavičkám od útočníka
CVE-2026-81315 se známkou 7,4 míří na AshAi.Mcp.Server. Ve výchozím nastavení allowed_origins: nil uznal server původ požadavku tehdy, když se jeho jméno hostitele shodovalo s hlavičkou Host a když hlavička x-forwarded-proto hlásila https. Obě hodnoty ale nastavuje ten, kdo požadavek posílá, a u té druhé se navíc nikde neověřovalo, že mezi klientem a serverem vůbec nějaká proxy je.
Ochrana proti přepnutí DNS záznamu (DNS rebinding) tím padá. Cizí stránka v prohlížeči se dostane na lokální server MCP a jedná pod identitou přihlášeného člověka. Oprava zúžila výchozí důvěru na původ z localhostu; cokoli jiného teď chce výslovný seznam v allowed_origins. Tři servery MCP dostaly záznam CVE za nedostatečnou kontrolu volajícího už 27. srpna, takže tenhle vzorec se opakuje.
Filtr bral vnořenou mapu jako podmínku
Známku 7,1 dostaly dva různé případy a ten první, CVE-2026-82564, sedí v modulu AshAi.Tool.Execution. Nástroj, který záznam hledá podle identity, sestavoval filtr pro úpravu nebo smazání rovnou ze syrových argumentů. Hodnota typu mapa se přitom čte jako výraz podmínky, ne jako prostá hodnota, takže volající uměl zápis přesměrovat na řádek, který nikdy neurčil. Vynechaný klíč navíc dal podmínku „je prázdné“, která sedne skoro na cokoli. Oprava každou hodnotu identity přetypuje podle pole a neskalární vstup odmítne.
Dvě hlášky, které se dostaly ven
CVE-2026-75760 má tutéž známku 7,1 a týká se vektorizace. Když volání poskytovatele selhalo, vložil modul AshAi.Changes.Vectorize celý chybový objekt do hlášky, kterou AshJsonApi i AshGraphql vrátí volajícímu. Nic ho předtím nečistilo, takže s sebou nesl adresu požadavku, tělo odpovědi poskytovatele a u HTTP klientů, které si v chybě drží i odeslaný požadavek, hlavičku Authorization s API klíčem. Selhání se dá vyvolat příliš velkým nebo poškozeným obsahem.
Mírnější CVE-2026-82580 se známkou 5,3 dělá totéž o patro výš. Výjimka vyhozená při běhu nástroje se doslova zapsala do výsledku, ten se připojil ke konverzaci a model ho obvykle přetlumočil uživateli. Ven se tak dostaly hlášky databázových omezení, chyby adaptéru i úryvky dotazů.
Cyklus, který se nikdy neposunul
Poslední, CVE-2026-82579 se známkou 6,0, je porucha dostupnosti. AshAi.ToolLoop odfiltruje z odpovědi modelu volání bez platného jména a taková, jejichž identifikátor už má v historii výsledek. Když po filtru nezbylo nic, cyklus nepřipojil žádnou zprávu a zavolal se znovu s bajt po bajtu stejným seznamem. Konverzace se neposunula a týž dotaz odcházel na model v každém kole. Při podporovaném nastavení max_iterations: :infinity to neskončilo vůbec.
Podstrčený pokyn v datech přitom umí model přimět, aby už použitý identifikátor poslal znovu. Smyčku tedy dokáže spustit i ten, kdo do konverzace nemá jiný vstup než text, který si model přečte.
Opravu nese jen 1.0.0, a ta mění závislosti
Všech šest hlášení uvádí jedinou opravenou verzi: 1.0.0. Žádná záplata do řady 0.8 nevyšla. Poznámky k vydání ale vedle šesti oprav uvádějí i nekompatibilní změnu: závislost req_llm je nově volitelná.
Prakticky to znamená, že kdo používá promptové akce, AshAi.ToolLoop, generátor mix ash_ai.gen.chat nebo vektorizaci přes ReqLLM, musí si req_llm nově uvést mezi vlastními závislostmi. README to od téhož vydání říká výslovně a instalátoru přibyl přepínač, kterým jde závislost vynechat, když aplikace obsluhuje jen MCP. Bezpečnostní oprava a zásah do sestavení projektu jsou tedy v jednom balení a vzít se dají jen společně.
Zdroje
- Záznamy CVE-2026-77956, -81315, -75760, -82564, -82579 a -82580, Erlang Ecosystem Foundation, 31. 8. 2026
- Táž šestice v databázi NVD včetně známek a časů zveřejnění
- Poznámky k vydání ash_ai 1.0.0 a návrh změny 224 se změnou v
mix.exs - Data balíčku na Hexu: seznam vydání a počty stažení