Server-Side Request Forgery en Pentestify permite peticiones salientes desde el servidor mediante URLs de imagen no validadas
Descripción
Server-Side Request Forgery (CWE-918) en el componente de exportación a PDF (generate_pdf, backend/main.py) y en los esquemas de entrada FindingBase y ReportBase (backend/schemas.py), expuesto en GET /api/reports/{report_id}/pdf y alimentado desde POST /api/reports/{report_id}/findings, en Pentestify 1.0.0, que permite a un usuario autenticado provocar peticiones HTTP GET salientes desde el servidor hacia destinos arbitrarios elegidos por el atacante (loopback, red interna o hosts externos) mediante URLs almacenadas en el campo images de un hallazgo (y de forma equivalente en client_logo de un reporte), debido a que ambos campos se declaran como List[str] sin validador alguno (backend/schemas.py:48 y backend/schemas.py:85), se persisten tal cual y se interpolan sin saneado en <img src="${img}"> al construir el informe (js/app.js:1336 y js/app.js:1113), mientras que la generación del PDF renderiza esa misma página en un Chromium headless del lado servidor con page.goto(target_url, wait_until="networkidle") (backend/main.py:379), condición de espera que obliga al navegador a completar la descarga de cada subrecurso desde el perímetro del servidor, a diferencia del tratamiento que el propio proyecto ya daba al destino de navegación, fijado a la constante APP_BASE_URL en lugar de derivarlo de la petición precisamente para impedir que el navegador headless visitase destinos controlados por el atacante (commit 3b78e92), criterio que no se extendió a los subrecursos cargados por la página renderizada. Esto resulta en la emisión de una petición saliente controlada por el atacante desde el servidor objetivo, verificada por la recepción de dicha petición en un servidor de escucha externo. Se trata de un SSRF ciego: el contexto <img> no devuelve al atacante el cuerpo de la respuesta, y la prueba de concepto no demuestra lectura ni exfiltración de contenido interno.
Tipo de vulnerabilidad (CWE)
CWE-918: Server-Side Request Forgery (SSRF)
Versiones afectadas
Pentestify anteriores a 1.1.0 (corregido en 1.1.0 por el commit a058a22, de fecha 2026-06-23). La versión se lee de la constante APP_VERSION en js/app.js: aparece por primera vez en el commit 2a1551b con valor 1.0.0 y pasa a 1.1.0 en el propio commit de corrección; los commits anteriores no llevaban identificador de versión. Ni 1.0.0 ni 1.1.0 tienen etiqueta git. La primera etiqueta del repositorio es v1.1.1, que ya incorpora la corrección, por lo que ninguna release etiquetada se distribuyó en estado vulnerable y 1.0.0 es el único estado con identificador de versión afectado. El sumidero server-side existe desde la introducción del renderizado con Playwright (commit 7e7d53f, 2026-05-02). Estado por defecto: no afectado.
Puntuación (CVSS 4.0)
Media (5.3)
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:L/VA:N/SC:L/SI:L/SA:N
Solución
Actualizar a la versión 1.1.0 o superior. La corrección no se etiquetó: la primera release etiquetada que la incorpora es v1.1.1.
Parche
Commit a058a22
Créditos
- Marcos Turrión García (marcosturriongarcia2005) - finder (descubridor)
- Xoán M. Otero Jorge - analyst (analista)
- Cristian Fernandez Cornejo - analyst (analista)
- Secur0 CNA - coordinator (coordinador)
- Mario Álvarez Fernández (maalfer) - remediation developer (desarrollador de la corrección) Origen del descubrimiento: Externo Registro oficial: CVE-2026-59231