Stored Cross-site Scripting en Pentestify permite ejecución de JavaScript mediante el nombre de usuario en el botón de eliminación de cuentas
Descripción
Improper Neutralization of Input During Web Page Generation (Cross-site Scripting) (CWE-79), de tipo almacenado, en el componente de gestión de usuarios del frontend (js/app.js) y en el esquema de entrada CreateUserRequest (backend/schemas.py), expuesto en POST /api/users y renderizado en la página de Cuenta, en Pentestify 1.1.0, que permite a un usuario autenticado ejecutar JavaScript arbitrario en el navegador de otro usuario autenticado mediante un nombre de usuario manipulado, debido a que el campo username se declaraba como str sin validador ni lista blanca, se persistía tal cual, y el frontend lo interpolaba dentro de un literal de cadena JavaScript en el atributo onclick del botón de eliminación de cuenta (js/app.js:1923), donde el saneado aplicado resultaba inefectivo: escapeHTML() convierte la comilla simple en ' y el replace posterior, destinado a escapar comillas literales, ya no encuentra ninguna, de modo que el analizador HTML decodifica la entidad de vuelta a ' antes de que el motor de JavaScript interprete el manejador, cerrando el literal de cadena e inyectando código ejecutable, a diferencia de la línea 1918 de esa misma vista, que renderiza el mismo valor mediante escapeHTML() en contexto de texto y no es explotable. Esto resulta en la ejecución de JavaScript arbitrario en el origen de la aplicación, en el navegador del usuario que pulsa el botón de eliminación correspondiente a la cuenta manipulada. La prueba de concepto demuestra la ejecución del código inyectado: 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 1.1.1 (corregido en 1.1.1 por el commit 714e05e, de fecha 2026-06-25). El sumidero se introdujo junto con la gestión de usuarios en el commit 2a1551b (2026-06-20), en la versión 1.0.0, y estuvo presente en las versiones 1.0.0 y 1.1.0. Ninguna de esas versiones tiene etiqueta git: v1.1.1 es la primera etiqueta del repositorio y ya incorpora la corrección, por lo que ninguna release etiquetada se distribuyó en estado vulnerable. 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 1.1.1 o superior.
Parche
Commit 714e05e
Créditos
- Marcos García (s3ntinl) - finder (descubridor)
- Xoán M. Otero Jorge - analyst (analista)
- Darío Rivas Quero - 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-19716