Sep 22, 2026·7 min read·5 visits
A design flaw in Traefik's BasicAuth singleflight deduplication mechanism allows unauthenticated attackers to discover valid usernames by measuring timing differences during coordinated concurrent requests.
An unauthenticated timing oracle vulnerability exists in Traefik's BasicAuth middleware from version 3.6.11 up to (but not including) 3.7.13. By utilizing a request coalescing mechanism (singleflight.Group) that relies on server-side stored secret hashes for key generation, the software introduces a timing discrepancy. Concurrent requests targeting non-existent usernames generate identical singleflight keys and coalesce, resulting in accelerated response times. Conversely, requests targeting valid usernames produce distinct keys and execute independently, allowing remote attackers to systematically enumerate valid usernames.
Traefik is an open-source HTTP reverse proxy and load balancer widely utilized in modern cloud-native environments. To handle inbound traffic securely, Traefik includes a BasicAuth middleware that validates user credentials before forwarding traffic to upstream services. Because authentication verification relies on resource-heavy cryptographic hashing algorithms (such as bcrypt), the middleware is exposed to CPU exhaustion vectors. To protect system resources from parallel verification attacks, Traefik integrates Go's singleflight deduplication module.
Under normal execution, the singleflight mechanism blocks concurrent identical verification requests, resolves them with a single cryptographic check, and shares the verdict. However, from version 3.6.11 to 3.7.12, a severe structural flaw exists in how the singleflight lookup key is generated. This vulnerability exposes an observable timing discrepancy (CWE-208), allowing unauthenticated remote actors to determine the existence of specific configuration credentials.
While this timing oracle does not directly expose user passwords or bypass authentication mechanisms, it strips away the anonymity of system configurations. Attackers can leverage this capability to map out administrative and user accounts. This initial information collection facilitates subsequent, highly targeted brute-force and credential-stuffing campaigns against the deployment infrastructure.
The root cause of CVE-2026-88010 resides within the checkPassword function of Traefik's basic authentication middleware located at pkg/middlewares/auth/basic_auth.go. When a request arrives, the middleware must compute the cryptographic hash of the provided password and compare it to the stored secret. To optimize execution, Traefik wraps this calculation in a singleflightGroup.Do() block, which takes a string key to uniquely identify the workload.
The deduplication key is formulated as: key := strconv.Itoa(len(password)) + ":" + password + secret. Here, secret represents the server-configured hash retrieved via b.auth.Secrets(user). If the target username does not exist in the configuration database, the lookup returns an empty string (""). This causes the generated key to omit any user-specific identifiers, collapsing down to: len(password):password.
Because the key generation for non-existent users depends entirely on the attacker-supplied password, concurrent requests for different invalid usernames share the same key. The singleflight system intercepts these duplicate keys and coalesces them, executing only a single hash computation. Conversely, when a valid username is queried, its corresponding non-empty secret hash is appended to the key, generating a unique entry that bypasses coalescence. This logical divergence creates a reliable side-channel timing difference.
To understand the vulnerability mechanics and the subsequent remediation, we must examine the vulnerable code side-by-side with the official patch implemented in commit ddc1bf4660b85fd61fafdd821eb8216fb1a0b130.
In the vulnerable implementation, the application relies on the configuration state (secret) to differentiate the execution tracks within the deduplication library:
// VULNERABLE CODE PATH
func (b *basicAuth) checkPassword(user, password string) bool {
secret := b.auth.Secrets(user, b.auth.Realm)
// The addition of 'secret' here leaks user existence.
// If secret is empty, the key is identical across different invalid users.
key := strconv.Itoa(len(password)) + ":" + password + secret
match, _, _ := b.singleflightGroup.Do(key, func() (any, error) {
if secret == "" {
_ = b.checkSecret(password, b.notFoundSecret)
return false, nil
}
return b.checkSecret(password, secret), nil
})
return match.(bool)
}The patch addresses this issue by removing the server-configured secret from the singleflight key generation entirely. Instead, a dedicated function named singleflightKey constructs the deduplication key utilizing only client-controlled parameters:
// PATCHED CODE PATH
func (b *basicAuth) checkPassword(user, password string) bool {
secret := b.auth.Secrets(user, b.auth.Realm)
// Key is generated purely on client-supplied input via singleflightKey
match, _, _ := b.singleflightGroup.Do(singleflightKey(user, password), func() (any, error) {
if secret == "" {
_ = b.checkSecret(password, b.notFoundSecret)
return false, nil
}
return b.checkSecret(password, secret), nil
})
return match.(bool)
}
func singleflightKey(user, password string) string {
// Length-prefix avoids delimiter injection while retaining uniqueness per user.
return strconv.Itoa(len(user)) + ":" + user + ":" + password
}By prefixing the username length and concatenating the actual username, the keys for unknown1 and unknown2 remain structurally distinct: 8:unknown1:password versus 8:unknown2:password. This prevents any possibility of cross-user coalescence. Additionally, retaining the username inside the singleflight key is critical; completely omitting the username would let an attacker pass credentials for one user and receive the authentication verdict belonging to another (as detailed in GHSA-6765-c87h-8mrf). The fix is complete and robust against variant exploitation pathways.
Exploiting this timing oracle requires the coordination of concurrent HTTP requests. The objective is to measure whether a targeted probe request coalesces with an ongoing anchor request. Because the singleflight mechanism works in-memory on the active proxy, the attacker must send the anchor and probe requests in extremely close succession.
First, the attacker establishes a network latency baseline by sending multiple sequential authentication requests containing invalid usernames. Each request forces the proxy to run a dummy cryptographic comparison using the default fallback hash, resulting in a stable response latency ($T_{hash}$).
Second, the attacker initiates an active probe sequence. The attacker transmits an 'Anchor' request containing a known invalid username and a specific password. This request initiates the server-side dummy hashing routine, which takes $T_{hash}$ to complete. While this request is active, the attacker immediately sends a concurrent 'Probe' request containing the target username and the identical password.
If the target username is valid, the proxy generates a unique key, and the request is computed independently, taking the full $T_{hash}$ duration. However, if the target username is invalid, both requests generate the same singleflight key. The Probe request immediately coalesces with the Anchor request, blocking until the Anchor finishes. Consequently, both requests complete at nearly the same time, giving the Probe a response duration significantly shorter than the baseline ($T_{probe} < T_{hash} / 2$). By analyzing this differential across multiple cycles, attackers can reliably map the configuration landscape.
The impact of CVE-2026-88010 is classified as Medium, receiving a CVSS v4.0 base score of 6.3. The vulnerability is restricted to information disclosure, specifically exposing valid authentication usernames configured within Traefik's BasicAuth middleware. It does not allow for credential harvesting, authentication bypass, or arbitrary code execution on the target server.
Nonetheless, username enumeration represents a critical step in the cyber kill chain. In environments where basic authentication protects sensitive management API endpoints (such as the Traefik Dashboard or administrative backends), revealing valid usernames significantly narrows the scope of credential-stuffing attacks. This allows adversaries to optimize brute-force resources on verified accounts, bypassing account lockout mechanisms or avoiding detection by reducing noise.
Because the vulnerability requires the execution of tightly coordinated concurrent requests, it is highly sensitive to network latency, packet loss, and connection jitter. Consequently, exploitation is most practical over low-latency connections or when launched from within the same cloud region. The vulnerability is not listed in CISA's Known Exploited Vulnerabilities catalog, and there are currently no reports of exploitation in the wild.
The primary remediation for this vulnerability is to upgrade Traefik deployments to version 3.7.13 or newer. This version contains the updated key-generation logic that isolates each username in its own singleflight execution thread.
If upgrading is not immediately possible, several effective workarounds can reduce the risk. Organizations can transition from Basic Authentication to Digest Authentication within their Traefik middleware configurations. Digest Authentication is structurally unaffected by this timing oracle. Alternatively, deploying rate-limiting policies at the network boundary or Web Application Firewall (WAF) layer can disrupt the rapid, concurrent connections required to perform timing analysis.
Security teams can verify vulnerability remediation by deploying the unit test pattern established in the Traefik codebase. This test isolates the password verification callback, runs concurrent checks for distinct invalid usernames, and verifies that two independent hashing computations are recorded. If only one hashing computation is observed under concurrent conditions, the system remains vulnerable.
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
Traefik Traefik Labs | >= 3.6.11, < 3.7.13 | 3.7.13 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-208 |
| Attack Vector | Network |
| CVSS Score | 6.3 |
| EPSS Score | Not Rated |
| Impact | Username Enumeration |
| Exploit Status | Proof of Concept |
| KEV Status | Not Listed |
The system uses a verification mechanism whose execution duration varies based on the characteristics of the inputs, exposing a timing discrepancy.
Cloudreve versions prior to 4.18.0 contain a Server-Side Request Forgery (SSRF) vulnerability. The application's validation logic fails to canonicalize various IPv4-in-IPv6 transition formats, such as NAT64, 6to4, and Teredo addresses. Consequently, an authenticated user with remote-download permissions can issue requests that bypass SSRF network boundaries, enabling connection routing to loopback, private, or cloud metadata endpoints.
Hatchet V1 Dispatcher before version 0.95.3 fails to enforce proper tenant boundaries when managing active stream connections for durable task completions. Because the global lookup map is keyed solely by task external identifiers, authenticated attackers who obtain a victim's task UUID can register a stream subscription and receive task results belonging to another tenant.
CVE-2026-88978 is a critical cross-tenant data exposure vulnerability in Hatchet, a platform for orchestrating background tasks and durable workflows. The flaw exists in the durable-task event retrieval system where client-supplied task, node, and branch UUIDs are resolved via the ListSatisfiedEntries database query without verifying the tenant ownership of the requesting worker context.
Home Assistant Core prior to version 2026.2.3 is vulnerable to Server-Side Request Forgery (SSRF) via the IPP integration's auto-discovery mechanism. Unauthenticated mDNS advertisements can trigger HTTP requests that follow malicious redirects to loopback interfaces.
CVE-2026-91130 is a critical DOM-based Cross-Site Scripting (XSS) vulnerability in the Home Assistant open-source home automation platform. Prior to version 2026.7.0, the Statistics Graph card rendered series tooltips using raw HTML string interpolation without escaping user-controlled entity friendly names. By abusing this vulnerability, an authenticated user with low-privilege access can inject arbitrary HTML and JavaScript into entity name fields, which executes in the context of an administrative user's browser session upon hovering over a data point on an affected chart.
A high-severity denial of service vulnerability exists in the emiago/sipgo Go library when parsing stream-based SIP messages. The stream parser fails to validate declared Content-Length header sizes before initiating memory allocations, allowing remote, unauthenticated attackers to trigger process memory exhaustion and application crashes.