GitHub Advisoryadvisory · Go

GHSA-vcc4-2c75-vc9v Caddy: stripHTML template function bypass

MEDIUM Published 2026-06-16 Modified 2026-06-16 Official page ↗
Aliases
CVE-2026-52846
Ecosystem
Go
Packages
github.com/caddyserver/caddy/v2, github.com/caddyserver/caddy
Severity
Moderate
CVSS vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N
Weaknesses
CWE-116
Reviewed
2026-06-16

Affected packages

• Go github.com/caddyserver/caddy/v2: < 2.11.4 → fixed in 2.11.4 • Go github.com/caddyserver/caddy: <= 1.0.5 (no fix yet)

Description

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 == ' StripHTML Bypass Test {{ stripHTML "img src=x onerror=alert('XSS')>" }} ``` The payload exploits the false start branch to smuggle a literal to terminate the parser’s tag state, leaving a valid 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.

Related

Alias · CVE (1)

  • CVE-2026-52846 Caddy is an extensible server platform that uses TLS by default. vulnerability

Weakness · CWE (1)

  • CWE-116 Improper Encoding or Escaping of Output weakness

References