Reports
MEDIA[OTRAS INYECCIONES]#3443563

Inyección CSS en Roundcube: un escape de carácter burla el filtro de estilos y revela la IP de quien lee el correo

El filtro de estilos de Roundcube Webmail se podía saltar con escapes de carácter CSS. Un correo HTML colaba `url()` en un atributo style y obtenía la IP y el agente de usuario de quien lo abría.

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

Roundcube Webmail pasa los estilos en línea de los correos HTML por un filtro. El investigador somerandomdev comunicó al programa de Nextcloud una forma de esquivarlo: construir una entidad HTML a partir de un escape de carácter CSS.

La clave está en la secuencia \0026, un escape CSS que se decodifica como &. Seguida del texto quot;, forma la entidad que representa una comilla doble. Esa comilla cierra la cadena de CSS en la que parecía estar todo el contenido, de modo que lo que venía detrás deja de ser texto y se interpreta como CSS real.

A partir de ahí se puede usar CSS en línea arbitrario, incluido url(). El reporte se envió el 27 de noviembre de 2025 y se divulgó el 14 de enero de 2026, con severidad media y estado resuelto. Consta en HackerOne con la debilidad de revelación de información.

Pasos de reproducción

  1. Envía a tu propia cuenta un correo HTML con este contenido:
<div style='content: "\0026quot;; background: url(//http.cat/418); content:""; width: 100%; height: 100%;'>hi, this shouldn't work :(</div>
  1. Abre ese correo en Roundcube en modo HTML.
  1. Comprueba que el fondo se aplica al elemento y que el navegador hace una petición HTTP a https://http.cat/418.

Impacto

Un atacante puede enviar un correo malicioso a la víctima y, cuando esta lo abre en modo HTML, obtener su dirección IP y su agente de usuario.

Qué aprender de este caso

  • Si auditas un filtro de CSS, prueba escapes como \0026 dentro de cadenas en atributos style: un filtro que da por inofensivo lo que hay entre comillas puede dejar pasar url() en cuanto esa cadena se cierra antes de lo previsto.
  • Busca en estos filtros el orden de las decodificaciones. Aquí, un escape CSS producía & y, junto a quot;, una entidad HTML: el peligro aparece cuando el texto ya revisado se vuelve a interpretar en otra capa.
  • Para evitarlo, decide sobre el valor ya normalizado, después de resolver escapes CSS y entidades HTML, y reescribe el estilo a partir del resultado analizado en lugar de devolver la cadena original.
  • En webmail, cualquier url() que sobreviva al filtro funciona como píxel de seguimiento, así que conviene probar la carga de recursos remotos en el propio correo abierto y no solo la ejecución de scripts.