
CVE-2026-33693: SSRF mediante evasión de 0.0.0.0 en activitypub-federation-rust v4_is_invalid() (CVSS 6.5 Moderada)
v4_is_invalid() de activitypub-federation-rust (CVSS 6.5 Moderado)
Palabras clave: SSRF, 0.0.0.0, bypass de validación de IP, activitypub-federation, Lemmy, Rust, ActivityPub
Existe una vulnerabilidad de Server-Side Request Forgery (SSRF) en la librería activitypub-federation-rust (utilizada por Lemmy y más de 6 proyectos derivados) debido a una comprobación incompleta de validación de direcciones IP en la función v4_is_invalid(). La función no llama a is_unspecified(), lo que permite a un atacante eludir las protecciones SSRF apuntando a 0.0.0.0, que se resuelve a localhost en la mayoría de los sistemas.
activitypub_federation (Rust/cargo)La función v4_is_invalid() en src/utils.rs valida direcciones IPv4 para bloquear el acceso a la red interna. Comprueba loopback (127.0.0.0/8), rangos privados (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), link-local (169.254.0.0/16) y broadcast (255.255.255.255), pero no comprueba la dirección no especificada 0.0.0.0.
En la mayoría de los sistemas, 0.0.0.0 se resuelve a la interfaz loopback, otorgando el mismo acceso que 127.0.0.1.
Hallazgo secundario: También existe una vulnerabilidad de DNS Rebinding / TOCTOU donde lookup_host() resuelve un nombre de host y valida la IP, pero una llamada separada de reqwest realiza una segunda resolución DNS, lo que permite a un atacante servir primero una IP segura y luego volver a vincular (rebind) a una IP interna en la segunda resolución.
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 |
| |
+---------------------------------------------------+
Exposición en proyectos derivados: La crate activitypub-federation-rust es utilizada por más de 6 proyectos del ecosistema del Fediverso:
Un atacante puede:
activitypub-federation a una versión que contenga la corrección del PR #162Este repositorio se publica con fines educativos y defensivos como parte de una divulgación responsable de vulnerabilidades. La vulnerabilidad fue reportada a través del proceso de Informe Privado de Vulnerabilidades (PVRT) de GitHub. No se realizó ninguna explotación contra sistemas en producción. Todas las pruebas se llevaron a cabo en entornos aislados.
El informe completo de este proyecto, la metodología y la investigación relacionada se encuentran en:
https://snailsploit.com/security-research/cves/cve-2026-33693/
Creado por Kai Aizen — investigador independiente de seguridad ofensiva.
snailsploit.com · Investigación · Frameworks · GitHub · LinkedIn · ResearchGate · X/Twitter
Mismo ataque. Diferente sustrato.
| Proyecto | Estrellas | Descripción |
|---|
| Lemmy | 13.7K+ | Agregador de enlaces para el Fediverso |
| hatsu | -- | Puente de ActivityPub |
| gill | -- | Alojamiento Git con federación |
| ties | -- | Red social |
| fediscus | -- | Discusiones federadas |
| fediverse-axum | -- | Framework de ActivityPub |
| Métrica | Valor |
|---|
| Vector de ataque | Red |
| Complejidad de ataque | Baja |
| Privilegios requeridos | Ninguno |
| Interacción del usuario | Ninguna |
| Alcance | Sin cambios |
| Confidencialidad | Baja |
| Integridad | Baja |
| Disponibilidad | Ninguna |
| Vector CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N |
| Puntuación | 6.5 (Moderado) |
| Fecha | Evento |
|---|
| 2026-03-11 | Vulnerabilidad reportada a través del PVRT de GitHub |
| 2026-03-13 | El mantenedor confirmó el hallazgo |
| 2026-03-13 | PR de corrección #162 enviado |
| 2026-03-13 | Aviso cerrado accidentalmente |
| 2026-03-16 | Aviso reabierto |
| 2026-03-23 | CVE-2026-33693 asignado y aviso publicado |