CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-71849

CVE-2026-71849: Information Exposure via Hop-by-Hop Header Leakage in Hono Proxy Helper

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 7, 2026·6 min read·2 visits

Executive Summary (TL;DR)

Hono's proxy helper failed to dynamically strip custom connection-scoped headers specified in the response's Connection header, leading to information leakage of internal transit headers to clients.

A vulnerability in the Hono framework's Proxy Helper allows the exposure of connection-scoped, internal, or session-specific metadata to unauthorized actors. The proxy helper fails to remove header fields dynamically listed in the response's Connection header, violating RFC 9110 Section 7.6.1.

Vulnerability Overview

Hono is a web framework built on Web Standards with support for multiple JavaScript runtimes including Node.js, Deno, Bun, and Cloudflare Workers. Within this ecosystem, the Proxy Helper (hono/proxy) offers a proxy() utility designed to facilitate forwarding incoming HTTP requests to downstream origin servers. This component is commonly deployed in gateway layers, reverse proxies, and microservices architectures to simplify routing.

Between versions 4.7.0 and 4.12.33, the proxy() function in the Proxy Helper failed to handle connection-scoped headers in accordance with RFC 9110 Section 7.6.1. Specifically, the helper failed to inspect the incoming Connection header of origin responses dynamically, only removing a predefined static set of well-known hop-by-hop headers.

This architectural oversight results in the exposure of sensitive session-specific or internal metadata to unauthorized public clients. When an upstream server marks custom tracking headers or internal tokens as connection-scoped, the vulnerable proxy forwards these values instead of purging them, leading to a direct information leakage.

Root Cause Analysis

The root cause of this vulnerability lies in a protocol implementation defect related to HTTP/1.1 and modern proxy specifications. RFC 9110 Section 7.6.1 distinguishes between end-to-end headers, which must be delivered to the final recipient, and connection-scoped (hop-by-hop) headers, which apply only to a single transport link. Intermediaries must remove all hop-by-hop headers before forwarding an HTTP message.

Standard hop-by-hop headers such as Connection, Keep-Alive, and Transfer-Encoding are universally recognized and typically stripped by default. However, RFC 9110 also permits sender-defined custom hop-by-hop headers. These are dynamically listed as comma-separated values inside the Connection header field itself, signaling to the immediate receiver that they must not be forwarded.

The vulnerable implementation of hono/proxy relied exclusively on a static array named hopByHopHeaders. Because it only iterated over this hardcoded list, the proxy completely ignored the list of dynamic headers contained within the Connection response header value. Any custom header specified inside Connection: X-Custom-Header remained intact in the response headers and was subsequently forwarded to the public client.

Code Path and Patch Analysis

In vulnerable versions of Hono, the proxy function within src/helper/proxy/index.ts fetched the response from the upstream origin and initialized a new Headers object. It then executed a static loop to remove the predefined headers, leaving all other custom fields untouched regardless of the Connection header configuration.

// Vulnerable logic path in Hono
const res = await (customFetch || fetch)(req)
const resHeaders = new Headers(res.headers)
 
// Only stripped the static, well-known hop-by-hop headers
hopByHopHeaders.forEach((header) => {
  resHeaders.delete(header)
})

The patch introduced in commit 720b566290793d4358bf39843adcb7cf4da4548f remediates the issue by dynamically parsing the Connection header before executing the static deletion block. The corrected logic retrieves the Connection value, tokenizes it by commas, trims whitespace, and applies a regex filter to prevent invalid headers from manipulating the execution flow before programmatically deleting them.

// Patched implementation in v4.12.34
const res = await (customFetch || fetch)(req)
const resHeaders = new Headers(res.headers)
 
// Remove headers listed in the response's own Connection header (RFC 9110 Section 7.6.1)
const connectionValue = resHeaders.get('connection')
if (connectionValue) {
  connectionValue
    .split(',')
    .map((h) => h.trim())
    .filter((h) => ALLOWED_TOKEN_PATTERN.test(h))
    .forEach((h) => resHeaders.delete(h))
}
 
hopByHopHeaders.forEach((header) => {
  resHeaders.delete(header)
})

Exploitation Methodology

Exploitation of CVE-2026-71849 does not require an active exploit payload or memory manipulation. Instead, it relies on passive observation of headers returned through the Hono proxy interface. The attack surface exists when the backend server utilizes custom connection-scoped headers to pass localized infrastructure details, routing identifiers, or authentication tokens.

The following flowchart illustrates the communication path and the exact point where data leakage occurs:

As shown in the flow, when the origin backend server includes a dynamic header in the Connection directive, Hono deletes the Connection header itself but leaves the referenced custom header active. An attacker querying the proxy endpoint simply inspects the response headers to gather sensitive structural details or credentials that were meant to remain within the internal network segment.

Critical Bypass and Regression Analysis

During regression analysis, researchers must evaluate the behavior of the ALLOWED_TOKEN_PATTERN validation regex. Under HTTP RFC 9110, valid header name characters include alphanumeric characters as well as specific symbols. If the regex is overly restrictive, certain custom headers used by backends (such as those containing underscores or specialized characters) might be skipped by the filter and erroneously forwarded to the client.

Another area of concern is proxy asymmetry. A robust gateway proxy should sanitize both incoming request headers from clients and outgoing response headers from backends. If the client-to-backend request path does not properly sanitize client-supplied hop-by-hop headers, it may create conditions conducive to HTTP request smuggling or cache poisoning against upstream servers.

Finally, handling duplicate headers across multiple lines represents a potential edge case. Different JavaScript runtime engines (Node.js, Bun, Deno) parse multiple instances of the Connection header differently, sometimes merging them and other times only retaining the last declared value. This parsing variance can lead to incomplete header stripping if the engine fails to extract all tokens.

Remediation and Defensive Strategies

The primary and most effective remediation strategy is to upgrade the hono package to version 4.12.34 or higher. This ensures that the dynamic header sanitization logic is natively enforced inside the proxy helper. Organizations should verify that their dependency files are updated and run fresh installations across all staging and production builds.

If upgrading immediately is not viable, developers should implement a manual wrapper around the proxy() helper function. This wrapper must intercept the returned response, parse the Connection header, and explicitly delete all listed headers from the response header collection before returning the object to the routing cycle.

// Example of a manual mitigation wrapper in Hono middleware
app.get('/proxy-route/*', async (c) => {
  const response = await proxy(`https://backend-origin/${c.req.path}`)
  const safeHeaders = new Headers(response.headers)
  
  const connectionHeader = safeHeaders.get('connection')
  if (connectionHeader) {
    connectionHeader.split(',').forEach((h) => {
      safeHeaders.delete(h.trim())
    })
  }
 
  return new Response(response.body, {
    status: response.status,
    headers: safeHeaders
  })
})

Official Patches

honojsFix commit implementing dynamic connection-scoped header stripping

Fix Analysis (1)

Technical Appendix

CVSS Score
3.7/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N

Affected Systems

hono

Affected Versions Detail

Product
Affected Versions
Fixed Version
hono
honojs
>= 4.7.0, < 4.12.344.12.34
AttributeDetail
CWE IDCWE-200
Attack VectorNetwork
CVSS v3.13.7 (Low)
EPSS ScoreNot Available
ImpactInformation Exposure
Exploit StatusNone / Theoretical
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1005Data from Local System
Collection
T1552Unsecured Credentials
Credential Access
CWE-200
Exposure of Sensitive Information to an Unauthorized Actor

The product exposes sensitive information to an actor that is not explicitly authorized to have access to that information.

Vulnerability Timeline

Security patch committed
2026-08-03
Release v4.12.34 published
2026-08-03
Vulnerability published on CVE.org
2026-08-07
NVD index date
2026-08-07

References & Sources

  • [1]GitHub Security Advisory GHSA-79qm-7rj5-m7r9
  • [2]Fix Commit
  • [3]Hono Release v4.12.34
  • [4]CVE Record on CVE.org

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-71848
5.3

CVE-2026-71848: Algorithmic Complexity Denial of Service in Hono languageDetector Middleware

An Algorithmic Complexity Denial of Service (DoS) vulnerability exists in the Hono web application framework within its languageDetector middleware. From version 4.12.0 to 4.12.33, the progressive language-tag truncation routine (normalizeLanguage) performs string operations with a quadratic time complexity O(N^2) relative to the number of hyphen-separated subtags in the user-supplied language tag. This allows an unauthenticated remote attacker to cause resource exhaustion and CPU spikes, resulting in a full denial of service of the single-threaded JavaScript runtime.

Alon Barad
Alon Barad
1 views•5 min read
•about 3 hours ago•CVE-2026-71850
4.8

CVE-2026-71850: Server-Side Rendering Data Exposure in Hono JSX Memoization

A session data exposure vulnerability in the Hono web application framework (hono/jsx module) allows consecutive users to receive cached HTML outputs containing private data. When JSX components wrapped in `memo()` are rendered on the server, the caching mechanism utilizes a module-level closure that persists across independent HTTP requests. When subsequent requests occur with matching props, the components are not re-evaluated, and cached HTML is served. If these components read request-scoped or session-specific data via ambient APIs, the data of the first user is exposed to subsequent users.

Amit Schendel
Amit Schendel
2 views•6 min read
•about 4 hours ago•CVE-2026-71851
9.0

CVE-2026-71851: Use of Cryptographically Weak PRNG in crypto-js (Ill Bloom)

A severe, twelve-year-old cryptographic weakness in crypto-js (versions < 4.0.0) generated pseudorandom numbers using a custom Multiply-With-Carry (MWC) algorithm seeded from the non-secure Math.random(). This reduces 128-bit and 256-bit key spaces to just 2^39 and 2^47 possibilities, allowing offline brute-force attacks.

Alon Barad
Alon Barad
4 views•7 min read
•about 5 hours ago•CVE-2026-71870
4.8

CVE-2026-71870: Uncontrolled Resource Consumption (DoS) in pypdf ToUnicode CMap Parsing

An uncontrolled resource consumption vulnerability (CWE-400) exists in pypdf prior to version 6.15.0. When extracting text from a specially crafted PDF document, the parser fails to restrict token lengths within /ToUnicode CMap streams, causing unbounded memory allocation and process termination via Out-of-Memory (OOM) crashes.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 6 hours ago•CVE-2026-71852
4.8

CVE-2026-71852: Denial of Service via Excessive Iteration and Memory Exhaustion in pypdf CID Font Parsing

A Denial of Service (DoS) vulnerability exists in pypdf prior to version 6.15.0. When parsing maliciously crafted PDF files containing excessively large CID font width ranges, the library suffers from CPU starvation and memory exhaustion due to unconstrained loop expansion.

Amit Schendel
Amit Schendel
6 views•7 min read
•about 7 hours ago•CVE-2026-56818
6.5

CVE-2026-56818: Denial of Service via Memory Pinning in Netty Redis Array Aggregator

A vulnerability in Netty's Redis codec allows remote unauthenticated attackers to cause a memory-pinning Denial of Service (DoS) due to the failure to release partial aggregate state when specific error conditions occur in RedisArrayAggregator. When processing Redis Serialization Protocol (RESP) messages, the aggregator fails to clear internal queues and release retained direct byte buffers on exception paths triggered by exceeded maxElements or invalid length properties. If the pipeline does not explicitly tear down the connection upon detecting a decoder error, subsequent elements continue utilizing the stale context, allowing memory blocks to remain indefinitely pinned.

Amit Schendel
Amit Schendel
6 views•5 min read