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-69208

CVE-2026-69208: Memory Leak and Denial of Service in http4s DigestAuth Middleware

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 15, 2026·6 min read·13 visits

Executive Summary (TL;DR)

An inverted logic comparison in http4s DigestAuth middleware prevents the eviction of stale cryptographic nonces while deleting fresh ones. Unauthenticated attackers can repeatedly request authentication challenges, filling the JVM heap memory until the application crashes.

A critical memory leak vulnerability exists in the server-side DigestAuth middleware of the http4s library. Due to a logical inversion in the stale-nonce clean-up routine, the internal cache fails to evict stale nonces while prematurely purging fresh ones. Unauthenticated remote attackers can exploit this behavior by repeatedly prompting the server for authentication challenges, leading to unbounded memory consumption and application crashes via a java.lang.OutOfMemoryError.

Vulnerability Overview

The vulnerability affects the http4s Scala library, specifically within its server-side DigestAuth middleware implemented in components such as DigestAuth.scala, NonceKeeper.scala, and NonceKeeperF.scala. The DigestAuth middleware provides HTTP Digest Access Authentication, protecting defined routes by validating request credentials against unique, short-lived cryptographic tokens called nonces.

To prevent reply attacks and control session validity, the server maintains nonces inside an internal, insertion-ordered LinkedHashMap. The middleware uses this map to keep track of valid tokens and is designed to periodically evict expired tokens that exceed a configured lifetime (staleTimeout). Under normal operations, this cache management system ensures that memory consumption remains bounded and stable even under heavy user activity.

However, a logic error in the eviction subroutine reverses the stale-nonce check condition. The application incorrectly retains expired nonces indefinitely and deletes active sessions instead. Because this middleware operates on unauthenticated endpoints to challenge incoming requests, any remote user can trigger the generation of new cached nonces, presenting a major remote attack surface.

Root Cause Analysis

The root cause of this vulnerability lies in a logic inversion bug within the eviction routing of both the legacy NonceKeeper class and the effect-based NonceKeeperF class. Under the HTTP Digest Authentication specification, nonces are tracked chronologically to ensure older elements are processed first. The eviction loop utilizes an iterator over the underlying map, walking from the oldest entry to the newest.

In the vulnerable codebase, the age of each nonce is evaluated against the staleTimeout parameter using the following comparison: staleTimeout > age (calculated as current time minus creation time). When this inequality evaluates to true, the elapsed time is less than the threshold, indicating that the token is still active and valid. Because of the logic flaw, the code incorrectly identifies active nonces as candidates for deletion and removes them via it.remove().

Conversely, when the loop encounters the first truly expired nonce, the age exceeds the timeout, making the statement staleTimeout > age evaluate to false. At this point, the conditional check fails and the recursive eviction subroutine halts immediately. Since the collection is organized sequentially by insertion time, the presence of a single expired nonce at the head of the collection blocks all subsequent stale nonces from being evaluated, leading to a permanent memory leak.

Code Analysis and Comparative Review

Analyzing the implementation details highlights the exact line-level differences before and after the remediation. In the vulnerable version of NonceKeeper.scala, the tail-recursive clean-up loop was written as follows:

val it = nonces.values().iterator()
@tailrec
def dropStale(): Unit = {
  // BUG: staleTimeout > age evaluates to true only for active, fresh nonces
  if (it.hasNext && staleTimeout > d - it.next().created.getTime) {
    it.remove() // Incorrectly deletes the valid nonce
    dropStale() // Recursively continues
  }
  // Loop exits on the first expired nonce, leaving it and all newer entries in memory
}

In the patched version of the file, the maintainers corrected the conditional operator to verify that the elapsed age is greater than or equal to the timeout threshold:

val it = nonces.values().iterator()
@tailrec
def dropStale(): Unit = {
  // FIX: Verify that the nonce has actually aged past the stale timeout limit
  if (it.hasNext && d - it.next().created.getTime >= staleTimeout) {
    it.remove() // Safely expels the expired nonce
    dropStale() // Continues to clean up subsequent expired nonces
  }
  // Loop correctly terminates once it encounters the first valid (fresh) nonce
}

Additionally, to safeguard the application from extreme, rapid volume surges that could overwhelm the background thread's clean-up frequency, the maintainers implemented a hard cap on the size of the underlying LinkedHashMap by overriding the removeEldestEntry method in NonceKeeperF.scala. This ensures that the map self-truncates if it reaches the maximum capacity defined by the maxNonces parameter.

Exploitation Methodology

Exploiting this flaw does not require authentication or specific request structures. An attacker targets any endpoint protected by the DigestAuth middleware and executes the following programmatic steps:

  1. The attacker issues an initial HTTP request to the protected path without an Authorization header.

  2. The server responds with an HTTP 401 Unauthorized status and includes a WWW-Authenticate header containing a newly generated, unique nonce value.

  3. The server allocates memory for this new nonce and stores it in the LinkedHashMap cache.

  4. The attacker ignores the challenge and repeats step 1 at a high frequency. Because the eviction subroutine is broken, none of the generated nonces are ever discarded from the server's memory.

This sequence can be automated with simple HTTP flooding utilities. Over time, the accumulated footprint of the NonceF metadata blocks, hash map entries, and string keys exhausts the allocated Java Virtual Machine (JVM) heap space, resulting in severe performance degradation and an eventual crash.

Impact Assessment and Residual Risks

The primary impact of CVE-2026-69208 is complete denial of service. Because the application crashes due to a heap exhaustion event (java.lang.OutOfMemoryError), the entire service becomes unresponsive, affecting all other endpoints running on the same JVM instance.

While the patch remediates the logic inversion and introduces a hard size limit (maxNonces), security teams must evaluate potential residual risks. The default value for maxNonces is set to 1,000,000. In resource-constrained environments (such as Kubernetes pods running with less than 1GB of RAM), storing up to one million complex nonce objects, dates, and corresponding reference metadata inside the JVM heap may still consume sufficient memory to trigger an OutOfMemoryError before the threshold limit is reached.

Furthermore, legacy methods retained for binary compatibility preserve the old signatures, which default the maxNonces parameter to Int.MaxValue. If downstream applications call these deprecated interfaces directly, they will remain unbounded, relying exclusively on the temporal clean-up loop.

Remediation and Mitigation

To fully resolve the vulnerability, organizations should upgrade their http4s dependencies to the patched releases.

Applications tracking the 0.23.x release branch must be updated to version 0.23.35 or later. Applications tracking the 1.0.0 milestone branch must be upgraded to 1.0.0-M47 or later.

If upgrading is not immediately possible, security teams can implement several tactical mitigations:

  • Configure upstream Web Application Firewalls (WAF) or reverse proxies to rate-limit unauthenticated requests targeting protected routes, preventing rapid nonce generation.

  • Set up explicit alerts on JVM memory usage, tracking rapid growth of NonceF and LinkedHashMap object allocations.

  • Avoid calling deprecated middleware builders that default the maximum nonce count to Int.MaxValue, and instead transition to initialization patterns that allow setting a conservative custom limit for maximum cached nonces.

Official Patches

http4sFix commit implementing corrected age check and map boundary limits.

Fix Analysis (1)

Technical Appendix

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

Affected Systems

http4s server-side applications deploying the DigestAuth middleware

Affected Versions Detail

Product
Affected Versions
Fixed Version
http4s
http4s
< 0.23.350.23.35
http4s
http4s
>= 1.0.0-M1, < 1.0.0-M471.0.0-M47
AttributeDetail
CWE IDCWE-400 / CWE-401
Attack VectorNetwork
CVSS v3.1 Score7.5 (High)
Attack ComplexityLow
Privileges RequiredNone (Unauthenticated)
ImpactDenial of Service (JVM Heap Exhaustion)
Exploit StatusPoC (Proof of Concept) available in test suites
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-400
Uncontrolled Resource Consumption

The software does not control, or limits improperly, the allocation and maintenance of a limited resource, enabling an actor to influence the amount of resources consumed.

References & Sources

  • [1]GitHub Security Advisory GHSA-fm4g-76c9-7w69
  • [2]Fix Commit on GitHub
  • [3]http4s v0.23.35 Release Tag
  • [4]http4s v1.0.0-M47 Release Tag
  • [5]CVE-2026-69208 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 2 hours ago•CVE-2026-119282
7.3

CVE-2026-119282: OS Command Injection via Plugin Options in Nx (@nx/maven and @nx/gradle)

An OS command injection and argument injection vulnerability exists in the Nx build system and its official Maven (@nx/maven) and Gradle (@nx/gradle) plugins. When constructing the project dependency graph, the plugins invoke underlying Java build wrappers via subshells while interpolating unsanitized plugin options directly from nx.json into the command arguments. An attacker who supplies a crafted nx.json file via a repository or pull request can execute arbitrary shell commands with the privileges of the user or CI/CD runner invoking any Nx command that computes the project graph.

Amit Schendel
Amit Schendel
4 views•10 min read
•about 3 hours ago•CVE-2026-59978
7.5

CVE-2026-59978: Persistent Denial of Service via Array Injection in AdminNeo

AdminNeo versions 4.6.2 through 5.4.1 contain an improper input validation vulnerability (CWE-20) in the version verification endpoint (?script=version). An unauthenticated remote attacker can submit a crafted HTTP POST request containing an array parameter for 'version', which is serialized into a shared server-side temporary cache file without type checking or authentication. On subsequent requests, the application deserializes this cached array and passes it to cookie() and rawurlencode(), triggering an uncaught fatal TypeError in PHP 8.x environments and causing a persistent 24-hour Denial of Service (DoS) for all users.

Amit Schendel
Amit Schendel
4 views•8 min read
•about 4 hours ago•GHSA-FGXM-5HVV-X4VH
5.3

GHSA-fgxm-5hvv-x4vh: Private Repository Enumeration via Go Module Discovery and HTTP Response Discrepancies in Soft Serve

Charmbracelet Soft Serve versions 0.5.0 through 0.12.2 contain an authorization bypass and observable response discrepancy vulnerability in the HTTP Git server. Remote attackers can determine the existence, exact names, and clone URLs of private repositories by issuing crafted Go remote import path discovery requests (?go-get=1) or by observing differential HTTP status codes across Git Smart HTTP, Dumb HTTP, and Git LFS endpoints.

Alon Barad
Alon Barad
5 views•12 min read
•about 5 hours ago•GHSA-F3FJ-9625-RV3M
5.9

GHSA-f3fj-9625-rv3m: Race Condition in Soft Serve Repository Cache Invalidation

A Time-of-Check to Time-of-Use (TOCTOU) race condition in Charmbracelet Soft Serve versions 0.6.0 through 0.12.2 allows unauthenticated users to retain read access to repositories after their visibility is changed from public to private. The flaw stems from premature cache invalidation in the SetPrivate method prior to committing the visibility update to the underlying database. Concurrent read requests arriving during the database transaction window repopulate the non-expiring in-memory LRU cache with stale public metadata, bypassing access controls across HTTP, SSH, and Git protocols until the server process is restarted.

Alon Barad
Alon Barad
4 views•10 min read
•about 6 hours ago•CVE-2026-119283
7.5

CVE-2026-119283: Unbounded JWE Recipients Array Causes CPU Exhaustion in Authlib joserfc

A resource consumption vulnerability exists in the Authlib joserfc Python library prior to version 1.7.5. When processing JSON Web Encryption (JWE) objects formatted using General JSON Serialization, the library fails to enforce an upper bound on the number of elements within the recipients array. An unauthenticated attacker can supply a JWE containing thousands of recipient entries targeting an RSA key management algorithm, forcing the server to perform an equivalent number of computationally expensive RSA private-key decryption operations per request and exhausting available CPU resources.

Alon Barad
Alon Barad
4 views•9 min read
•about 7 hours ago•CVE-2026-119284
6.9

CVE-2026-119284: Uncontrolled Resource Consumption in joserfc Compact Deserialization

CVE-2026-119284 (GHSA-9pg5-8c7x-5hfx) is an uncontrolled resource consumption vulnerability (CWE-400) in the compact serialization deserialization routines of joserfc prior to version 1.7.6. The library enforced individual segment size limits only after invoking Python's bytes.split(b'.') on untrusted input tokens. By sending oversized compact JWS or JWE tokens, an unauthenticated remote attacker can force the Python interpreter to duplicate and allocate memory for every segment before size validation executes, resulting in memory exhaustion and an Endpoint Denial of Service (DoS).

Amit Schendel
Amit Schendel
8 views•10 min read