Caddy is an extensible server platform that uses TLS by default. From version 2.7.5 to before version 2.11.2, the vars_regexp matcher in vars.go:337 double-expands user-controlled input through the Caddy replacer. When vars_regexp matches against a placeholder like {http.request.header.X-Input}, the header value gets resolved once (expected), then passed through repl.ReplaceAll() again (the bug). This means an attacker can put {env.DATABASE_URL} or {file./etc/passwd} in a request header and the server will evaluate it, leaking environment variables, file contents, and system info. This issue has been patched in version 2.11.2.
{
"cna_assigner": "GitHub_M",
"cwe_ids": [
"CWE-200",
"CWE-74"
],
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/30xxx/CVE-2026-30852.json"
}{
"extracted_events": [
{
"range": [
{
"introduced": "2.7.5"
},
{
"fixed": "2.11.2"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"original_tag": "v2.11.2",
"range": [
{
"fixed": "ffb6ab0644f24c5ee6542aca6bd59b7a1b0a8f91"
}
],
"source": "REFERENCES_TAG"
},
{
"cpe": "cpe:2.3:a:caddyserver:caddy:*:*:*:*:*:*:*:*",
"range": [
{
"introduced": "2.7.5"
},
{
"fixed": "2.11.2"
}
],
"source": "CPE_RANGE"
}
]
}