Answer in brief
CVE-2026-54609 records a High severity missing auth vulnerability in QTINeon has unauthenticated relay-to-host amplification via unbounded RECONNECT_REQUEST forwarding. The source record does not mark it as known exploited. 3 affected packages are mapped in the feed.
Answer in brief
CVE-2026-54609 records a High severity missing auth vulnerability in QTINeon has unauthenticated relay-to-host amplification via unbounded RECONNECT_REQUEST forwarding. The source record does not mark it as known exploited. 3 affected packages are mapped in the feed.
Monitor this advisory for an available fix and review any installs of the affected package.
Local check
hol-guard supply-chain scanMissing Auth describes the vulnerability class recorded for this advisory. The current record does not mark CVE-2026-54609 as known exploited; continue to monitor the source for status changes. The feed includes package mappings that can be checked against lockfiles and deployed manifests.
| Package | Affected range | Fixed version |
|---|---|---|
| com.quietterminal:qti-neonmaven | =1.0.0 | Not reported |
| qti-neonnpm | =1.0.0 | Not reported |
| qti-neonpip | =1.0.0 | Not reported |
Reported by GitHub Security Advisories (ghsa).
CVE-2026-54609 records a High severity missing auth vulnerability in QTINeon has unauthenticated relay-to-host amplification via unbounded RECONNECT_REQUEST forwarding. The source record does not mark it as known exploited. 3 affected packages are mapped in the feed.
The source record does not mark it as known exploited.
Check lockfiles and deployed manifests for com.quietterminal:qti-neon, qti-neon, qti-neon.
HOL Guard can help your team review package activity against supported protection paths.
Explore HOL GuardMonitor this advisory for an available fix and review any installs of the affected package.
Local check
hol-guard supply-chain scanMissing Auth describes the vulnerability class recorded for this advisory. The current record does not mark CVE-2026-54609 as known exploited; continue to monitor the source for status changes. The feed includes package mappings that can be checked against lockfiles and deployed manifests.
| Package | Affected range | Fixed version |
|---|---|---|
| com.quietterminal:qti-neonmaven | =1.0.0 | Not reported |
| qti-neonnpm | =1.0.0 | Not reported |
| qti-neonpip | =1.0.0 | Not reported |
Reported by GitHub Security Advisories (ghsa).
CVE-2026-54609 records a High severity missing auth vulnerability in QTINeon has unauthenticated relay-to-host amplification via unbounded RECONNECT_REQUEST forwarding. The source record does not mark it as known exploited. 3 affected packages are mapped in the feed.
The source record does not mark it as known exploited.
Check lockfiles and deployed manifests for com.quietterminal:qti-neon, qti-neon, qti-neon.
HOL Guard can help your team review package activity against supported protection paths.
Explore HOL Guard### Impact The relay's reconnect handler forwards every `RECONNECT_REQUEST` to the host without deduplication or a size cap on the `pendingReconnects` map, unlike the connect flow which guards against this with `maxPendingConnections`. An unauthenticated attacker who knows a valid session ID can send `RECONNECT_REQUEST` packets from many spoofed source addresses; each packet that passes the session lookup is forwarded to the host as a new reconnect attempt. Because the per-source rate limiter assigns a fresh token bucket to each spoofed IP, it provides no protection. The host receives one forwarded packet per spoofed source per cleanup cycle, making the relay an amplification vector for denial-of-service against the host. The host's real address is never exposed to clients by design, so this is the primary viable DoS path against it. A secondary issue: once more than `maxRateLimiters` spoofed IPs are seen, `performCleanup` calls `rateLimiters.clear()`, resetting rate limit state for all sources including legitimate ones. Affected: `NeonRelay` in all three implementations (Java, Python, TypeScript). ### Patches Not yet patched. Fix consists of three changes to handleReconnectRequest in each implementation: 1. Reject the request if `pendingReconnects.size() >= maxPendingConnections` (mirrors the existing connect-flow guard) 2. Only forward to the host if the `sessionId:clientId` key is not already present in `pendingReconnects` — the map entry can still be updated with the new source address, but the host only needs to validate once per slot 3. In `performCleanup`, evict throttled entries before falling back to `rateLimiters.clear()` to avoid resetting legitimate sources' rate limit state ### Workarounds Operators can partially mitigate by placing the relay behind a network-level filter that drops packets with spoofed source addresses (BCP38/uRPF). This does not address the missing `pendingReconnects` size cap or the `rateLimiters.clear()` issue but eliminates the amplification path in most deployment environments. ### References - PROTOCOL.md — reconnect flow - ARCHITECTURE.md — reconnect handshake detail (step 4 describes the unbounded `put`)
### Impact The relay's reconnect handler forwards every `RECONNECT_REQUEST` to the host without deduplication or a size cap on the `pendingReconnects` map, unlike the connect flow which guards against this with `maxPendingConnections`. An unauthenticated attacker who knows a valid session ID can send `RECONNECT_REQUEST` packets from many spoofed source addresses; each packet that passes the session lookup is forwarded to the host as a new reconnect attempt. Because the per-source rate limiter assigns a fresh token bucket to each spoofed IP, it provides no protection. The host receives one forwarded packet per spoofed source per cleanup cycle, making the relay an amplification vector for denial-of-service against the host. The host's real address is never exposed to clients by design, so this is the primary viable DoS path against it. A secondary issue: once more than `maxRateLimiters` spoofed IPs are seen, `performCleanup` calls `rateLimiters.clear()`, resetting rate limit state for all sources including legitimate ones. Affected: `NeonRelay` in all three implementations (Java, Python, TypeScript). ### Patches Not yet patched. Fix consists of three changes to handleReconnectRequest in each implementation: 1. Reject the request if `pendingReconnects.size() >= maxPendingConnections` (mirrors the existing connect-flow guard) 2. Only forward to the host if the `sessionId:clientId` key is not already present in `pendingReconnects` — the map entry can still be updated with the new source address, but the host only needs to validate once per slot 3. In `performCleanup`, evict throttled entries before falling back to `rateLimiters.clear()` to avoid resetting legitimate sources' rate limit state ### Workarounds Operators can partially mitigate by placing the relay behind a network-level filter that drops packets with spoofed source addresses (BCP38/uRPF). This does not address the missing `pendingReconnects` size cap or the `rateLimiters.clear()` issue but eliminates the amplification path in most deployment environments. ### References - PROTOCOL.md — reconnect flow - ARCHITECTURE.md — reconnect handshake detail (step 4 describes the unbounded `put`)