Files
vuln-osv/data/Go/GHSA-vcc4-2c75-vc9v.json

1 line
3.7 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"schema_version":"1.9.0","id":"GHSA-vcc4-2c75-vc9v","published":"2026-06-16T21:28:55Z","modified":"2026-07-24T19:11:47.063874212Z","aliases":["CVE-2026-52846","GO-2026-5660"],"summary":"Caddy: stripHTML template function bypass","details":"### Summary\nCaddy’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.\n\n---\n\n### Details\nThe vulnerability originates from `funcStripHTML` in:\n\n[caddy/caddy/caddyhttp/templates/tplcontext.go](https://github.com/caddyserver/caddy/blob/77e9ce7404c4a76853e101a9f5687a929ee56654/modules/caddyhttp/templates/tplcontext.go)\n\n```go\nfunc (TemplateContext) funcStripHTML(s string) string {\n var buf bytes.Buffer\n var inTag, inQuotes bool\n var tagStart int\n for i, ch := range s {\n if inTag {\n if ch == '>' && !inQuotes {\n inTag = false\n } else if ch == '<' && !inQuotes {\n // false start\n buf.WriteString(s[tagStart:i])\n tagStart = i\n } else if ch == '\"' {\n inQuotes = !inQuotes\n }\n continue\n }\n if ch == '<' {\n inTag = true\n tagStart = i\n continue\n }\n buf.WriteRune(ch)\n }\n if inTag {\n // false start\n buf.WriteString(s[tagStart:])\n }\n return buf.String()\n}\n```\n\n### POC\n\nCaddyfile setup\n\n```\n:8080 {\n root * ./site\n file_server\n templates\n}\n```\n\nTemplate file (index.html)\n\n```html\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>StripHTML Bypass Test</title>\n</head>\n<body>\n <p>{{ stripHTML \"<<>img src=x onerror=alert('XSS')>\" }}</p>\n</body>\n</html>\n```\n\nThe 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.\n\nTested in v2.11.3\n\n### Impact\n\nMalformed HTML can bypass stripHTML, potentially allowing arbitrary HTML or JavaScript to be rendered if the output is used unsafely, leading to client-side XSS.\n\n### AI Disclosure\n\nAI assisted in writing the report description; however, the discovery of the issue has been done manually.","affected":[{"package":{"name":"github.com/caddyserver/caddy/v2","ecosystem":"Go","purl":"pkg:golang/github.com/caddyserver/caddy/v2"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"2.11.4"}]}],"database_specific":{"last_known_affected_version_range":"<= 2.11.3","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-vcc4-2c75-vc9v/GHSA-vcc4-2c75-vc9v.json"}},{"package":{"name":"github.com/caddyserver/caddy","ecosystem":"Go","purl":"pkg:golang/github.com/caddyserver/caddy"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"last_affected":"1.0.5"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-vcc4-2c75-vc9v/GHSA-vcc4-2c75-vc9v.json"}}],"references":[{"type":"WEB","url":"https://github.com/caddyserver/caddy/security/advisories/GHSA-vcc4-2c75-vc9v"},{"type":"PACKAGE","url":"https://github.com/caddyserver/caddy"}],"database_specific":{"cwe_ids":["CWE-116"],"github_reviewed":true,"github_reviewed_at":"2026-06-16T21:28:55Z","nvd_published_at":null,"severity":"MODERATE"},"severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N"}]}