
CVE-2026-33693 : SSRF via contournement de 0.0.0.0 dans v4_is_invalid() de activitypub-federation-rust (CVSS 6.5 Modéré)
v4_is_invalid() (CVSS 6.5 Modéré)
Mots-clés : SSRF, 0.0.0.0, contournement de validation IP, activitypub-federation, Lemmy, Rust, ActivityPub
Une vulnérabilité de type Server-Side Request Forgery (SSRF) existe dans la bibliothèque activitypub-federation-rust (utilisée par Lemmy et plus de 6 projets en aval) en raison d'une vérification incomplète d'adresse IP dans la fonction v4_is_invalid(). La fonction ne parvient pas à appeler is_unspecified(), permettant à un attaquant de contourner les protections SSRF en ciblant 0.0.0.0 — qui correspond à localhost sur la plupart des systèmes.
activitypub_federation (Rust/cargo)La fonction v4_is_invalid() dans src/utils.rs valide les adresses IPv4 pour bloquer l'accès au réseau interne. Elle vérifie le loopback (127.0.0.0/8), les plages privées (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), link-local (169.254.0.0/16) et broadcast (255.255.255.255), mais ne vérifie pas l'adresse non spécifiée 0.0.0.0.
Sur la plupart des systèmes, 0.0.0.0 résout sur l'interface loopback, donnant le même accès que 127.0.0.1.
Découverte secondaire : Une vulnérabilité de DNS Rebinding / TOCTOU existe également, où lookup_host() résout un nom d'hôte et valide l'IP, mais un appel reqwest séparé effectue une deuxième résolution DNS — permettant à un attaquant de servir d'abord une IP sûre, puis de rebinder sur une IP interne lors de la deuxième résolution.
src/utils.rs)fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
// MANQUANT : || ip.is_unspecified() <- 0.0.0.0 non bloqué
}
fn v4_is_invalid(ip: &Ipv4Addr) -> bool {
ip.is_loopback()
|| ip.is_private()
|| ip.is_link_local()
|| ip.is_broadcast()
|| ip.is_unspecified() // <- Bloque maintenant 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 |
| |
+---------------------------------------------------+
Exposition des projets en aval : La crate activitypub-federation-rust est utilisée par 6+ projets dans l'écosystème Fediverse :
Un attaquant peut :
activitypub-federation vers une version contenant le correctif de la PR #162Ce dépôt est publié à des fins éducatives et défensives dans le cadre d'une divulgation responsable de vulnérabilités. La vulnérabilité a été signalée via le processus de Signalement Privé de Vulnérabilité (PVRT) de GitHub. Aucune exploitation n'a été effectuée contre des systèmes de production. Tous les tests ont été menés dans des environnements isolés.
Le rapport complet de ce projet, la méthodologie et les recherches associées se trouvent sur :
https://snailsploit.com/security-research/cves/cve-2026-33693/
Créé par Kai Aizen — chercheur indépendant en sécurité offensive.
snailsploit.com · Research · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Même attaque. Substrat différent.
| Projet | Étoiles | Description |
|---|
| Lemmy | 13.7K+ | Agrégateur de liens pour le Fediverse |
| hatsu | -- | Pont ActivityPub |
| gill | -- | Hébergement Git avec fédération |
| ties | -- | Réseautage social |
| fediscus | -- | Discussions fédérées |
| fediverse-axum | -- | Cadriciel ActivityPub |
| Métrique | Valeur |
|---|
| Vecteur d'attaque | Réseau |
| Complexité de l'attaque | Faible |
| Privilèges requis | Aucun |
| Interaction de l'utilisateur | Aucune |
| Périmètre | Inchangé |
| Confidentialité | Faible |
| Intégrité | Faible |
| Disponibilité | Aucune |
| Vecteur CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N |
| Score | 6.5 (Modéré) |
| Date | Événement |
|---|
| 2026-03-11 | Vulnérabilité signalée via GitHub PVRT |
| 2026-03-13 | Mainteneur a confirmé la découverte |
| 2026-03-13 | Correctif PR #162 soumis |
| 2026-03-13 | Avis accidentellement fermé |
| 2026-03-16 | Avis rouvert |
| 2026-03-23 | CVE-2026-33693 attribué et avis publié |