CVE-2024-21661 is a high-severity (CVSS 7.5) Out-of-bounds Write vulnerability in github.com/argoproj/argo-cd. 1 public exploit or proof-of-concept reference is indexed, so weaponization risk is real. A fix is available for github.com/argoproj/argo-cd — see the affected versions and patch details below.
Argo CD Denial of Service (DoS) Vulnerability Due to Unsafe Array Modification in Multi-threaded Environment
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
Exploitation and automatability from CISA’s SSVC triage for CVE-2024-21661.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
Where this sits among everything scored
Real-World Exposure
github.com/argoproj/argo-cd🐹github.com/argoproj/argo-cd/v2🐹github.com/argoproj/argo-cd/v2🐹github.com/argoproj/argo-cd/v2Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.
Description
Summary
An attacker can exploit a critical flaw in the application to initiate a Denial of Service (DoS) attack, rendering the application inoperable and affecting all users. The issue arises from unsafe manipulation of an array in a multi-threaded environment.
Details
The vulnerability is rooted in the application's code, where an array is being modified while it is being iterated over. This is a classic programming error but becomes critically unsafe when executed in a multi-threaded environment. When two threads interact with the same array simultaneously, the application crashes.
The core issue is located in expireOldFailedAttempts function:
func expireOldFailedAttempts(maxAge time.Duration, failures *map[string]LoginAttempts) int {
expiredCount := 0
for key, attempt := range *failures {
if time.Since(attempt.LastFailed) > maxAge*time.Second { expiredCount += 1
delete(*failures, key) // Vulnerable code
} }
return expiredCount }
The function modifies the array while iterating it which means the code will cause an error and crash the application pod, inspecting the logs just before the crash we can confirm:
goroutine 2032 [running]: github.com/argoproj/argo-cd/v2/util/session.expireOldFailedAttempts(0x12c, 0xc000adecd8)
/go/src/github.com/argoproj/argo-cd/util/session/sessionmanager.go:304 +0x7c github.com/argoproj/argo-cd/v2/util/session.(*SessionManager).updateFailureCount(0xc00035 af50, {0xc001b1f578, 0x11}, 0x1)
/go/src/github.com/argoproj/argo-cd/util/session/sessionmanager.go:320 +0x7f github.com/argoproj/argo-cd/v2/util/session.(*SessionManager).VerifyUsernamePassword(0xc 00035af50, {0xc001b1f578, 0x11}, {0xc000455148, 0x8})
PoC
To reproduce the vulnerability, you can use the following steps:
- Launch the application.
- Trigger the code path that results in the
expireOldFailedAttempts()function being called in multiple threads. - In the attached PoC script we are restarting the server in a while loop, causing the application to be unresponsive at all.
Impact
This is a Denial of Service (DoS) vulnerability. Any attacker can crash the application continuously, making it impossible for legitimate users to access the service. The issue is exacerbated because it does not require authentication, widening the pool of potential attackers.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐹Go | github.com/argoproj/argo-cd | all versions | No fix |
| 🐹Go | github.com/argoproj/argo-cd/v2 | all versions | 2.8.13go get github.com/argoproj/argo-cd/v2@v2.8.13 |
| 🐹Go | github.com/argoproj/argo-cd/v2 | ≥ 2.9.0&&< 2.9.9 | 2.9.9go get github.com/argoproj/argo-cd/v2@v2.9.9 |
| 🐹Go | github.com/argoproj/argo-cd/v2 | ≥ 2.10.0&&< 2.10.4 | 2.10.4go get github.com/argoproj/argo-cd/v2@v2.10.4 |
Affected Products
argo cdargoprojResearch use only. For defensive security, authorized penetration testing, and academic research only. Never execute exploit code against systems without explicit written authorization.
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for github.com/argoproj/argo-cd, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
A fix is available for CVE-2024-21661; check the affected-versions list above or the advisory for the patched release of github.com/argoproj/argo-cd, then make sure no transitive dependency still pins the vulnerable range.
Workarounds
Stop feeding it untrusted input: reject or quarantine files and payloads from unverified sources until you can upgrade, restrict accepted formats to the ones you actually need, and run the parsing or decoding step in a least-privileged sandbox or short-lived worker so a crash or corrupted read cannot reach the rest of the process.
Fixing This On Your OS
If you run this on a Linux distribution, patch through your package manager against the distro's own security advisory below — it tracks the exact backported fix for your release, which can ship on a different timeline (and sometimes a different severity) than the upstream project.
Red Hat has investigated whether a possible mitigation exists for this issue, and has not been able to identify a practical example. Please update the affected package as soon as possible.Source: Red Hat security advisory for CVE-2024-21661 (CC BY 4.0)
| Product | Fixed in | Advisory |
|---|---|---|
| Red Hat OpenShift GitOps 1.10 | openshift-gitops-1/argocd-rhel8:v1.10.4-1 | RHSA-2024:1700 |
| Red Hat OpenShift GitOps 1.11 | openshift-gitops-1/argocd-rhel8:v1.11.3-2 | RHSA-2024:1697 |
| Red Hat OpenShift GitOps 1.12 | openshift-gitops-argocd-cli-0:1.12.1-5.el8 | RHSA-2024:1752 |
| Red Hat OpenShift GitOps 1.12 | openshift-gitops-1/argocd-rhel8:v1.12.1-1 | RHSA-2024:1753 |
Frequently Asked Questions
Is CVE-2024-21661 in your dependencies?
Find it across Go, including transitive dependencies.