Co se stalo
Argo CD je oblíbený open source nástroj, který automaticky nasazuje aplikace do Kubernetes podle toho, co je uložené v Git repozitáři. Tomuto přístupu se říká GitOps. Součástí Argo CD je komponenta repo-server, která z repozitáře připravuje konfiguraci aplikací, mimo jiné i ze souborů ve formátu Jsonnet.
Právě v této komponentě byla nalezena chyba s označením CVE-2026-113672 (v evropské databázi EUVD-2026-105227). Při zpracování souborů .jsonnet Argo CD nehlídá, jestli příkazy pro vložení jiného souboru zůstávají uvnitř repozitáře. Soubor tak může načíst cokoli, k čemu má repo-server přístup, například tokeny, soukromé klíče nebo přihlašovací údaje ke Git repozitářům.
Opravené verze vydal tým Argo CD 6. října a zranitelnost byla v americké databázi NVD zveřejněna 20. října 2026. Stejná vydání opravují i další kritické chyby, například dvě chyby v Kustomize, které umožňují spouštět příkazy na repo-server. Ke dni psaní článku chyba není v katalogu CISA KEV a ani databáze EUVD neeviduje její aktivní zneužívání. Zneužití zatím není známé.
Proč je to nebezpečné
Jde o chybu typu path traversal (CWE-22), volně přeloženo „únik mimo povolenou složku“. Představte si archiváře, který má podle pokynů nosit jen dokumenty z jedné police. Když mu někdo podá lísteček „jdi o dvě patra výš a přines obsah trezoru“, archivář to bez otázek udělá. Přesně tak se chová Jsonnet v Argo CD: dovolí načíst soubory i mimo repozitář.
Útok probíhá po síti a útočník potřebuje jen minimální oprávnění. Stačí, když může zapsat soubor do Git repozitáře, který Argo CD používá, nebo když má v Argo CD jen právo zobrazit existující aplikaci typu Directory. Ve druhém případě nepotřebuje právo aplikaci měnit ani synchronizovat a ani zapisovat do repozitáře. Argo CD sice objekty typu Secret v odpovědi skryje, ale obsah vložený do ConfigMap vrátí útočníkovi v čitelné podobě.
Co může útočník získat nebo způsobit:
- proměnné prostředí procesu
repo-server, ve kterých mohou být hesla a klíče - tokeny servisních účtů Kubernetes připojené do
repo-server - připojené soukromé klíče a přístupy ke Git repozitářům
- vyčerpání paměti
repo-server, které naruší jeho činnost
Skóre CVSS je 9,9 z maximálních deseti bodů, tedy kritická závažnost. CVSS je mezinárodní stupnice, která hodnotí, jak snadno lze chybu zneužít a jakou škodu způsobí. Vysoké skóre vychází z toho, že útok je jednoduchý, jde po síti a jeho dopad přesahuje samotné Argo CD.
EPSS je model, který odhaduje pravděpodobnost, že chybu někdo zneužije v příštích 30 dnech. U této chyby je odhad k 28. říjnu 2026 pod 1 %, zhruba osm šancí z tisíce. Katalog CISA KEV je americký seznam chyb, které útočníci prokazatelně zneužívají, a tato chyba v něm zatím není. To ale není důvod aktualizaci odkládat, protože popis chyby je veřejný.
Koho se to týká
Dotčeny jsou všechny verze Argo CD od 0.9.0 až po verze před 3.3.15, 3.4.10, 3.5.4 a 3.6.0-rc2. Prakticky tedy téměř každá instalace, která ještě nebyla aktualizována na některé z opravených vydání.
Argo CD typicky běží ve firmách, které provozují vlastní nebo cloudové clustery Kubernetes a nasazují aplikace způsobem GitOps. Největší riziko je tam, kde Argo CD sdílí více týmů nebo externí dodavatelé, případně kde mají právo číst aplikace všichni přihlášení uživatelé. Rizikové jsou také instalace, jejichž webové rozhraní nebo API je dostupné z internetu.
Netýká se to organizací, které Argo CD nepoužívají. Pokud Argo CD provozuje váš dodavatel nebo poskytovatel spravované platformy, ověřte si u něj, zda už aktualizoval.
Jak zjistit, zda jste zasaženi
Verzi zjistíte v levém panelu webového rozhraní Argo CD nebo z příkazové řádky. Následující příkazy jen čtou data a nic nemění. Pokud Argo CD neběží ve jmenném prostoru argocd, upravte jeho název.
argocd version
Příkaz vypíše verzi klienta i serveru, rozhodující je verze serveru. Verzi ověříte také podle obrazů kontejnerů:
kubectl get deployments -n argocd -o wide
Zda máte zapnutý Jsonnet a kdo má právo zobrazovat aplikace, zjistíte z konfigurace argocd-cm a argocd-rbac-cm. Pokud klíč jsonnet.enable chybí, Jsonnet je zapnutý.
kubectl get configmap argocd-cm argocd-rbac-cm -n argocd -o yaml
Pokud je verze serveru nižší než opravené vydání ve vaší větvi, jste zasaženi. Zasaženy jsou také všechny větve starší než 3.3.
Jak to opravit
Výrobce chybu opravil ve verzích 3.3.15, 3.4.10, 3.5.4 a 3.6.0-rc2. Postupujte takto:
- Zjistěte aktuální verzi serveru podle předchozí sekce.
- Aktualizujte v rámci své větve: z 3.3 na 3.3.15, z 3.4 na 3.4.10, z 3.5 na 3.5.4. Testovací instalace předběžné verze aktualizujte na 3.6.0-rc2.
- Pro větve starší než 3.3 výrobce opravené vydání neuvádí. Naplánujte přechod na podporovanou větev a při změně větve si přečtěte oficiální návod k upgradu.
- Před aktualizací si ověřte změny, které mohou něco rozbít: Kustomize s Helm grafy už nerespektuje
helmGlobals.configHomea OCI manifest větší než 4 MiB je odmítnut. - Po aktualizaci vyměňte citlivé údaje, ke kterým měl
repo-serverpřístup: přístupy ke Git repozitářům, klíče a tokeny.
Než aktualizujete, můžete riziko snížit. Podle dokumentace Argo CD může vypnutí nepoužívaných nástrojů pro tvorbu konfigurace zvýšit bezpečnost. Pokud Jsonnet nepotřebujete, nastavte v ConfigMap argocd-cm klíč jsonnet.enable na hodnotu false. Výrobce to neuvádí jako oficiální řešení právě této chyby, jde o obecné doporučení ke zpřísnění.
Zároveň omezte, kdo má v Argo CD právo zobrazovat aplikace a kdo může zapisovat do repozitářů, ze kterých Argo CD nasazuje. Jako první aktualizujte instance dostupné z internetu a ty, které sdílí více týmů nebo dodavatelů.
Co když už jste mohli být napadeni
Argo CD v popisu chyby ani v poznámkách k vydání neuvádí konkrétní indikátory napadení. Z popisu chyby však vyplývá, kde hledat stopy:
- soubory
.jsonnetv repozitářích, které přesimport,importstrneboimportbinnačítají absolutní cesty, cesty s..nebo symbolické odkazy - volání API
manifestsWithFilesv lozíchargocd-server. Vznikají i při příkazuargocd app diff --local --server-side-generate. Útok touto cestou nezanechá stopu v repozitáři. - neočekávané objekty ConfigMap v manifestech aplikací
- opakované restarty
repo-serverkvůli nedostatku paměti (OOMKilled)
Následující příkazy jen čtou. První prohledá logy serveru, další dva spusťte v naklonovaném repozitáři, poslední ukáže restarty repo-server:
kubectl logs -n argocd -l app.kubernetes.io/name=argocd-server --tail=-1 --prefix | grep -i manifestswithfiles
grep -rnE --include='*.jsonnet' --include='*.libsonnet' "import(str|bin)?[[:space:]]*['\"](/|[^'\"]*\.\.)" .
find . -path ./.git -prune -o -type l -ls
kubectl describe pods -n argocd -l app.kubernetes.io/name=argocd-repo-server | grep -iE 'restart count|oomkilled'
Logy v clusteru se časem přepisují, proto prohledejte i centrální logovací systém, pokud ho máte. Pokud najdete podezřelý soubor nebo volání od neznámého uživatele, považujte všechny údaje dostupné pro repo-server za uniklé a vyměňte je. Při nálezu nebo pochybnosti přizvěte odborníka na bezpečnost Kubernetes, protože mezi uniklými údaji mohou být i tokeny servisních účtů.