GHSA-X2QC-CMH9-F4HF
Vulnerability from github – Published: 2026-06-17 18:48 – Updated: 2026-06-17 18:48Summary
A Deno program that opens a client WebSocket connection could be crashed by
the remote server. While handling the WebSocket handshake response, Deno parsed
the Sec-WebSocket-Protocol and Sec-WebSocket-Extensions response headers in
a way that assumed their bytes were always printable ASCII. A response header
containing non-visible-ASCII bytes (0x80-0xFF) caused a panic that aborted
the entire Deno process.
Details
When establishing a client WebSocket connection, Deno read the
Sec-WebSocket-Protocol and Sec-WebSocket-Extensions headers from the
server's 101 Switching Protocols response and converted them to strings
without handling the failure case. HeaderValue::to_str() returns an error for
any value containing bytes outside the visible-ASCII range, so a header carrying
such bytes triggered an unrecoverable error during conversion.
Because the client initiates the outbound connection, the handshake response is
fully controlled by the server. A server that returns bytes such as 0xFF 0xFE
in either header could therefore crash any client that connected to it.
This is purely an availability issue. There is no information disclosure and no memory-safety impact; the only effect is termination of the current process.
Impact
Remote denial of service. Any Deno application that establishes WebSocket
connections to untrusted or potentially-compromised endpoints could be
terminated by the remote peer. Exploitation requires the victim application to
initiate the outbound WebSocket connection. An attacker who controls the
WebSocket endpoint, or who can man-in-the-middle a plaintext ws:// connection,
could trigger the crash. The effect is confined to crashing the process that
opened the connection.
Patch
The issue is fixed in Deno 2.7.5. The header values are now parsed with
graceful fallbacks: values that cannot be represented as ASCII strings are
skipped instead of aborting the process. A regression test covers a server that
returns non-ASCII bytes in Sec-WebSocket-Protocol.
Users should upgrade to Deno 2.7.5 or later.
Workarounds
Until you can upgrade, only connect to trusted WebSocket endpoints and prefer
wss:// (TLS) over ws://, which prevents a network man-in-the-middle from
injecting malicious header bytes into the handshake response.
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c= 2.7.4"
},
"package": {
"ecosystem": "crates.io",
"name": "deno"
},
"ranges": [
{
"events": [
{
"introduced": "0"
},
{
"fixed": "2.7.5"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-55517"
],
"database_specific": {
"cwe_ids": [
"CWE-248"
],
"github_reviewed": true,
"github_reviewed_at": "2026-06-17T18:48:18Z",
"nvd_published_at": null,
"severity": "MODERATE"
},
"details": "## Summary\n\nA Deno program that opens a client `WebSocket` connection could be crashed by\nthe remote server. While handling the WebSocket handshake response, Deno parsed\nthe `Sec-WebSocket-Protocol` and `Sec-WebSocket-Extensions` response headers in\na way that assumed their bytes were always printable ASCII. A response header\ncontaining non-visible-ASCII bytes (`0x80`-`0xFF`) caused a panic that aborted\nthe entire Deno process.\n\n## Details\n\nWhen establishing a client WebSocket connection, Deno read the\n`Sec-WebSocket-Protocol` and `Sec-WebSocket-Extensions` headers from the\nserver\u0027s `101 Switching Protocols` response and converted them to strings\nwithout handling the failure case. `HeaderValue::to_str()` returns an error for\nany value containing bytes outside the visible-ASCII range, so a header carrying\nsuch bytes triggered an unrecoverable error during conversion.\n\nBecause the client initiates the outbound connection, the handshake response is\nfully controlled by the server. A server that returns bytes such as `0xFF 0xFE`\nin either header could therefore crash any client that connected to it.\n\nThis is purely an availability issue. There is no information disclosure and no\nmemory-safety impact; the only effect is termination of the current process.\n\n## Impact\n\nRemote denial of service. Any Deno application that establishes WebSocket\nconnections to untrusted or potentially-compromised endpoints could be\nterminated by the remote peer. Exploitation requires the victim application to\ninitiate the outbound WebSocket connection. An attacker who controls the\nWebSocket endpoint, or who can man-in-the-middle a plaintext `ws://` connection,\ncould trigger the crash. The effect is confined to crashing the process that\nopened the connection.\n\n## Patch\n\nThe issue is fixed in Deno `2.7.5`. The header values are now parsed with\ngraceful fallbacks: values that cannot be represented as ASCII strings are\nskipped instead of aborting the process. A regression test covers a server that\nreturns non-ASCII bytes in `Sec-WebSocket-Protocol`.\n\nUsers should upgrade to Deno `2.7.5` or later.\n\n## Workarounds\n\nUntil you can upgrade, only connect to trusted WebSocket endpoints and prefer\n`wss://` (TLS) over `ws://`, which prevents a network man-in-the-middle from\ninjecting malicious header bytes into the handshake response.",
"id": "GHSA-x2qc-cmh9-f4hf",
"modified": "2026-06-17T18:48:18Z",
"published": "2026-06-17T18:48:18Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/denoland/deno/security/advisories/GHSA-x2qc-cmh9-f4hf"
},
{
"type": "PACKAGE",
"url": "https://github.com/denoland/deno"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L",
"type": "CVSS_V3"
}
],
"summary": "Deno: Denial of service via non-ASCII bytes in WebSocket response headers"
}
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.