Reports
BAJA[OAUTH Y SESIONES]#3733905

curl aceptaba cookies para un sufijo público como co.uk. si el dominio terminaba en punto (CVE-2026-8924)

curl con soporte PSL rechazaba Domain=co.uk, pero aceptaba Domain=co.uk. cuando el host también acababa en punto. Así un servidor podía fijar una cookie que curl enviaba después a otros dominios bajo el mismo sufijo.

Resumen
Resumen en castellano de un reporte público, no una traducción literal. El código y los comandos se mantienen como en el original.

Resumen

curl, cuando se compila con libpsl, consulta la Public Suffix List (PSL) para impedir que un servidor fije cookies para un sufijo público entero. Por ejemplo, una respuesta de foo.co.uk con Domain=co.uk se descarta, porque esa cookie llegaría a cualquier web bajo .co.uk. Es lo que se llama una "supercookie".

El fallo estaba en la forma FQDN del nombre, la que termina en punto. Si la petición iba a foo.co.uk. y el servidor respondía con Domain=co.uk., curl aceptaba la cookie y la mandaba después a otro host distinto, como bar.co.uk.. Las formas con y sin punto final recibían un trato distinto.

La debilidad que figura en HackerOne es "Use of Incorrectly-Resolved Name or Reference", severidad baja, con el identificador CVE-2026-8924. El investigador lo reprodujo en curl 8.20.0 (paquete de Debian Testing, con libpsl 0.21.5) y en 8.21.0-DEV.

Pasos de reproducción

El investigador adjuntó un script en Python que levanta un servidor HTTP local y lanza dos flujos con curl. Se ejecuta así:

CURL=/path/to/curl python3 curl_trailing_dot_psl_demo.py

Para que la prueba no dependa de nada externo, curl se lanza con el motor de cookies activado y redirige los nombres a la máquina local:

-b ""
--connect-to foo.co.uk.:<port>:127.0.0.1:<port>
--connect-to bar.co.uk.:<port>:127.0.0.1:<port>
  1. Caso de control (sin punto final). curl pide:

``text http://foo.co.uk:<port>/start-canonical ``

El servidor responde con una cookie para el sufijo y una redirección a otro host:

``http Set-Cookie: canonical=1; Domain=co.uk; Path=/ Location: http://bar.co.uk:<port>/check-canonical ``

curl sigue la redirección pero no envía canonical=1 a bar.co.uk, que es el comportamiento esperado.

  1. Caso con punto final. curl pide:

``text http://foo.co.uk.:<port>/start-trailing ``

El servidor responde igual, pero con el punto final en el dominio de la cookie y en el host de destino:

``http Set-Cookie: trail=1; Domain=co.uk.; Path=/ Location: http://bar.co.uk.:<port>/check-trailing ``

  1. Al seguir la redirección, curl sí manda la cookie al segundo host. El script muestra:

``text VULNERABLE / reproduced: bar.co.uk. received Cookie: trail=1 ``

Impacto

Un servidor malicioso al que se llegue por un nombre terminado en punto podría fijar una cookie para el sufijo público en esa misma forma (co.uk.), que curl enviaría después a otro host terminado en punto bajo ese sufijo, aunque no tenga nada que ver con el primero. Eso abre la puerta a:

  • Inyección de cookies entre sitios: el atacante coloca una cookie que otra web recibirá como si fuera suya.
  • Revelación no intencionada de cookies entre hosts que no deberían compartir nada.

El alcance es limitado: solo afecta a aplicaciones que usan curl o libcurl con las cookies activadas y que piden direcciones terminadas en punto. Como señala el propio investigador, es una exposición más estrecha que un salto general de la PSL. HackerOne lo clasifica con severidad baja.

Remediación

El reporte figura como resuelto en el programa de curl y tiene asignado el CVE-2026-8924. El texto divulgado no explica el parche ni dice en qué versión se corrigió.

Qué aprender de este caso

  • Cuando un código compara nombres de dominio con una lista (PSL, listas de bloqueo, de hosts permitidos o de dominios con HSTS), prueba la variante con punto final (example.com.). Es un nombre válido y equivalente, pero si la lista se guarda sin punto, la búsqueda directa falla.
  • Normaliza el nombre una sola vez y antes de cualquier decisión de seguridad (minúsculas, sin punto final, en punycode) y usa esa misma forma tanto para consultar la PSL como para comparar Domain con el host.
  • Un buen método para encontrar fallos así es el de este reporte: un caso de control que se bloquea correctamente y la misma petición con una sola variación. Si el resultado cambia, hay una ruta de código que se salta la comprobación.
  • En un cliente que sigue redirecciones con cookies activadas, cada Location hacia otro host es una ocasión para que una cookie mal aceptada llegue adonde no debe: esa es la ruta que conviene probar.