v4_is_invalid() 中可通过 0.0.0.0 绕过的 SSRF 漏洞(CVSS 6.5 中危)
关键词: SSRF、0.0.0.0、IP 验证绕过、activitypub-federation、Lemmy、Rust、ActivityPub
activitypub-federation-rust 库(被 Lemmy 及 6 个以上下游项目使用)中存在一个服务器端请求伪造(SSRF)漏洞,原因在于 v4_is_invalid() 函数中的 IP 地址验证检查不完整。该函数未调用 is_unspecified(),攻击者可通过指定 0.0.0.0(在大多数系统上映射到 localhost)绕过 SSRF 防护。
activitypub_federation(Rust/cargo)src/utils.rs 中的 v4_is_invalid() 函数用于验证 IPv4 地址,以阻止对内部网络的访问。它会检查环回地址(127.0.0.0/8)、私有地址段(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)、链路本地地址(169.254.0.0/16)和广播地址(255.255.255.255),但未检查未指定地址 0.0.0.0。
在大多数系统上,0.0.0.0 会解析到环回接口,从而拥有与 127.0.0.1 相同的访问权限。
次要发现: 还存在一个 DNS 重绑定 / TOCTOU 漏洞:lookup_host() 解析主机名并验证 IP,但随后独立的 reqwest 调用会执行第二次 DNS 解析——攻击者可先提供安全 IP,再在第二次解析时重绑定到内部 IP。
src/utils.rs)fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
// MISSING: || ip.is_unspecified() <- 0.0.0.0 not blocked
}
fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
|| ip.is_unspecified() // <- Now blocks 0.0.0.0
}
+---------------------------------------------------+
| SSRF via 0.0.0.0 Bypass |
+---------------------------------------------------+
| |
| 1. Attacker hosts ActivityPub object with |
| URL pointing to http://0.0.0.0:<port>/path |
| |
| 2. Lemmy instance fetches the object via |
| activitypub-federation-rust |
| |
| 3. v4_is_invalid() checks IP address: |
| x is_loopback() -> false (not 127.x) |
| x is_private() -> false (not RFC1918) |
| x is_link_local() -> false (not 169.254.x) |
| x is_broadcast() -> false (not 255.x) |
| x is_unspecified() -> NOT CHECKED |
| Result: 0.0.0.0 PASSES validation |
| |
| 4. Request sent to 0.0.0.0 -> resolves to |
| localhost -> accesses internal services |
| |
| 5. Internal service data returned to attacker |
| via ActivityPub federation response |
| |
+---------------------------------------------------+
下游影响范围: activitypub-federation-rust crate 被 Fediverse 生态中的 6 个以上项目 使用:
攻击者可:
activitypub-federation 至包含 PR #162 修复的版本本仓库作为负责任漏洞披露流程的一部分发布,仅用于教育和防御目的。该漏洞通过 GitHub 的私人漏洞报告(PVRT)流程上报。未对生产系统执行任何利用操作,所有测试均在隔离环境中进行。
本项目的完整报告、方法论及相关研究位于:
https://snailsploit.com/security-research/cves/cve-2026-33693/
作者:Kai Aizen —— 独立进攻性安全研究员。
snailsploit.com · 研究 · 框架 · GitHub · LinkedIn · ResearchGate · X/Twitter
相同的攻击,不同的载体。
| 项目 | 星标数 | 描述 |
|---|
| Lemmy | 13.7K+ | 面向 Fediverse 的链接聚合器 |
| hatsu | -- | ActivityPub 桥接器 |
| gill | -- | 支持联邦的 Git 托管 |
| ties | -- | 社交网络 |
| fediscus | -- | 联邦讨论 |
| fediverse-axum | -- | ActivityPub 框架 |
| 指标 | 值 |
|---|
| 攻击向量 | 网络 |
| 攻击复杂度 | 低 |
| 所需权限 | 无 |
| 用户交互 | 无 |
| 影响范围 | 不变 |
| 机密性 | 低 |
| 完整性 | 低 |
| 可用性 | 无 |
| CVSS 向量 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N |
| 分数 | 6.5(中危) |
| 日期 | 事件 |
|---|
| 2026-03-11 | 通过 GitHub PVRT 报告漏洞 |
| 2026-03-13 | 维护者确认发现 |
| 2026-03-13 | 提交修复 PR #162 |
| 2026-03-13 | 公告被意外关闭 |
| 2026-03-16 | 公告重新开启 |
| 2026-03-23 | 分配 CVE-2026-33693 并发布公告 |