Stored Cross-site Scripting en Pentestify permite ejecución de JavaScript mediante el campo severity de los hallazgos
Descripción
Improper Neutralization of Input During Web Page Generation (Cross-site Scripting) (CWE-79), de tipo almacenado, en el renderizador de hallazgos del frontend (js/app.js) y en los esquemas de entrada FindingBase y FindingTemplateBase (backend/schemas.py), expuesto en POST /api/reports/{report_id}/findings y renderizado en las vistas de Edición y Vista Previa del informe, en Pentestify 2.3.0, que permite a un usuario autenticado ejecutar JavaScript arbitrario en el origen de la aplicación mediante marcado HTML almacenado en el campo severity de un hallazgo, debido a que dicho campo se declaraba como str sin validador ni lista blanca (backend/schemas.py:86 y :329), se persistía tal cual, y el frontend lo interpolaba en bruto dentro de atributos class y style sin escapar (js/app.js:1552, :2823, :2876 y :2883), de modo que un valor que cierre el atributo con "> escapa del contexto del atributo y permite inyectar elementos arbitrarios en el DOM, a diferencia de los campos title y description del mismo hallazgo, que el propio proyecto ya hacía pasar por la función escapeHTML() antes de renderizarlos. Esto resulta en la ejecución de JavaScript arbitrario en el origen de la aplicación cuando se renderiza el informe. La prueba de concepto aportada demuestra que el backend acepta y almacena el valor sin validación y que el marcado inyectado se ejecuta al abrir el informe: no demuestra acceso a la sesión ni exfiltración de datos.
Tipo de vulnerabilidad (CWE)
CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Versiones afectadas
Pentestify anteriores a 2.3.1 (corregido por el commit 8e81053, de fecha 2026-07-17). El commit de corrección no modificó la constante de versión, que permaneció en 2.3.0; la primera versión que incorpora la corrección es 2.3.1, establecida por el commit inmediatamente posterior 9deca77. La etiqueta v2.3.0 se distribuyó en estado vulnerable. La versión 2.3.1 no tiene etiqueta git: la primera etiqueta que incorpora la corrección es v2.3.2. Las versiones se leen de la constante APP_VERSION en js/app.js. 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:N/SI:L/SA:N
Solución
Actualizar a la versión 2.3.1 o superior. La corrección no se etiquetó: la primera release etiquetada que la incorpora es v2.3.2.
Parche
Commit 8e81053
Créditos
- Marcos García (s3ntinl) - finder (descubridor)
- Cristian Fernández Cornejo - analyst (analista)
- 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-19434