
CVE-2026-33693: SSRF tramite bypass di 0.0.0.0 in activitypub-federation-rust v4_is_invalid() (CVSS 6.5 Moderata)
v4_is_invalid() (CVSS 6.5 Moderate)
Parole chiave: SSRF, 0.0.0.0, bypass della validazione IP, activitypub-federation, Lemmy, Rust, ActivityPub
Una vulnerabilità di Server-Side Request Forgery (SSRF) è presente nella libreria activitypub-federation-rust (utilizzata da Lemmy e da oltre 6 progetti a valle) a causa di un controllo di validazione degli indirizzi IP incompleto nella funzione v4_is_invalid(). La funzione non chiama is_unspecified(), consentendo a un attaccante di aggirare le protezioni SSRF prendendo di mira 0.0.0.0 — che sulla maggior parte dei sistemi corrisponde a localhost.
activitypub_federation (Rust/cargo)La funzione v4_is_invalid() in src/utils.rs valida gli indirizzi IPv4 per bloccare l'accesso alla rete interna. Controlla il loopback (127.0.0.0/8), gli intervalli privati (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), il link-local (169.254.0.0/16) e il broadcast (255.255.255.255), ma non controlla l'indirizzo non specificato 0.0.0.0.
Sulla maggior parte dei sistemi, 0.0.0.0 viene risolto sull'interfaccia di loopback, concedendo lo stesso accesso di 127.0.0.1.
Riscontro secondario: Esiste anche una vulnerabilità di DNS Rebinding / TOCTOU in cui lookup_host() risolve un hostname e valida l'IP, ma una chiamata separata di reqwest esegue una seconda risoluzione DNS — consentendo a un attaccante di servire prima un IP sicuro e poi di effettuare il rebinding a un IP interno nella seconda risoluzione.
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 |
| |
+---------------------------------------------------+
Esposizione a valle: La crate activitypub-federation-rust è utilizzata da oltre 6 progetti nell'ecosistema Fediverse:
Un attaccante può:
activitypub-federation a una versione contenente la correzione del PR #162Questo repository è pubblicato a scopo educativo e difensivo come parte della divulgazione responsabile delle vulnerabilità. La vulnerabilità è stata segnalata tramite il processo di Private Vulnerability Reporting (PVRT) di GitHub. Non è stato effettuato alcuno sfruttamento contro sistemi in produzione. Tutti i test sono stati condotti in ambienti isolati.
Il writeup completo di questo progetto, la metodologia e le ricerche correlate sono disponibili su:
https://snailsploit.com/security-research/cves/cve-2026-33693/
Creato da Kai Aizen — ricercatore indipendente di sicurezza offensiva.
snailsploit.com · Ricerca · Framework · GitHub · LinkedIn · ResearchGate · X/Twitter
Stesso attacco. Substrato diverso.
| Progetto | Stelle | Descrizione |
|---|
| Lemmy | 13.7K+ | Aggregatore di link per il Fediverse |
| hatsu | -- | Ponte ActivityPub |
| gill | -- | Hosting Git con federazione |
| ties | -- | Social network |
| fediscus | -- | Discussioni federate |
| fediverse-axum | -- | Framework ActivityPub |
| Metrica | Valore |
|---|
| Vettore di attacco | Rete |
| Complessità dell'attacco | Bassa |
| Privilegi richiesti | Nessuno |
| Interazione dell'utente | Nessuna |
| Ambito | Invariato |
| Riservatezza | Bassa |
| Integrità | Bassa |
| Disponibilità | Nessuna |
| Vettore CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N |
| Punteggio | 6.5 (Moderate) |
| Data | Evento |
|---|
| 2026-03-11 | Vulnerabilità segnalata tramite il PVRT di GitHub |
| 2026-03-13 | Il maintainer ha confermato la scoperta |
| 2026-03-13 | PR di correzione #162 inviata |
| 2026-03-13 | Advisory chiuso accidentalmente |
| 2026-03-16 | Advisory riaperto |
| 2026-03-23 | CVE-2026-33693 assegnato e advisory pubblicato |