🟠 高危 | CVE-2026-65702 — Vanna through 2.0.2 contains a path traversal vuln...
🟠 【深度分析】高危安全漏洞:CVE-2026-65702
CVSS 评分: 高危(8.8)🟠 状态: Deferred 发布时间: 2026-07-23
🔍 技术细节速览
| 字段 | 值 |
|---|---|
| CVE ID | CVE-2026-65702 |
| CVSS 评分 | 8.8 🟠 |
| 严重程度 | 高危 |
| CVSS 向量 | CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X |
| CWE 分类 | CWE-22 |
| 发布时间 | 2026-07-23 |
| 最后更新 | 2026-07-23 |
| 状态 | Deferred |
| 数据来源 | disclosure@vulncheck.com |
CVSS 4.0 评分:8.8(高危)
向量:CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:N
CWE: CWE-22 (路径遍历)
威胁类型: 未授权远程攻击,任意文件写入与读取
漏洞概述
CVE-2026-65702 影响 Vanna 项目(一个基于大语言模型的 SQL 生成工具)中 FileSystemConversationStore 持久化组件。该组件在处理 conversation_id 参数时未进行充分的路径合法性校验,导致存在经典的目录遍历漏洞。攻击者可以通过向未认证的聊天 API 端点发送特制的 conversation_id 参数(包含 ../ 等序列),实现:
- 任意文件写入: 在服务器文件系统任意位置写入攻击者控制的 JSON 格式内容。
- 任意文件读取: 读取指定路径下的文件内容(经测试可突破基础存储目录限制)。
该漏洞影响 Vanna 2.0.2 及之前所有版本,利用条件极低(无需认证、无需用户交互),可对服务器机密性、完整性和可用性造成严重威胁。
受影响组件与版本
| 组件 | 受影响版本范围 |
|---|---|
Vanna (vanna PyPI 包) |
≤ 2.0.2 |
| 受影响子模块 | vanna.flask 或 vanna.base 中的 FileSystemConversationStore 类 |
注:NVD 数据仅标注 "through 2.0.2",未明确说明是否包含更早版本,建议所有低于 2.0.2 的版本均视为受影响。
漏洞原理分析
漏洞成因
Vanna 的 FileSystemConversationStore 使用本地文件系统存储对话历史记录。其持久化逻辑大致为:
- 将
conversation_id作为目录名或文件名的一部分,拼接在预设的基础存储目录(如/var/vanna/conversations/)下。 - 在写入对话元数据(JSON 格式)时,直接使用拼接后的路径进行文件写入。
- 在读取历史对话时,同样基于该拼接路径进行文件读取。
由于没有对 conversation_id 参数进行规范化过滤,攻击者可在参数中插入路径遍历序列(如 ../../etc/passwd),导致最终路径脱离预期的基础目录。
攻击向量分析
根据漏洞描述,攻击者通过以下步骤实施利用:
- 发送未认证的 API 请求:Vanna 默认暴露的聊天 API(如
/chat或/api/conversation)不要求身份验证。 - 构造恶意
conversation_id:例如"../../../tmp/evil"或"../../etc/config.json"。 - 写入 JSON 内容:利用
POST请求中的 JSON 载荷,将恶意内容(如配置文件、Web Shell、代码库文件)写入任意位置。 - 读取任意文件:利用
GET请求读取服务器上任意可读文件的内容(如/etc/passwd、环境变量、密钥文件等)。
技术细节(基于现有信息推测)
- 写入操作:
FileSystemConversationStore.save_conversation()会将对话元数据序列化为 JSON,然后写入{base_dir}/{conversation_id}.json。若conversation_id包含../,则实际写入路径可能变为/var/vanna/conversations/../../../tmp/evil.json→/tmp/evil.json。 - 读取操作:
FileSystemConversationStore.get_conversation()类似地从{base_dir}/{conversation_id}.json读取文件,遍历后可能读取任意.json文件。更严重的是,若实现未强制附加.json扩展名,或允许直接读取不存在的文件,则可能泄露任意文件内容(如../../etc/passwd直接读取明文)。
注意: 现有 NVD 描述未明确说明读取操作是否强制要求
.json后缀,但指出可“读取对话元数据”以及“未经授权读取服务器文件系统”,推测读取操作可能存在绕过方式(如通过 JSON 解析错误信息泄露内容,或利用相对路径携带其他文件内容)。实际利用细节需等待官方进一步分析。
影响评估
攻击复杂度与条件
| 维度 | 评估 |
|---|---|
| 攻击向量 (AV:N) | 远程,无需物理访问 |
| 攻击复杂度 (AC:L) | 低,仅需构造简单路径字符串 |
| 攻击所需特权 (PR:N) | 无需任何认证 |
| 用户交互 (UI:N) | 无需受害者交互 |
| 影响范围 | 突破基本目录限制,影响文件系统任意位置 |
潜在后果
- 任意文件写入 (VI:H):攻击者可写入 JSON 内容到以下关键位置:
- 覆盖 Web 应用配置文件(如 Flask 的
config.py)导致持久化后门或配置篡改。 - 写入 Python 代码(如
__init__.py)在下次导入时触发远程代码执行。 - 写入 cron 任务、SSH 授权密钥等实现权限提升。
- 覆盖 Web 应用配置文件(如 Flask 的
- 任意文件读取 (VC:L):可读取系统敏感文件(如
/etc/shadow、数据库凭证、SSL 证书),导致信息泄露。 - 可用性影响 (VA:L):通过覆盖关键文件或耗尽磁盘空间可能造成服务中断。
CVSS 评分 8.8(高危)主要源于完整性影响极高(VI:H)且利用条件完全无限制。
修复建议
官方补丁状态
截至 2026-07-23,Vanna 项目尚未发布修复版本(NVD 状态为 Deferred)。建议持续关注官方仓库更新。
临时缓解措施
在等待官方补丁期间,可采取以下措施降低风险:
输入过滤与规范化
在应用层对conversation_id参数进行严格校验:- 拒绝包含
../、..\、/、\等路径分隔符的输入。 - 仅允许字母、数字、短横线、下划线等安全字符(正则:
^[a-zA-Z0-9_-]+$)。 - 使用
os.path.normpath()和os.path.realpath()验证最终路径是否仍在基础目录内。
- 拒绝包含
最小化文件权限
确保 Vanna 运行进程仅具有写入基础存储目录的权限,且该目录应独立于 Web 根目录和系统关键目录。Web 服务器防护
在反向代理(Nginx)或 WAF 层添加规则,拦截包含路径遍历特征的请求参数。禁用未认证 API(如可能)
如果业务允许,为聊天 API 添加认证机制(如 API Key、Bearer Token),减少外部暴露面。
推荐升级版本
待官方发布 ≥ 2.0.3 版本后尽快升级。
参考资料
- CVE-2026-65702 官方 NVD 页面:https://nvd.nist.gov/vuln/detail/CVE-2026-65702
- CWE-22 定义:https://cwe.mitre.org/data/definitions/22.html
- Vanna 官方 GitHub 仓库:https://github.com/vanna-ai/vanna
- VulnCheck 安全公告(原始发现者):disclosure@vulncheck.com
- OWASP 路径遍历防护指南:https://owasp.org/www-community/attacks/Path_Traversal
免责声明: 本文基于 NVD 公开数据撰写,未包含漏洞利用细节,仅作安全研究参考。未取得授权情况下禁止对生产系统进行探测或利用。