hono

Ecosystem: npm

Downloads: 338.08 Mln

Vulnerabilities from the last (months)
  • 0CriticalAffects 0 versions
  • 7HighAffects 7 versions
  • 0MediumAffects 0 versions
  • 44ModerateAffects 44 versions
  • 5LowAffects 5 versions
Severity distribution (all time)
56vulnerabilities
  • Critical0 (0.0%)
  • High7 (12.5%)
  • Medium0 (0.0%)
  • Moderate44 (78.6%)
  • Low5 (8.9%)

Monthly breakdown

  • Critical
  • High
  • Medium
  • Moderate
  • Low
  • 1 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 1
    • Low: 0
  • 5 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 4
    • Low: 1
  • 4 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 3
    • Low: 1
  • 5 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 5
    • Low: 0
  • 10 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 9
    • Low: 0
  • 5 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 4
    • Low: 1
  • 6 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 6
    • Low: 0
  • 4 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 3
    • Low: 0
  • 2 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 0
    • Low: 1
  • 6 vulnerabilities
    • Critical: 0
    • High: 2
    • Medium: 0
    • Moderate: 4
    • Low: 0
  • 2 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 1
    • Low: 0
  • 2 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 1
    • Low: 0
  • 1 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 1
    • Low: 0
  • 1 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 0
    • Low: 1
  • 1 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 1
    • Low: 0
  • 1 vulnerabilities
    • Critical: 0
    • High: 0
    • Medium: 0
    • Moderate: 1
    • Low: 0

Vulnerabilities (56)

Known vulnerabilities affecting hono, based on data from OSV.

Vulnerabilities affecting hono
IDSeveritySummaryAffected versionsPublishedSource
GHSA-5r4p-p66f-jhc7ModerateHono: `serveStatic` decodes the request path a second time, leading to bypass of middleware on static paths### Summary `serveStatic` decodes the request path a second time after Hono has already decoded it for routing. A crafted request can be routed as one path and served as another, so middleware mounted on a static prefix does not run for a file under that prefix. ### Details Hono decodes the request path once before routing. `serveStatic` decoded it again before resolving the file. With a malformed percent-encoded sequence, the first decode leaves part of the path encoded, the router matches the encoded form, and the second decode resolves the real directory. The file is still resolved insid
  • >= 4.12.4, < 4.13.11
GitHub (opens in a new tab)
GHSA-hxh3-vqpv-xpqvModeratehono/jsx renders plain strings unescaped in boundary components, leading to XSS### Summary `hono/jsx` does not HTML-escape a plain string placed directly as a child or `fallback` of `Suspense` or `ErrorBoundary`, as the only child of a `Context.Provider`, or as the root value of `renderToString()` / `renderToReadableStream()` from `hono/jsx/dom/server`. Such a string is emitted as markup instead of text. ### Details These paths stringify their input and treat the result as already-escaped HTML, so a plain string passes through unchanged. Notable cases: - `Suspense`: a string child, or a string `fallback` while a child suspends. With streaming, the fallback reaches th
  • < 4.13.7
GitHub (opens in a new tab)
GHSA-6623-4q32-82v8LowDuplicate Advisory: hono/jsx renders plain strings unescaped in boundary components, leading to XSS## Duplicate Advisory This advisory has been withdrawn because it is a duplicate of GHSA-hxh3-vqpv-xpqv. This link is maintained to preserve external references. ## Original Description hono before 4.13.7 fails to HTML-escape plain strings rendered by hono/jsx as a child or fallback of Suspense, as a string child of ErrorBoundary alongside an asynchronous sibling, as the single child of a Context.Provider, or as the root value passed to renderToString() or renderToReadableStream() from hono/jsx/dom/server. These paths stringify their input and treat the result as already-escaped markup, so a
  • all
GitHub (opens in a new tab)
GHSA-crvj-82cr-hjcxModerateHono: Query parser reads parameters after the URL fragment, causing cache-key and proxy interpretation differentials### Summary Hono's query parsing does not stop at the URL fragment: a `?` appearing after a `#` is treated as the start of a query string. As a result, the application can read request parameters that no other component involved in handling the request can see. ### Details A fragment is never part of the query, and every standard URL consumer — browsers, `new URL()`, reverse proxies — ignores everything from the first `#` onward. Hono's routing followed that rule; its query helpers did not. For one and the same request, this produces an interpretation differential: - A component in front
  • < 4.13.5
GitHub (opens in a new tab)
GHSA-g6gw-c38x-mqfcModerateHono: Unbounded dot-notation nesting in `parseBody()` can cause memory exhaustion### Summary When `parseBody()` expands dot-separated form field names into nested objects, it does not limit the nesting depth or the total number of objects created. A request body well within a normal size limit can therefore allocate an object graph far larger than the request itself, and concurrent requests can exhaust the heap and terminate the process. ### Details Each dot-separated segment of a field name creates an intermediate object. Neither the segments within a single field name nor the total across a request was bounded, and empty segments were preserved, so a field name could
  • < 4.13.5
GitHub (opens in a new tab)
GHSA-gqvv-2mrq-wpjvModerateHono: Incomplete fix for CVE-2026-39408: `toSSG()` still writes files outside the output directory### Summary The fix released for CVE-2026-39408 does not cover every traversal sequence. `toSSG()` can still write files outside the configured output directory when a route parameter contains consecutive parent-directory segments. ### Details Static site generation builds each output path from the route path and the values supplied through `ssgParams`, then verifies that the result stays inside the output directory. That check normalizes the path with the same routine that built it, and the routine did not fully collapse runs of consecutive parent-directory segments. A value carrying enoug
  • < 4.13.5
GitHub (opens in a new tab)
GHSA-54fx-42gc-7vw4ModerateHono: Algorithmic Complexity DoS in Language Middleware### Summary The `languageDetector` middleware is vulnerable to algorithmic complexity denial of service when processing a crafted language tag containing a large number of hyphen-separated subtags. ### Details To implement progressive language-tag truncation, `normalizeLanguage()` repeatedly calls `parts.slice(0, i).join('-')` for every possible prefix. The total amount of string processing grows quadratically with the number of subtags. Language values may come from a query parameter, cookie, `Accept-Language` header, or URL path, depending on the detector configuration. The default detec
  • >= 4.12.0, < 4.12.34
GitHub (opens in a new tab)
GHSA-79qm-7rj5-m7r9LowHono: Proxy Helper does not remove response headers listed in the `Connection` header### Summary The Proxy Helper (`hono/proxy`) does not remove response headers named by the origin's `Connection` header. Headers that the origin marked as connection-scoped are therefore forwarded to clients. ### Details Per RFC 9110 Section 7.6.1, an intermediary must remove the header fields listed in a message's `Connection` header field before forwarding the message, in addition to the well-known hop-by-hop headers. The `proxy()` function removed the well-known hop-by-hop headers (including `Connection` itself) from origin responses, but did not remove the headers that the response's `Co
  • >= 4.7.0, < 4.12.34
GitHub (opens in a new tab)
GHSA-f23p-vx2j-j53rModerateHono: `memo()` retains SSR output across requests, leading to cross-user data disclosure### Summary `memo()` from `hono/jsx` retains the result of a server-side render and reuses it for later renders with comparator-equal props. Request-scoped values read inside the component take no part in that comparison, so a response can contain HTML rendered for another user's request. ### Details Components wrapped with `memo()` are compared by props alone. Values read implicitly during rendering do not participate: JSX Context through `createContext()` and `useContext()`, `useRequestContext()` from `hono/jsx-renderer`, and `getContext()` from `hono/context-storage`. The retained result
  • >= 3.8.0, < 4.12.34
GitHub (opens in a new tab)
GHSA-8j4g-w8fx-2239ModerateHono: ReDoS in CORS middleware via Access-Control-Request-Headers### Summary The built-in CORS middleware (`hono/cors`) parses the attacker-controlled `Access-Control-Request-Headers` request header during a preflight (`OPTIONS`) request using a regular expression whose running time is quadratic in the input length. A single request carrying a long run of whitespace can consume seconds of CPU, and repeated requests can render the service unresponsive. This parsing runs under the default configuration. ### Details On a CORS preflight, when `allowHeaders` is not configured - the default - the middleware reflects and parses the `Access-Control-Request-Heade
  • < 4.12.34
GitHub (opens in a new tab)
  • GHSA-5r4p-p66f-jhc7Moderate
    Hono: `serveStatic` decodes the request path a second time, leading to bypass of middleware on static paths
    • >= 4.12.4, < 4.13.11

    ### Summary `serveStatic` decodes the request path a second time after Hono has already decoded it for routing. A crafted request can be routed as one path and served as another, so middleware mounted on a static prefix does not run for a file under that prefix. ### Details Hono decodes the request path once before routing. `serveStatic` decoded it again before resolving the file. With a malformed percent-encoded sequence, the first decode leaves part of the path encoded, the router matches the encoded form, and the second decode resolves the real directory. The file is still resolved insid

    CVE: CVE-2026-109955

  • GHSA-hxh3-vqpv-xpqvModerate
    hono/jsx renders plain strings unescaped in boundary components, leading to XSS
    • < 4.13.7

    ### Summary `hono/jsx` does not HTML-escape a plain string placed directly as a child or `fallback` of `Suspense` or `ErrorBoundary`, as the only child of a `Context.Provider`, or as the root value of `renderToString()` / `renderToReadableStream()` from `hono/jsx/dom/server`. Such a string is emitted as markup instead of text. ### Details These paths stringify their input and treat the result as already-escaped HTML, so a plain string passes through unchanged. Notable cases: - `Suspense`: a string child, or a string `fallback` while a child suspends. With streaming, the fallback reaches th

    CVE: CVE-2026-93981

  • GHSA-6623-4q32-82v8Low
    Duplicate Advisory: hono/jsx renders plain strings unescaped in boundary components, leading to XSS
    • all

    ## Duplicate Advisory This advisory has been withdrawn because it is a duplicate of GHSA-hxh3-vqpv-xpqv. This link is maintained to preserve external references. ## Original Description hono before 4.13.7 fails to HTML-escape plain strings rendered by hono/jsx as a child or fallback of Suspense, as a string child of ErrorBoundary alongside an asynchronous sibling, as the single child of a Context.Provider, or as the root value passed to renderToString() or renderToReadableStream() from hono/jsx/dom/server. These paths stringify their input and treat the result as already-escaped markup, so a

  • GHSA-crvj-82cr-hjcxModerate
    Hono: Query parser reads parameters after the URL fragment, causing cache-key and proxy interpretation differentials
    • < 4.13.5

    ### Summary Hono's query parsing does not stop at the URL fragment: a `?` appearing after a `#` is treated as the start of a query string. As a result, the application can read request parameters that no other component involved in handling the request can see. ### Details A fragment is never part of the query, and every standard URL consumer — browsers, `new URL()`, reverse proxies — ignores everything from the first `#` onward. Hono's routing followed that rule; its query helpers did not. For one and the same request, this produces an interpretation differential: - A component in front

    CVE: CVE-2026-84363

  • GHSA-g6gw-c38x-mqfcModerate
    Hono: Unbounded dot-notation nesting in `parseBody()` can cause memory exhaustion
    • < 4.13.5

    ### Summary When `parseBody()` expands dot-separated form field names into nested objects, it does not limit the nesting depth or the total number of objects created. A request body well within a normal size limit can therefore allocate an object graph far larger than the request itself, and concurrent requests can exhaust the heap and terminate the process. ### Details Each dot-separated segment of a field name creates an intermediate object. Neither the segments within a single field name nor the total across a request was bounded, and empty segments were preserved, so a field name could

    CVE: CVE-2026-84364

  • GHSA-gqvv-2mrq-wpjvModerate
    Hono: Incomplete fix for CVE-2026-39408: `toSSG()` still writes files outside the output directory
    • < 4.13.5

    ### Summary The fix released for CVE-2026-39408 does not cover every traversal sequence. `toSSG()` can still write files outside the configured output directory when a route parameter contains consecutive parent-directory segments. ### Details Static site generation builds each output path from the route path and the values supplied through `ssgParams`, then verifies that the result stays inside the output directory. That check normalizes the path with the same routine that built it, and the routine did not fully collapse runs of consecutive parent-directory segments. A value carrying enoug

    CVE: CVE-2026-84365

  • GHSA-54fx-42gc-7vw4Moderate
    Hono: Algorithmic Complexity DoS in Language Middleware
    • >= 4.12.0, < 4.12.34

    ### Summary The `languageDetector` middleware is vulnerable to algorithmic complexity denial of service when processing a crafted language tag containing a large number of hyphen-separated subtags. ### Details To implement progressive language-tag truncation, `normalizeLanguage()` repeatedly calls `parts.slice(0, i).join('-')` for every possible prefix. The total amount of string processing grows quadratically with the number of subtags. Language values may come from a query parameter, cookie, `Accept-Language` header, or URL path, depending on the detector configuration. The default detec

    CVE: CVE-2026-71848

  • GHSA-79qm-7rj5-m7r9Low
    Hono: Proxy Helper does not remove response headers listed in the `Connection` header
    • >= 4.7.0, < 4.12.34

    ### Summary The Proxy Helper (`hono/proxy`) does not remove response headers named by the origin's `Connection` header. Headers that the origin marked as connection-scoped are therefore forwarded to clients. ### Details Per RFC 9110 Section 7.6.1, an intermediary must remove the header fields listed in a message's `Connection` header field before forwarding the message, in addition to the well-known hop-by-hop headers. The `proxy()` function removed the well-known hop-by-hop headers (including `Connection` itself) from origin responses, but did not remove the headers that the response's `Co

    CVE: CVE-2026-71849

  • GHSA-f23p-vx2j-j53rModerate
    Hono: `memo()` retains SSR output across requests, leading to cross-user data disclosure
    • >= 3.8.0, < 4.12.34

    ### Summary `memo()` from `hono/jsx` retains the result of a server-side render and reuses it for later renders with comparator-equal props. Request-scoped values read inside the component take no part in that comparison, so a response can contain HTML rendered for another user's request. ### Details Components wrapped with `memo()` are compared by props alone. Values read implicitly during rendering do not participate: JSX Context through `createContext()` and `useContext()`, `useRequestContext()` from `hono/jsx-renderer`, and `getContext()` from `hono/context-storage`. The retained result

    CVE: CVE-2026-71850

  • GHSA-8j4g-w8fx-2239Moderate
    Hono: ReDoS in CORS middleware via Access-Control-Request-Headers
    • < 4.12.34

    ### Summary The built-in CORS middleware (`hono/cors`) parses the attacker-controlled `Access-Control-Request-Headers` request header during a preflight (`OPTIONS`) request using a regular expression whose running time is quadratic in the input length. A single request carrying a long run of whitespace can consume seconds of CPU, and repeated requests can render the service unresponsive. This parsing runs under the default configuration. ### Details On a CORS preflight, when `allowHeaders` is not configured - the default - the middleware reflects and parses the `Access-Control-Request-Heade

    CVE: CVE-2026-69207

Showing 1-10 of 56 vulnerabilities