Seguridad web

SSRF

Definición

Una vulnerabilidad SSRF (Server-Side Request Forgery, falsificación de peticiones del lado del servidor) permite a un atacante hacer que el servidor envíe peticiones a la dirección que elija: servicios internos, la dirección de metadatos de la nube o el propio servidor, normalmente inaccesibles desde Internet.

SSRF, Seguridad web

En una vulnerabilidad SSRF, el atacante no apunta directamente a la máquina que le interesa: usa el sitio como intermediario. El servidor web suele estar en una red desde la que puede llegar a servicios que nadie debería alcanzar desde Internet. Si una función del sitio descarga una URL facilitada por el usuario sin comprobar el destino, el atacante puede hacer que consulte esos servicios en su lugar. OWASP convirtió la SSRF en una categoría propia de su Top 10 de 2021 (A10), y MITRE la cataloga como CWE-918.

Cómo funciona un ataque SSRF

Las funciones afectadas son las que van a buscar una URL: importar una imagen desde una dirección, generar la vista previa de un enlace, llamar a un webhook, comprobar un feed. El atacante introduce en ellas una dirección interna en lugar de una pública:

  • la dirección de metadatos de la nube 169.254.169.254, que usan AWS, Azure y Google Cloud, y que puede revelar credenciales y tokens de acceso;
  • el propio servidor (localhost, 127.0.0.1), por ejemplo un panel de administración o una base de datos que solo escucha en local;
  • la red privada (10.0.0.0/8, 192.168.0.0/16…), para trazar un mapa de las máquinas y los puertos abiertos;
  • otros protocolos distintos de HTTP, como file:// o gopher://, cuando la biblioteca utilizada los acepta.
Desarrollo de un ataque SSRF en cinco pasos: el atacante facilita la dirección de metadatos de la nube a una función de importación de imágenes por URL, el servidor emite la petición desde dentro de la red, el servicio interno responde con metadatos o tokens, la respuesta vuelve al atacante directamente o mediante un mensaje de error, y la defensa consiste en validar el destino (lista de hosts permitidos, solo http y https, direcciones privadas rechazadas, redirecciones controladas)
El sitio se convierte en un relé: la petición sale desde dentro de la red, donde los cortafuegos de red suelen dejarlo pasar todo.

La respuesta no siempre vuelve en claro: se habla de SSRF «ciega» cuando el atacante solo ve un mensaje de error o un tiempo de respuesta, lo que sin embargo basta para saber si un puerto está abierto.

Vídeo: «Server-Side Request Forgery (SSRF): qué es y cómo funciona» (RINKU)

Cómo protegerte

  • Lista de permitidos: cuando los destinos son conocidos (una API concreta), acepta solo esos.
  • Solo http y https, en puertos estándar.
  • Rechazar las direcciones internas después de la resolución DNS, y comprobar también cada redirección: un nombre de dominio público puede apuntar a una dirección privada.
  • En el alojamiento: segmentación de la red y, en AWS, paso a IMDSv2, que OWASP recomienda para limitar el robo de metadatos.

En WordPress: wp_safe_remote_get y los pingbacks

WordPress ofrece las herramientas adecuadas, siempre que se usen. wp_safe_remote_get() y sus variantes validan la URL y cada URL de redirección con wp_http_validate_url(): solo pasan http y https, se rechazan las credenciales dentro de la URL, se descartan las direcciones de bucle local y privadas, y un puerto explícito debe ser 80, 443 u 8080. En cambio, wp_remote_get() no hace esta validación por defecto: un plugin que la usa con una dirección facilitada por un visitante queda expuesto. El filtro http_request_host_is_external permite autorizar un host interno concreto; abrirlo a cualquiera anula la protección.

$respuesta = wp_safe_remote_get( esc_url_raw( $url_recibida ), array( 'timeout' => 5 ) );
if ( is_wp_error( $respuesta ) ) {
    return; // URL rechazada o inalcanzable
}

El propio núcleo sufrió este problema: antes de WordPress 3.5.1, el pingback de XML-RPC permitía enviar peticiones a servidores internos y escanear puertos (CVE-2013-0235). El pingback usa ahora wp_safe_remote_get(), pero sigue siendo una función que hace que tu servidor emita peticiones a petición de un tercero. Si no lo usas, el módulo de refuerzo de seguridad de WP Masquerade bloquea gratis los pingbacks y XML-RPC; nuestro artículo sobre XML-RPC te ayuda a comprobar que ningún servicio depende de ellos. Para lo demás, la SSRF se corrige en el código del plugin afectado, y un cortafuegos de aplicaciones web puede filtrar mientras tanto las direcciones internas más evidentes.

Para saber más

  • Artículo Cómo desactivar XML-RPC en WordPress: riesgos, usos y método correcto
  • Página Refuerzo de seguridad de WordPress

Fuentes

  1. OWASP Cheat Sheet Series: Server-Side Request Forgery Prevention (enlace externo, se abre en una pestaña nueva)
  2. MITRE CWE-918: Server-Side Request Forgery (SSRF) (enlace externo, se abre en una pestaña nueva)
  3. WordPress Developer Resources: wp_http_validate_url() (enlace externo, se abre en una pestaña nueva)
  4. CVE Record: CVE-2013-0235 (enlace externo, se abre en una pestaña nueva)

Todas las definiciones

Seguridad de WordPress, sin ruido

Un correo cuando importa: nuevos ataques observados, actualizaciones de la extensión y guías prácticas. Sin spam, baja con un clic.

Empieza gratis y pasa a Pro cuando estés listo

La versión gratuita ya oculta WordPress y cambia la dirección de la página de acceso. Pro añade alias, verificación en dos pasos y supervisión.