CVE-2026-52846: Caddy: stripHTML template function bypass
Summary Caddy’s stripHTML template function cannot reliably remove all HTML tags from input strings. Certain malformed HTML, such as <<>img src=x onerror=alert()>, can bypass the tag-stripping logic, potentially leaving dangerous content in the output if it is later rendered as HTML. This may allow client-side XSS in cases where untrusted strings are rendered unsafely.
---
Details The vulnerability originates from funcStripHTML in:
caddy/caddy/caddyhttp/templates/tplcontext.go
go func (TemplateContext) funcStripHTML(s string) string { var buf bytes.Buffer var inTag, inQuotes bool var tagStart int for i, ch := range s { if inTag { if ch == '>' && !inQuotes { inTag = false } else if ch == '<' && !inQuotes { // false start buf.WriteString(s[tagStart:i]) tagStart = i } else if ch == '"' { inQuotes = !inQuotes } continue } if ch == '<' { inTag = true tagStart = i continue } buf.WriteRune(ch) } if inTag { // false start buf.WriteString(s[tagStart:]) } return buf.String() }
POC
Caddyfile setup
:8080 { root ./site fileserver templates }
Template file (index.html)
html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>StripHTML Bypass Test</title> </head> <body> <p>{{ stripHTML "<<>img src=x onerror=alert('XSS')>" }}</p> </body> </html>
The payload exploits the false start branch to smuggle a literal < back into the output, then uses the following > to terminate the parser’s tag state, leaving a valid <img ...> tag behind.
Tested in v2.11.3
Impact
Malformed HTML can bypass stripHTML, potentially allowing arbitrary HTML or JavaScript to be rendered if the output is used unsafely, leading to client-side XSS.
AI Disclosure
AI assisted in writing the report description; however, the discovery of the issue has been done manually.
Other sources
Caddy is an extensible server platform that uses TLS by default. Prior to 2.11.4, Caddy’s stripHTML template function cannot reliably remove all HTML tags from input strings. Certain malformed HTML, such as <<>img src=x onerror=alert()>, can bypass the tag-stripping logic, potentially leaving dangerous content in the output if it is later rendered as HTML. This may allow client-side XSS in cases where untrusted strings are rendered unsafely. This vulnerability is fixed in 2.11.4.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
go/github.com/caddyserver/caddy/v2to a version that resolves this vulnerability.Fixed in 2.11.4 - Upgrade
Upgrade
Caddyto a version that resolves this vulnerability.Fixed in 2.11.4
Event History
Frequently Asked Questions
What is the severity of CVE-2026-52846?
CVE-2026-52846 has a medium severity rating of 4.2.
How do I fix CVE-2026-52846?
To mitigate CVE-2026-52846, ensure that you update to the latest version of Caddy that addresses this vulnerability.
What types of attacks can CVE-2026-52846 facilitate?
CVE-2026-52846 could potentially facilitate cross-site scripting (XSS) attacks due to improper stripping of HTML tags.
In which software does the CVE-2026-52846 vulnerability occur?
The CVE-2026-52846 vulnerability occurs in Caddy server versions prior to the fix.
Is CVE-2026-52846 easily exploitable?
The inadequacy of the stripHTML function in CVE-2026-52846 may allow attackers to exploit it under certain conditions involving malformed HTML.