CVE-2025-34281CVE-2025-34281是ThingsBoard物联网平台中的一个存储型跨站脚本(Stored XSS)漏洞。该漏洞存在于ThingsBoard v4.2.1之前的版本中,允许经过身份验证的低权限用户通过"Image Gallery"(图片库)功能上传恶意的SVG图片文件。由于ThingsBoard的ImageController在处理用户上传的SVG图片时未能正确限制JavaScript代码的执行,攻击者可以将包含恶意脚本的SVG文件上传到平台服务器。当其他用户通过公共API端点访问这些恶意SVG图片,或者在仪表板创建小部件(widget)时通过iframe元素嵌入这些恶意图片时,恶意JavaScript代码将在受害者的浏览器上下文中执行。该漏洞的CVSS评分为5.4,属于中危级别,攻击者需要拥有有效的低权限账户即可发起攻击。一旦成功利用,攻击者可以窃取其他用户的会话信息、劫持用户账户、执行未授权操作,甚至可能导致整个平台账户体系被攻陷。该漏洞由安全研究员596c5446-0ce5-4ba2-aa66-48b3b757a647发现并报告,ThingsBoard官方已在v4.2.1版本中修复了该问题。
该漏洞的根本原因在于ThingsBoard的ImageController控制器对用户上传的SVG文件缺乏充分的安全过滤和内容验证机制。SVG(Scalable Vector Graphics)是一种基于XML的矢量图形格式,其本身支持嵌入JavaScript脚本和事件处理器(如onload、onclick等),这使得SVG文件本质上具备执行JavaScript代码的能力。
攻击利用过程如下:
1. 攻击者首先需要拥有一个ThingsBoard平台的合法账户(低权限即可)。
2. 攻击者构造一个包含恶意JavaScript代码的SVG文件。SVG文件中可以通过<script>标签直接嵌入脚本,或者通过事件属性(如onload="malicious_code()")触发代码执行。例如,可以在SVG的根元素中添加onload事件来执行任意JavaScript。
3. 攻击者通过"Image Gallery"功能上传该恶意SVG文件。由于ImageController未对上传的SVG内容进行安全检查(如未剥离脚本标签、未设置正确的Content-Security-Policy响应头),恶意SVG文件被成功存储到服务器。
4. 当其他用户通过公共API端点(如/images/xxx)直接访问该SVG图片时,浏览器会将SVG作为XML文档解析并执行其中嵌入的JavaScript代码,从而在受害者会话上下文中执行恶意操作。
5. 另一种触发方式是在创建仪表板小部件(widget)时,通过iframe元素嵌入该恶意SVG图片链接。由于iframe加载的内容与父页面同源,恶意脚本同样可以在ThingsBoard的会话上下文中执行。
修复方案包括:对上传的SVG文件进行内容清洗,移除所有脚本标签和事件处理器;或者在服务器端为SVG文件响应设置Content-Security-Policy头,禁止内联脚本执行;最严格的方式是完全禁止SVG文件的上传。