针对 SOGo 的一个漏洞的利用程序:SOGo 在向用户发送的密码重置邮件中,直接使用客户端提供的 Origin 头来拼装重置链接。攻击者只要知道受害者的登录名,就可以匿名发送一个带有可控 Origin 的找回请求;随后邮件中“密码重置”消息里的链接会指向攻击者的主机,而其中嵌入的 JWT 仍然是一个完全有效的找回令牌。受害者点击一次后,该令牌就会出现在攻击者的访问日志中,接着 POST /SOGo/changePassword 就能用它换取新密码——从而完全接管邮件、日历和联系人账户,且整个过程中无需任何身份验证。此外,邮件分支还跳过了 SOGoPasswordRecoveryEnabled 检查(该标志仅在 SecretQuestion 分支中被查询),因此即使运维人员认为找回功能已关闭,邮件途径依然可用。
记录: https://www.cve.org/CVERecord?id=CVE-2026-93453
| 受影响 | SOGo < 5.12.11 (≤ 5.12.10) |
| 已修复 | 5.12.11(SOGoPasswordRecoveryBaseURLs 允许列表) |
| 前提条件 | 受害者启用了 SecondaryEmail 找回模式;攻击者知道 userName;受害者点击邮件中的链接 |
| 影响 | 账户接管 |
// UI/MainUI/SOGoRootPage.m:1374 (tag SOGo-5.12.10) — passwordRecoveryEmailAction
url = [NSString stringWithFormat:@"%@%@?token=%@",
[[request headers] objectForKey:@"origin"], // <-- raw client header
[request uri],
jwtToken]; // <-- valid HS256 JWT, 10 min TTL
带令牌的重置 URL 是 Origin + request URI + JWT,因此谁设置了该头,谁就决定了受害者的秘密将被发送到哪个主机。这是密码重置投毒(CWE-640 / CWE-601),而不是开放重定向:无论哪个主机将 JWT 带到那里,/SOGo/changePassword 都会接受它。
// 5.12.11 — the fix: origins are validated against a mandatory allowlist
baseUrls = [[SOGoSystemDefaults sharedSystemDefaults] passwordRecoveryBaseURLs];
serverUrl = [[request headers] objectForKey:@"origin"];
if (!(baseUrls && [baseUrls count] > 0)) // unset config -> 403
if (![baseUrls containsObject:serverUrl]) // foreign origin -> 403
在 5.12.11 上,外部 Origin 会收到 403(“Password recovery email in error”);在 ≤ 5.12.10 上,同样的请求会返回 200 并且邮件会被发出——这一差异正是 check 所依据的判断点。
# non-destructive probe: canary user + foreign Origin, classify the reply
python3 CVE-2026-93453.py check https://sogo.example
# poison: dispatch the reset mail for the victim with your host in the link
python3 CVE-2026-93453.py poison https://sogo.example --user victim --origin https://attacker.example
仅使用标准库(Python 3.8+)。支持 --proxy、--insecure、--timeout、--no-color,以及用于非标准 SOGo 挂载点的 --prefix。
该 PoC 不需要攻击者基础设施:poison 只是让服务器发送该链接,而被投毒的主机就是你放入 --origin 中的任意内容。在存在漏洞的实例上,邮件中的链接会变成 https://attacker.example/SOGo/passwordRecoveryEmail?token=<valid HS256 JWT>——受害者点击的那一刻,令牌就会发送到你的主机。
check 使用一个不存在的金丝雀用户名,因此不会有邮件被投递到真实邮箱;200 = 邮件分支接受了外部 Origin(存在漏洞的特征),403 = 5.12.11 允许列表或未设置 SOGoPasswordRecoveryBaseURLs(不可利用)。若要进行确定性的自测,请对你拥有的账户执行 poison,并在自己的收件箱中查看链接主机。
仅供授权测试和研究使用。仅可对你拥有或已获得明确测试许可的系统使用。