Saltar al contenido
CVE-2026-76203 ·
Media · 19 de agosto de 2026

Evasión del saneador de CSS en los temas de informe de Pentestify permite forzar peticiones salientes desde los navegadores de los usuarios

S0
Secur0 CNA
CVE-2026-76203

Descripción

Incorrect Behavior Order: Validate Before Canonicalize (CWE-180) en sanitize_css_source() (backend/schemas.py), alcanzable desde POST /api/themes y PUT /api/settings, en Pentestify 1.2.0 hasta 2.3.2 incluida, que permite a un usuario autenticado sin rol privilegiado forzar peticiones HTTP salientes desde el navegador de cualquier otro usuario hacia un servidor bajo su control mediante un tema de informe cuyo custom_css reconstruye la función url( con escapes hexadecimales de CSS (\75 rl(...)), debido a que el saneador aplica una lista de bloqueo de subcadenas literales sobre el texto sin canonicalizar (re.sub(r'url\(([^)]*)\)', _url, css, flags=re.IGNORECASE)) mientras que el tokenizador del navegador resuelve los escapes antes de reconocer la función, a diferencia de is_safe_image_src() en el mismo archivo, que valida los orígenes de imagen contra una lista de permitidos anclada (^data:image/...$). El CSS almacenado se aplica a toda la instalación porque report_theme es un ajuste global de fila única y PUT /api/settings solo exige Depends(auth.require_auth), y se inyecta mediante styleEl.textContent en injectThemeStyles() (js/app.js), por lo que no hay ejecución de JavaScript por esta vía. Esto resulta en la divulgación de la dirección IP y el User-Agent de cada usuario que inicie sesión y cargue la aplicación, hacia un servidor controlado por el atacante, sin ninguna acción adicional por parte de la víctima.

Tipo de vulnerabilidad (CWE)

CWE-180: Incorrect Behavior Order: Validate Before Canonicalize

Versiones afectadas

Pentestify desde 1.2.0 hasta 2.3.2 incluida. El fallo se introdujo junto con el editor de CSS libre de los temas de informe (commit 7c5e4c8, APP_VERSION 1.2.0): las versiones anteriores no incorporan el campo custom_css y no están afectadas. Las releases etiquetadas v2.0.0, v2.2.0, v2.3.0 y v2.3.2 incorporan el fallo; v1.1.1 no. La corrección (1ed1aad) no modifica APP_VERSION, que permanece en 2.3.2, y no está etiquetada: a fecha de este aviso ninguna versión ni etiqueta publicada incorpora la corrección. Estado por defecto: no afectado.

Puntuación (CVSS 4.0)

Media (5.1)

CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N

Solución

No existe todavía una versión corregida. Aplicar el commit 1ed1aad, que canonicaliza los escapes CSS (\XX hexadecimal y \X literal) antes de ejecutar la lista de bloqueo, o actualizar a la primera versión publicada que lo incorpore. Los temas ya almacenados no se resanean al actualizar: revisar el contenido de custom_css de los temas existentes y el valor de report_theme en los ajustes globales, y eliminar cualquier tema que contenga escapes de CSS.

Parche

Commit 1ed1aad

Créditos

  • Manuel Martínez Casasola - finder (descubridor)
  • Xoán M. Otero Jorge - analyst (analista)
  • Secur0 CNA - coordinator (coordinador)
  • Mario Álvarez Fernández - remediation developer (desarrollador de la corrección) Origen del descubrimiento: Externo Registro oficial: CVE-2026-76203