Reports
MEDIA[CONFIGURACIÓN]#3183046

Omise: la CDN de www.omise.co guardaba una copia distinta de cada página por cada parámetro GET inventado

La CDN de www.omise.co usaba la URL completa como clave de caché, sin descartar parámetros desconocidos. Con ?test=123, ?abc=456… cualquiera podía llenar la caché de copias idénticas de una misma página.

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

El investigador alitoni224 detectó que la caché que sirve www.omise.co (las cabeceras CF-Cache-Status apuntan a Cloudflare) construía la clave de caché con la URL entera, parámetros de consulta incluidos, sin normalizarlos ni descartar los que la aplicación no usa.

Eso significa que una misma página, por ejemplo /en/contact-sales, acaba almacenada tantas veces como variantes de parámetros se le pidan: ?test=123, ?abc=456, ?polluted_param=… Todas devuelven el mismo contenido, pero cada una ocupa su propia entrada en la caché. Es lo que se conoce como cache pollution (contaminación de la caché).

El reporte tiene severidad media y figura como resuelto. Se envió el 8 de junio de 2025 y se hizo público el 11 de febrero de 2026.

Pasos de reproducción

  1. Elegir una página pública que la CDN guarde en caché, por ejemplo https://www.omise.co/en/contact-sales.
  2. Pedirla con un parámetro GET único:
GET /en/contact-sales?test=123 HTTP/2
Host: www.omise.co
  1. Revisar las cabeceras de la respuesta. Según el reporte aparecen:
CF-Cache-Status: HIT
Age: <increasing>

El valor de Age va aumentando, lo que indica que esa variante concreta se está sirviendo desde la caché.

  1. Repetir la petición con otro parámetro distinto:
GET /en/contact-sales?abc=456 HTTP/2
Host: www.omise.co
  1. Comprobar que esta variante también se almacena por separado. Según el reporte, /en/contact-sales?test=123, /en/contact-sales?abc=456 y /en/contact-sales?polluted_param= reciben cada una su propio CF-Cache-Status: HIT y un Age nuevo.

Impacto

Un atacante puede generar de forma automática un gran número de variantes únicas de la misma URL y, con ello:

  • Llenar la caché de la CDN con copias redundantes de páginas idénticas.
  • Expulsar entradas útiles de la caché, de modo que las páginas populares dejen de servirse desde ella (una forma de denegación de servicio).
  • Si algún día un parámetro se reflejara en la respuesta, o cambiara cómo se pinta la página (errores, bucles de redirección), el mismo comportamiento abriría la puerta a un envenenamiento de caché (web cache poisoning). El reporte lo plantea como riesgo futuro, no como algo demostrado.

Remediación

El reporte figura como resuelto, pero no detalla qué cambió Omise. El investigador proponía:

  • Normalizar la clave de caché, ignorando los parámetros GET desconocidos o irrelevantes.
  • O bien incluir en la clave solo una lista blanca de parámetros permitidos.
  • Usar surrogate keys o cabeceras Vary con cuidado para controlar qué se cachea y cómo.

Qué aprender de este caso

  • Para buscar algo parecido, pide una página cacheable añadiendo un parámetro inventado (?x=1, ?x=2) y compara CF-Cache-Status, X-Cache y Age entre variantes: si cada una tiene su propio contador, el query string completo forma parte de la clave.
  • Ese mismo comportamiento es la base de un cache buster: cuando la clave incluye cualquier parámetro, revisa además si alguno se refleja en el HTML o en cabeceras, porque ahí es donde la contaminación se convierte en envenenamiento.
  • Al configurar la CDN (en Cloudflare, con reglas de caché sobre la cache key), define qué parámetros de consulta importan para cada ruta y descarta el resto; en páginas estáticas como un formulario de contacto, normalmente ninguno.