High

QTINeon has unauthenticated relay-to-host amplification via unbounded RECONNECT_REQUEST forwarding

  • Disclosed: 28.07.2026
  • Updated: 11.10.2026 14:18

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)

Affected software

Click a technology to see all vulnerabilities affecting it.

PlatformPackageVulnerable versionsFixed in
Java / Kotlin (Maven) com.quietterminal:qti-neon = 1.0.0 no fix
npm package qti-neon = 1.0.0 no fix
Python (PyPI) qti-neon = 1.0.0 no fix

References

CVSS score 8.6/10
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:N/I:N/A:H
Weakness (CWE)
CWE-400, CWE-406, CWE-770
Platform
Java / Kotlin (Maven), npm, Python (PyPI)
Package
com.quietterminal:qti-neon, qti-neon
Disclosed
28.07.2026
Updated
11.10.2026 14:18

Sources and licenses

OSV / GitHub Advisory Database - GHSA-85rg-p3fr-xc2f - CC BY 4.0

OSV / GitHub Advisory Database - PYSEC-2026-3615 - PyPA Advisory Database; CC BY 4.0

Vulnerability history: com.quietterminal:qti-neon

All published vulnerabilities of this package (Java / Kotlin (Maven)), newest first. Shows whether this is a one-off slip or a package that needs watching.

This is the only known vulnerability of this package.

Know which vulnerabilities affect your application

With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.

Connect your application
DockRay newsletter

Application security in your inbox

Important vulnerabilities, actionable guidance and practical advice for your applications. Choose your technologies and follow what matters to your project.

  • A daily digest of new vulnerabilities, critical ones included.
  • Notifications about important updates.
  • Practical advice on application security and monitoring.

Leave empty to receive updates for every technology.

Free to subscribe. Unsubscribe with one click in any email.