IPBUF安全漏洞报告
English
CVE-2026-41591 CVSS 6.4 中危

CVE-2026-41591 Marko 跨站脚本漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2026-41591
漏洞类型
跨站脚本 (XSS)
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Marko, @marko/runtime-tags

相关标签

XSSCross-Site ScriptingMarkoCWE-79InjectionWeb Security

漏洞概述

Marko 是用于构建 Web 应用的声明式 HTML 语言。在 5.38.36 版本前的 Marko 和 6.0.164 版本前的 @marko/runtime-tags 中,动态文本插入 <script> 或 <style> 标签时存在缺陷。若结束标签使用非小写(如 </SCRIPT>),运行时无法防止标记越界。攻击者可借此注入任意 HTML/JS,导致跨站脚本攻击。官方已发布补丁修复该问题。

技术细节

该漏洞源于 Marko 运行时对 HTML 标签大小写的处理逻辑不完善。尽管 HTML 标准规定标签名不区分大小写,但 Marko 的上下文自动转义机制仅针对小写的闭合标签(如 </script>)进行了防御。当攻击者能够控制输入并将其插入到 <script> 或 <style> 块中时,如果输入包含大写字母形式的闭合标签(例如 </SCRIPT> 或 </Style>),Marko 的过滤器无法识别其为危险字符,从而未对其进行转义。这导致恶意字符串被原样渲染到 HTML 页面中。浏览器在解析 HTML 时会将 </SCRIPT> 视为有效的结束标记,从而跳出当前的脚本或样式块,使得攻击者后续注入的任意 HTML 或 JavaScript 代码得以执行。由于该漏洞发生在客户端渲染层面,且涉及脚本上下文破坏,其 CVSS 评分具备范围改变(S:C)特性。

攻击链分析

STEP 1
1. 侦察
攻击者识别出目标 Web 应用使用了易受攻击版本的 Marko 框架(< 5.38.36)。
STEP 2
2. 定位注入点
寻找应用中将用户输入动态插入到 <script> 或 <style> 标签内的功能点。
STEP 3
3. 构造载荷
利用大小写绕过特性,构造包含非小写结束标签(如 </SCRIPT>)和恶意 JS 代码的 Payload。
STEP 4
4. 注入攻击
将载荷发送给服务器,服务器返回包含未转义 Payload 的页面响应。
STEP 5
5. 执行代码
受害者浏览器解析 HTML,触发 XSS,执行攻击者的恶意脚本(如窃取 Cookie)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<!-- PoC Concept: Marko XSS via Non-lowercase Closing Tag --> // Vulnerable Template (marko): // <script> // var userInput = ${input}; // </script> // Malicious Payload: // The payload uses uppercase characters to bypass the lowercase-only filter. const payload = '</SCRIPT><img src=x onerror=alert(1)>'; // Rendered HTML in vulnerable version: // <script> // var userInput = </SCRIPT><img src=x onerror=alert(1)>; // </script> // Result: // The browser interprets </SCRIPT> as the end of the script block, // causing the <img> tag to be rendered and the JavaScript alert(1) to execute.

影响范围

Marko < 5.38.36
@marko/runtime-tags < 6.0.164

防御指南

临时缓解措施
如果无法立即升级,应避免在 <script> 或 <style> 标签内直接输出未经过滤的用户输入。可以在服务端对输入数据进行预处理,强制过滤或转义包含大小写变体的闭合标签(如 </SCRIPT>, </Style>),但这仅为临时措施,根本解决仍需依赖官方补丁。

参考链接