| Package | Affected versions | Patched versions |
|---|---|---|
| github.com/envoyproxy/envoy | ≥ 1.35.0, < 1.35.9≥ 1.36.0, < 1.36.5≥ 1.37.0, < 1.37.1< 1.34.13 | 1.35.91.36.51.37.11.34.13 |
| envoy | = 1.37.0≥ 1.35.0, < 1.35.8≥ 1.36.0, < 1.36.5< 1.34.13 | 1.35.81.36.51.34.13 |
The Envoy RBAC (Role-Based Access Control) filter contains a logic vulnerability in how it validates HTTP headers when multiple values are present for the same header name. Instead of validating each header value individually, Envoy concatenates all values into a single comma-separated string. This behavior allows attackers to bypass RBAC policies—specifically "Deny" rules—by sending duplicate headers, effectively obscuring the malicious value from exact-match mechanisms.
Consider an environment where an administrator wants to block external access to internal resources using a specific header flag.
The Envoy proxy is configured with a Deny rule to reject requests containing the header internal: true.
internal header must not equal true.Standard Request (Blocked):
internal: true"true".Exploit Request (Bypassed):
internal: true
internal: true
"true,true"."true,true" equal "true"? No.To verify this vulnerability:
Running one of these products? Scan your site to see whether it exposes a vulnerable version.
Scan my site freeinternal: trueinternal: true.
GET /restricted-resource HTTP/1.1
Host: example.com
internal: true
internal: true
Fix Header Validation Logic:
Modify the RBAC filter to validate each header value instance individually. Avoid relying on the concatenated string output of getAllOfHeaderAsString() for security-critical matching unless the matcher is explicitly designed to parse comma-separated lists.
** Examine the DENY role to use a Regex style fix.
Credit: Dor Konis