GHSA-P4GQ-3VXJ-F4JQ

Vulnerability from github – Published: 2026-05-04 20:01 – Updated: 2026-05-13 13:39
VLAI
Summary
Argo Affected by SSO RBAC Delegation Nil Pointer Dereference DoS (gatekeeper.go)
Details

Summary

A nil pointer dereference in server/auth/gatekeeper.go rbacAuthorization() causes a panic (denial of service) for SSO users whose claims match a namespace-level RBAC rule but not an SSO-namespace rule, when SSO_DELEGATE_RBAC_TO_NAMESPACE=true.

Details

When getServiceAccount(claims, ssoNamespace) returns nil (no matching rule), the error is suppressed and loginAccount remains nil. If RBAC delegation finds a matching namespaceAccount, line 304 calls precedence(loginAccount) which unconditionally accesses serviceAccount.Annotations — nil pointer dereference.

Affected code (v4.0.4):

// gatekeeper.go:304
} else if precedence(namespaceAccount) > precedence(loginAccount) {
    // loginAccount is nil here -> precedence(nil) -> PANIC

// gatekeeper.go:232-234
func precedence(serviceAccount *corev1.ServiceAccount) int {
    i, _ := strconv.Atoi(serviceAccount.Annotations[common.AnnotationKeyRBACRulePrecedence])
    return i
}

PoC

Live-tested 2026-04-17: kind cluster, Argo Workflows v4.0.4, Dex v2.43.1 OIDC provider.

  1. Deploy Argo Workflows with --auth-mode=sso --auth-mode=client, SSO pointing to Dex, RBAC enabled.
  2. Set SSO_DELEGATE_RBAC_TO_NAMESPACE=true on the argo-server deployment.
  3. Create an RBAC ServiceAccount with workflows.argoproj.io/rbac-rule: "true" annotation in a target namespace (e.g., target-ns).
  4. Do not create a matching RBAC rule in the SSO namespace (argo).
  5. Authenticate via the Dex SSO flow.
  6. Request GET /api/v1/workflows/target-ns with the SSO session cookie.
  7. Server returns HTTP 500: {"code":13,"message":"runtime error: invalid memory address or nil pointer dereference"}
  8. Server logs: Recovered from panic with stack trace at gatekeeper.go:233 (precedence()) called from gatekeeper.go:304.

Every subsequent API request from affected SSO users triggers the same panic.

Impact

Permanent denial of service for any SSO user whose claims don't match SSO-namespace RBAC but do match a target namespace rule. Realistic in multi-tenant deployments with per-namespace RBAC. The gRPC recovery interceptor catches the panic so the server process survives, but the affected user gets HTTP 500 on every request.

Suggested Fix

Add nil check: if loginAccount == nil || precedence(namespaceAccount) > precedence(loginAccount)

AI Disclosure

This advisory was prepared with AI assistance (Claude Code, Anthropic).

Show details on source website

{
  "affected": [
    {
      "database_specific": {
        "last_known_affected_version_range": "\u003c= 4.0.4"
      },
      "package": {
        "ecosystem": "Go",
        "name": "github.com/argoproj/argo-workflows/v4"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "4.0.0"
            },
            {
              "fixed": "4.0.5"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-42183"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-476"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-05-04T20:01:13Z",
    "nvd_published_at": "2026-05-09T04:16:23Z",
    "severity": "LOW"
  },
  "details": "### Summary\nA nil pointer dereference in `server/auth/gatekeeper.go` `rbacAuthorization()` causes a panic (denial of service) for SSO users whose claims match a namespace-level RBAC rule but not an SSO-namespace rule, when `SSO_DELEGATE_RBAC_TO_NAMESPACE=true`.\n\n### Details\nWhen `getServiceAccount(claims, ssoNamespace)` returns nil (no matching rule), the error is suppressed and `loginAccount` remains nil. If RBAC delegation finds a matching `namespaceAccount`, line 304 calls `precedence(loginAccount)` which unconditionally accesses `serviceAccount.Annotations` \u2014 nil pointer dereference.\n\n**Affected code (v4.0.4):**\n\n```go\n// gatekeeper.go:304\n} else if precedence(namespaceAccount) \u003e precedence(loginAccount) {\n    // loginAccount is nil here -\u003e precedence(nil) -\u003e PANIC\n\n// gatekeeper.go:232-234\nfunc precedence(serviceAccount *corev1.ServiceAccount) int {\n    i, _ := strconv.Atoi(serviceAccount.Annotations[common.AnnotationKeyRBACRulePrecedence])\n    return i\n}\n```\n\n### PoC\n**Live-tested 2026-04-17:** kind cluster, Argo Workflows v4.0.4, Dex v2.43.1 OIDC provider.\n\n1. Deploy Argo Workflows with `--auth-mode=sso --auth-mode=client`, SSO pointing to Dex, RBAC enabled.\n2. Set `SSO_DELEGATE_RBAC_TO_NAMESPACE=true` on the argo-server deployment.\n3. Create an RBAC ServiceAccount with `workflows.argoproj.io/rbac-rule: \"true\"` annotation in a target namespace (e.g., `target-ns`).\n4. Do **not** create a matching RBAC rule in the SSO namespace (`argo`).\n5. Authenticate via the Dex SSO flow.\n6. Request `GET /api/v1/workflows/target-ns` with the SSO session cookie.\n7. Server returns HTTP 500: `{\"code\":13,\"message\":\"runtime error: invalid memory address or nil pointer dereference\"}`\n8. Server logs: `Recovered from panic` with stack trace at `gatekeeper.go:233` (`precedence()`) called from `gatekeeper.go:304`.\n\nEvery subsequent API request from affected SSO users triggers the same panic.\n\n### Impact\nPermanent denial of service for any SSO user whose claims don\u0027t match SSO-namespace RBAC but do match a target namespace rule. Realistic in multi-tenant deployments with per-namespace RBAC. The gRPC recovery interceptor catches the panic so the server process survives, but the affected user gets HTTP 500 on every request.\n\n### Suggested Fix\nAdd nil check: `if loginAccount == nil || precedence(namespaceAccount) \u003e precedence(loginAccount)`\n\n### AI Disclosure\nThis advisory was prepared with AI assistance (Claude Code, Anthropic).",
  "id": "GHSA-p4gq-3vxj-f4jq",
  "modified": "2026-05-13T13:39:11Z",
  "published": "2026-05-04T20:01:13Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/argoproj/argo-workflows/security/advisories/GHSA-p4gq-3vxj-f4jq"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-42183"
    },
    {
      "type": "WEB",
      "url": "https://github.com/argoproj/argo-workflows/commit/c4cc17d0c034fa9a9cc01ef1af6c8016c93071d4"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/argoproj/argo-workflows"
    },
    {
      "type": "WEB",
      "url": "https://github.com/argoproj/argo-workflows/releases/tag/v4.0.5"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N",
      "type": "CVSS_V4"
    }
  ],
  "summary": "Argo Affected by SSO RBAC Delegation Nil Pointer Dereference DoS (gatekeeper.go)"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…