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 以上の下流プロジェクトで使用) には、v4_is_invalid() 関数の IP アドレス検証チェックが不完全であることに起因するサーバーサイドリクエストフォージェリ (SSRF) の脆弱性が存在します。この関数は is_unspecified() を呼び出さないため、攻撃者は 0.0.0.0 を対象とすることで SSRF 保護をバイパスできます。0.0.0.0 はほとんどのシステムで localhost にマッピングされます。
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 呼び出しが 2 回目の DNS 解決を実行するため、攻撃者は最初に安全な IP を返し、2 回目の解決時に内部 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 クレートは Fediverse エコシステムの 6 以上のプロジェクトで使用されています:
攻撃者は以下を実行できます:
activitypub-federation をアップグレードするこのリポジトリは、責任ある脆弱性開示の一環として、教育および防御目的で公開されています。本脆弱性は GitHub の Private Vulnerability Reporting (PVRT) プロセスを通じて報告されました。本番システムに対する悪用は行われていません。すべてのテストは隔離された環境で実施されました。
このプロジェクトの完全な writeup、方法論、関連研究は以下にあります:
https://snailsploit.com/security-research/cves/cve-2026-33693/
作成者: Kai Aizen — 独立したオフェンシブセキュリティ研究者。
snailsploit.com · 研究 · フレームワーク · GitHub · LinkedIn · ResearchGate · X/Twitter
同じ攻撃。異なる基盤。
| プロジェクト | Stars | 説明 |
|---|
| 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 が割り当てられ、アドバイザリが公開される |