Argo Workflows CVE-2026-40886: Brief Summary of a Controller Crash Loop via Malformed Annotation Parsing

A brief summary of CVE-2026-40886, a high severity denial of service vulnerability in Argo Workflows where a malformed pod annotation triggers an unchecked array index panic, crash looping the controller and halting all workflow processing cluster wide.

CVE Analysis

6 min read

ZeroPath CVE Analysis
ZeroPath CVE Analysis

2026-04-23

Argo Workflows CVE-2026-40886: Brief Summary of a Controller Crash Loop via Malformed Annotation Parsing
Experimental AI-Generated Content

This CVE analysis is an experimental publication that is completely AI-generated. The content may contain errors or inaccuracies and is subject to change as more information becomes available. We are continuously refining our process.

If you have feedback, questions, or notice any errors, please reach out to us.

[email protected]

Introduction

A single malformed annotation on a Kubernetes workflow pod can crash the entire Argo Workflows controller and keep it down indefinitely through a persistent crash loop. CVE-2026-40886, scored at CVSS 7.7, exposes a denial of service condition where any user with baseline workflow creation permissions can halt all workflow processing across a cluster until an administrator manually intervenes.

Argo Workflows is an open source, container native workflow engine for orchestrating parallel jobs on Kubernetes. It is widely adopted for CI/CD pipelines, machine learning model training, and data processing tasks, making it a critical piece of infrastructure in many Kubernetes environments. A controller level denial of service in this component has broad implications for organizations relying on it for production workloads.

Technical Information

Root Cause: Unchecked Array Index in podGCFromPod()

The vulnerability lives in the podGCFromPod() function within the pod informer. This function is responsible for parsing the workflows.argoproj.io/pod-gc-strategy annotation from workflow pods. The implementation splits the annotation value on the / character and unconditionally accesses the second element of the resulting array:

func podGCFromPod ( pod * apiv1. Pod ) wfv1. PodGC { if val, ok := pod. Annotations [ common. AnnotationKeyPodGCStrategy ]; ok { parts := strings. Split ( val, "/" ) return wfv1. PodGC { Strategy : wfv1. PodGCStrategy ( parts [ 0 ]), DeleteDelayDuration : parts [ 1 ]} } return wfv1. PodGC { Strategy : wfv1. PodGCOnPodNone } }

When the annotation value does not contain a / character (for example, a value like "NoSlash"), strings.Split returns a slice with a single element. The unconditional access to parts[1] then triggers a Go runtime panic: index out of range [1] with length 1.

This is a textbook CWE-129 (Improper Validation of Array Index) issue. The code assumes the annotation will always contain a delimiter without performing any bounds check.

Why the Panic is Fatal to the Controller

The critical detail that elevates this from a recoverable error to a full denial of service is where the panic occurs. The podGCFromPod() function runs inside a Kubernetes informer goroutine. Informer goroutines operate outside the controller's recover() scope, meaning the panic propagates uncaught and terminates the entire controller process.

Persistent Crash Loop Mechanism

The denial of service is not a one time crash. The poisoned pod (the workflow pod carrying the malformed annotation) persists in the Kubernetes cluster. When the controller restarts (as Kubernetes will automatically attempt), the informer immediately processes the existing pods, encounters the poisoned annotation again, and panics. This creates a CrashLoopBackOff cycle that continues indefinitely.

No workflows in the cluster can make progress while the controller is in this state. The only way to break the loop is to manually delete the offending workflow pod before the controller restarts and processes it.

Attack Flow

  1. An attacker with create permission on Workflow resources (the baseline permission for any Argo Workflows user) submits a workflow manifest containing a pod with the annotation workflows.argoproj.io/pod-gc-strategy: "NoSlash".
  2. The workflow pod is created in the cluster with the malformed annotation.
  3. The pod informer in the Argo Workflows controller processes the new pod and calls podGCFromPod().
  4. The function splits "NoSlash" on /, producing a single element slice, then attempts to access parts[1].
  5. The Go runtime panics with index out of range [1] with length 1.
  6. Because the panic is in an informer goroutine outside recover() scope, the entire controller process crashes.
  7. Kubernetes restarts the controller pod, the informer re-processes the poisoned pod, and the cycle repeats.

Observable Artifacts

Administrators can confirm this specific vulnerability by checking controller logs for the following panic signature:

panic: runtime error: index out of range [1] with length 1 goroutine 291 [running]: github.com/argoproj/argo-workflows/v4/workflow/controller/pod.podGCFromPod(...) /home/runner/work/argo-workflows/argo-workflows/workflow/controller/pod/controller.go:176

The controller pod will show CrashLoopBackOff status with an increasing restart count.

Affected Systems and Versions

The vulnerability affects multiple release branches of Argo Workflows:

Release BranchAffected VersionsPatched Version
4.x4.0.0 through 4.0.44.0.5
3.7.x3.7.0 through 3.7.133.7.14
3.6.x3.6.5 through 3.6.19No patch listed; upgrade to 3.7.14 or 4.0.5

Versions 3.6.4 and earlier are not affected by this vulnerability. The patched versions 4.0.5 and 3.7.14 were released on April 23, 2026.

Organizations running the 3.6.x branch on versions 3.6.5 or later should upgrade to 3.7.14 or 4.0.5, as no patch has been listed for the 3.6.x line.

Vendor Security History

The Argo Workflows project has maintained a responsive patching cadence, but 2026 has surfaced multiple high severity vulnerabilities related to input validation and security bypasses:

CVE IDVulnerability TypeSeverityFixed VersionsPublish Date
CVE-2026-40886CWE-129: Improper Validation of Array IndexCVSS 7.7 (High)4.0.5, 3.7.14April 23, 2026
CVE-2026-31892CWE-863: Incorrect Authorization (WorkflowTemplate Bypass)CVSS 8.9 (High)4.0.2, 3.7.11March 11, 2026

CVE-2026-31892 allowed users to bypass security settings via the podSpecPatch field, representing a similar pattern of vulnerabilities stemming from insufficient validation of user supplied spec data. The vendor's turnaround on fixes has been strong in both cases, with patches for CVE-2026-40886 published the same day as the advisory.

References

Detect & fix
what others miss

Security magnifying glass visualization