Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.
Sources: National Vulnerability Database, CISA KEV, Exploit-DB
CVE-2026-113672 Overview
CVE-2026-113672 is a path traversal vulnerability [CWE-22] in Argo CD, a declarative GitOps continuous delivery tool for Kubernetes. The flaw resides in the repo-server component, which evaluates .jsonnet files using an importer that does not confine import, importstr, or importbin calls to the repository root. Attackers can abuse absolute paths, parent-directory traversal, and repository symlinks to read any file accessible to the repo-server process. Affected files include /proc/self/environ, projected service-account tokens, mounted private keys, and repository credentials. The issue affects versions from 0.9.0 up to 3.3.15, 3.4.10, 3.5.4, and 3.6.0-rc2.
Critical Impact
An attacker with only Application get permission on an existing directory Application can read arbitrary files from the repo-server, exfiltrate Kubernetes service-account tokens and repository credentials, and exhaust repo-server memory to cause denial of service.
Affected Products
- Argo CD versions 0.9.0 through 3.3.14
- Argo CD 3.4.x prior to 3.4.10
- Argo CD 3.5.x prior to 3.5.4 and 3.6.0 prior to 3.6.0-rc2
Discovery Timeline
- 2026-10-20 - CVE-2026-113672 published to NVD
- 2026-10-20 - Last updated in NVD database
Technical Details for CVE-2026-113672
Vulnerability Analysis
The Argo CD repo-server evaluates .jsonnet manifests to generate Kubernetes resources. Jsonnet supports three file-ingestion primitives: import for Jsonnet code, importstr for string contents, and importbin for binary contents. The repo-server's importer accepts absolute paths and parent-directory traversal sequences without validation against the repository root. Repository symlinks are also followed. As a result, any file readable by the repo-server service account becomes accessible through manifest generation. Although generated Secret objects are redacted before being returned, placing imported contents in a ConfigMap returns the raw data to the API caller. The importstr primitive applied to a non-terminating device like /dev/zero consumes repo-server memory until the process is killed.
Root Cause
The root cause is missing path confinement in the Jsonnet importer registered by the repo-server. The importer does not canonicalize paths against the repository root, does not reject absolute paths, and does not resolve symlinks before enforcing boundary checks. This is a classic path traversal defect [CWE-22] in which untrusted input flows directly into a file-system read primitive.
Attack Vector
Two delivery paths exist. First, an attacker who can commit to a Git repository bound to an Application can introduce a malicious .jsonnet file; directory Applications evaluate every .jsonnet file in the directory. Second, an attacker can upload a crafted file via POST /api/v1/applications/manifestsWithFiles, which is also exposed through argocd app diff --local --server-side-generate. The upload path requires only Application get permission on an existing directory Application. It does not require Application update, Application sync, or repository write access, substantially lowering the privilege bar for exploitation.
"strings"
"time"
+ jsonnet "github.com/google/go-jsonnet"
"github.com/ksonnet/ksonnet/pkg/app"
log "github.com/sirupsen/logrus"
"google.golang.org/grpc/codes"
Source: GitHub Commit 27471d5. This diff from reposerver/repository/repository.go is part of the broader change set that introduced and later constrained Jsonnet handling in the repo-server.
Detection Methods for CVE-2026-113672
Indicators of Compromise
- .jsonnet files in Git repositories containing import, importstr, or importbin calls referencing absolute paths, ../ sequences, or paths outside the repository root.
- Requests to POST /api/v1/applications/manifestsWithFiles originating from accounts holding only Application get permissions.
- Rendered ConfigMap manifests containing contents of /proc/self/environ, service-account tokens, or .git/config credentials.
- Repo-server pods exhibiting sudden memory pressure, OOMKilled events, or restart loops consistent with /dev/zero ingestion through importstr.
Detection Strategies
- Scan all Git repositories referenced by Argo CD Applications for .jsonnet files invoking import* primitives on paths beginning with / or containing ...
- Audit Argo CD API access logs for manifestsWithFiles calls, correlating uploader identity with their RBAC scope.
- Compare rendered manifest output against repository source to flag ConfigMap entries whose values resemble file system contents.
Monitoring Recommendations
- Enable verbose Argo CD audit logging and forward repo-server and API-server logs to a centralized analytics backend for query and retention.
- Alert on repo-server container memory saturation and restart counts above baseline.
- Monitor Kubernetes API audit events for unusual use of the repo-server service-account token outside the repo-server pod identity.
How to Mitigate CVE-2026-113672
Immediate Actions Required
- Upgrade Argo CD to version 3.3.15, 3.4.10, 3.5.4, or 3.6.0-rc2 as appropriate for your release train.
- Rotate any credentials, service-account tokens, and private keys that were mounted into or reachable by the repo-server pod.
- Review Application RBAC and remove unnecessary Application get grants on directory Applications until patching is complete.
Patch Information
The maintainers fixed the issue in Argo CD v3.3.15, v3.4.10, v3.5.4, and v3.6.0-rc2. Technical context is published in GHSA-3v3m-wc6v-x4x3, GHSA-6gcg-hp2x-q54h, and GHSA-m3vr-7329-44ww.
Workarounds
- Disable the built-in Jsonnet tool in the repo-server if Jsonnet is not required. See the Argo CD Tool Detection Guide.
- Restrict the repo-server service account to the minimum file-system mounts and Kubernetes permissions required for manifest generation.
- Enforce repository allow-lists and block directory Applications that execute untrusted .jsonnet sources.
# Disable the built-in jsonnet tool via the repo-server ConfigMap
# argocd-cmd-params-cm (repo-server flag)
kubectl -n argocd patch configmap argocd-cmd-params-cm \
--type merge \
-p '{"data":{"reposerver.disable.tls":"false","reposerver.plugin.tar.exclusions":"*.jsonnet"}}'
# Then roll the repo-server to apply
kubectl -n argocd rollout restart deployment argocd-repo-server
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.
Sources: National Vulnerability Database, CISA KEV, Exploit-DB

