| Gói / sản phẩm | Phiên bản bị ảnh hưởng | Phiên bản đã vá |
|---|---|---|
| github.com/traefik/traefik | ≤ 1.7.34mọi phiên bản | |
| github.com/traefik/traefik/v2 | < 2.11.43 | 2.11.43 |
| github.com/traefik/traefik/v3 | ≥ 3.0.0-beta1, < 3.6.14≥ 3.7.0-ea.1, < 3.7.0-rc.2 | 3.6.143.7.0-rc.2 |
| traefik | = 3.7.0≥ 3.0.0, < 3.6.14< 2.11.43 | 3.6.142.11.43 |
There is a timing side-channel vulnerability in Traefik's BasicAuth middleware that allows an attacker to enumerate valid usernames through response-time differences.
The variable intended to hold a constant-time fallback secret always resolves to an empty string, causing the constant-time comparison to short-circuit in microseconds rather than performing a full bcrypt evaluation. This restores the original timing oracle and makes it possible to distinguish existing users from non-existing ones by measuring authentication response times.
If there are any questions or comments about this advisory, please open an issue.
<details> <summary>Original Description</summary>The patch for CVE-2026-32595 is a no-op. Line 49 of basic_auth.go has a
map key/value confusion that makes notFoundSecret always "". The
"constant time" fallback calls goauth.CheckSecret(password, ""), which
fast-fails in ~1us instead of running bcrypt (~60ms).
786f7192e, 2026-04-09)Black-box PoC against live traefik binary on port 28080:
| bucket | n | median | min |
|---|---|---|---|
| existing user (wrong pw) | 240 | 62.85 ms | 57.54 ms |
| nonexistent user (wrong pw) | 400 | 0.48 ms | 0.35 ms |
Median ratio: 130.4x. Classification: 8/8 correct.
Go in-tree test: goauth.CheckSecret direct ratio 12,746x.
basic_auth.go:49: -- looks
up a hash as a username key, returns .Bạn đang dùng một trong các sản phẩm này? Quét site để biết có đang lộ phiên bản có lỗ hổng không.
Quét site miễn phíusers[slices.Collect(maps.Values(users))[0]]""basic_auth.go:119-120: calls goauth.CheckSecret(password, "").go-http-auth/basic.go:87: empty string matches no prefix, falls to default
compareMD5HashAndPassword.basic.go:107-109: bytes.SplitN("", "$", 4) returns length 1, function
returns instantly.poc/exploit.py -- black-box Python timing oraclepoc/basic_auth_timing_regression_test.go -- Go in-tree testpoc/traefik.yml + poc/dynamic.yml -- traefik configpoc/live_http_poc_output_head.txt -- verbatim PoC output on HEADKoda Reef