Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-45806 — Penpot's remote image import let an authenticated file editor turn a normal media convenience feature into backend-origin SSRF because attacker-controlled URLs crossed into a redirect-following server fetch path without destination filtering. | Kitploit
Herramientas/GitHubGitHub/0xmrma/cve-2026-45806
Análisis de VulnerabilidadesExplotaciónSeguridad WebPruebas de PenetraciónPapers e InvestigaciónAprendizaje y Educación
GitHub0xmrma/cve-2026-45806

CVE-2026-45806

Penpot's remote image import let an authenticated file editor turn a normal media convenience feature into backend-origin SSRF because attacker-controlled URLs crossed into a redirect-following server fetch path without destination filtering.

Ver Repositorio
1hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-45806

La importación remota de imágenes de Penpot permitía que un editor de archivos autenticado convirtiera una función de medios normal en SSRF de origen de backend porque las URL controladas por el atacante cruzaban hacia una ruta de búsqueda del servidor que seguía redirecciones sin filtrar destinos.

Introducción

Encontré este problema al revisar Penpot, la plataforma de diseño y colaboración de código abierto, con una pregunta muy específica en mente:

¿Qué sucede cuando una herramienta de diseño colaborativo permite que un usuario entregue al backend una URL de imagen remota para obtenerla?

En este caso, esa pregunta condujo a un error real.

El flujo de importación de imágenes remotas de Penpot aceptaba una URL controlada por el usuario y hacía que el backend la obtuviera desde el contexto de la red del servidor sin imponer restricciones de destino para objetivos de loopback o red privada. El cliente HTTP compartido también seguía las redirecciones automáticamente.

Eso convirtió una función de medios normal en una primitiva SSRF autenticada de origen de backend y finalmente se convirtió en CVE-2026-45806.

Penpot: Penpot en GitHub
CVE: CVE-2026-45806
CVSS: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

Esto afectó a Penpot. En su sitio web oficial y kit de medios, Penpot se presenta con una base de usuarios en crecimiento de +1M y dice que decenas de miles de organizaciones lo usan, incluyendo Blender, Mozilla, Fedora, NTT Data, , , , , y .

MIT
Société Générale
Cisco
Fujitsu
Indra
ByteDance
photo0

Cadena de Ataque

editor de archivos autenticado -> URL de imagen remota controlada por el atacante -> create-file-media-object-from-url -> descarga de imagen del backend con redirecciones habilitadas -> solicitud final llega a un endpoint interno solo de imágenes -> SSRF de origen de backend / alcance interno


Qué Hace Penpot

Penpot es una plataforma de diseño y colaboración de código abierto.

Maneja cosas como:

  • edición colaborativa de archivos
  • flujos de trabajo de equipos y proyectos
  • medios y activos subidos
  • rutas de renderizado y vista previa
  • operaciones de diseño basadas en navegador respaldadas por procesamiento del lado del servidor

Eso significa que su ruta de importación de medios se encuentra en un límite de confianza real.

La pregunta importante aquí no era si Penpot admite la importación de imágenes remotas.

La verdadera pregunta era:

¿Restringe Penpot a dónde puede conectarse el backend cuando un usuario importa una imagen remota?

En este caso, no lo hacía.


Por Qué Valió la Pena Mirar Este Error

Mucha gente subestima las funciones de importación remota.

Eso es un error.

En el momento en que una aplicación:

  • acepta una URL controlada por el atacante,
  • realiza la solicitud desde el backend,
  • y convierte esa solicitud en un flujo de trabajo normal del producto,

crea un límite de confianza de salida real.

Ese era el problema aquí.

Este error no estaba en el renderizado de imágenes. No estaba en el almacenamiento de archivos. No estaba en las comprobaciones de permisos habituales para editar un archivo.

Era una falla de confianza del lado del servidor clásica:

  • una URL controlada por el atacante ingresó al sistema,
  • el backend la obtuvo directamente,
  • se permitieron las redirecciones,
  • y no se observaron controles de destino en la ruta revisada.

Eso es suficiente para crear una vulnerabilidad real.


El Límite en el Que Me Enfoqué

No abordé Penpot lanzando RPC aleatorios de forma ciega o buscando caídas primero.

El enfoque más sólido fue identificar el límite de seguridad más prometedor.

Para Penpot, ese era la importación de medios remotos.

¿Por qué?

Porque esta función combina:

  • entrada de URL controlada por el atacante
  • solicitudes salientes de origen de backend
  • validación de contenido que ocurre solo después de realizar la solicitud
  • un flujo de trabajo de diseño donde las búsquedas exitosas se tratan como operaciones de medios normales

Ese era el límite correcto para inspeccionar.

Y fue exactamente donde vivía el error.


Causa Raíz

El error se reduce a una pequeña cadena de confianza.

En el frontend:

root@kitploit:~
(defn upload-media-url
  [name file-id url]
  (rp/cmd!
   :create-file-media-object-from-url
   {:name name
    :file-id file-id
    :url url
    :is-local true}))

la URL url controlada por el usuario se envía directamente a la llamada RPC.

Luego, en el backend:

root@kitploit:~
(sv/defmethod ::create-file-media-object-from-url
  ...
  [{:keys [::db/pool] :as cfg} {:keys [::rpc/profile-id file-id] :as params}]
  (files/check-edition-permissions! pool profile-id file-id)
  ...
  (let [_    (files/get-minimal-file cfg file-id)
        mobj (create-file-media-object-from-url cfg (assoc params :profile-id profile-id))])

y:

root@kitploit:~
(defn- create-file-media-object-from-url
  [cfg {:keys [url name] :as params}]
  (let [content (media/download-image cfg url)

el backend verifica que el llamante pueda editar el archivo de destino, luego pasa la URL controlada por el atacante a media/download-image.

La implementación de la búsqueda está aquí:

root@kitploit:~
(defn download-image
  "Download an image from the provided URI and return the media input object"
  [{:keys [::http/client]} uri]
  ...
  (http/req! client
             {:method :get :uri uri}
             {:response-type :input-stream})

Y el cliente HTTP compartido está configurado como:

root@kitploit:~
(http/build-client {:connect-timeout 30000
                    :follow-redirects :always}))

Esa es toda la vulnerabilidad:

  • el atacante controla la URL
  • el backend realiza la solicitud
  • las redirecciones se siguen automáticamente
  • no se aplica filtrado de destino antes de realizar la solicitud

Por qué es explotable

Porque el atacante solo necesita:

  • una cuenta válida de Penpot
  • permiso de edición en un archivo
  • un objetivo que devuelva contenido de imagen aceptado

La cadena de ataque es sencilla:

  • el atacante proporciona una URL
  • Penpot la obtiene desde el backend
  • el primer salto puede ser público o aparentemente inofensivo
  • el destino de la redirección puede ser interno
  • si la respuesta final parece una imagen permitida, la importación se completa

Ese es todo el error.


Qué Convierte Esto en un Problema de Seguridad, No Solo en un Comportamiento Normal de Importación Remota

La distinción importante es dónde ocurre la solicitud.

La pregunta no es:

"¿Puede Penpot importar imágenes desde URL?"

La verdadera pregunta es:

"¿Puede un usuario autenticado hacer que el backend de Penpot se conecte a destinos internos a los que el usuario no debería poder acceder a través de la aplicación?"

En este caso, la respuesta fue sí.

Eso importa porque hay una diferencia real entre:

  • un navegador obteniendo una URL proporcionada por el usuario, y
  • el backend obteniendo esa URL desde la posición de red del servidor

La validación de imágenes no elimina esa diferencia.

Reduce algunos casos de exfiltración directa, pero no elimina la condición SSRF ni la ruptura del límite de red.


PoC

Validé este problema con una prueba local controlada vinculada directamente a la ruta de código revisada de Penpot.

El objetivo no era alcanzar infraestructura de terceros. El objetivo era demostrar la propiedad de seguridad exacta:

  • ejecución de solicitudes estilo backend
  • seguimiento de redirecciones
  • pivote exitoso a un endpoint solo interno
  • finalización bajo las mismas restricciones orientadas a imágenes que Penpot impone

Construí un validador Java autocontenido que reflejaba el comportamiento relevante:

  • GET del lado del backend a una URI controlada por el llamante
  • seguimiento automático de redirecciones
  • comprobaciones de aceptación de imágenes basadas en content-type y content-length

Validé dos casos.

Caso 1: búsqueda interna directa

El validador solicitó:

root@kitploit:~
http://127.0.0.1:7790/internal.png

Resultado observado:

  • URI solicitada: http://127.0.0.1:7790/internal.png
  • URI final: http://127.0.0.1:7790/internal.png
  • estado: 200
  • tipo de contenido: image/png
  • artefacto escrito exitosamente

Eso demostró que la lógica de búsqueda estilo importación aceptaba un endpoint de imágenes solo interno directamente.


Caso 2: búsqueda interna asistida por redirección

El validador luego solicitó:

root@kitploit:~
http://localhost:7791/redirect-to-internal

Ese endpoint devolvió una redirección HTTP a:

root@kitploit:~
http://127.0.0.1:7790/internal.png

Resultado observado:

  • URI solicitada: http://localhost:7791/redirect-to-internal
  • URI final: http://127.0.0.1:7790/internal.png
  • estado: 200
  • tipo de contenido: image/png
  • artefacto escrito exitosamente

El listener solo interno registró la solicitud redirigida.

Eso demostró la afirmación más importante:

  • la URL inicial controlada por el atacante puede diferir del destino final
  • las redirecciones se siguen automáticamente
  • la búsqueda final del backend puede aterrizar en un endpoint solo interno y aún así tener éxito

Por Qué Se Construyó el PoC de Esta Manera

El payload aquí fue intencionalmente simple:

  • pequeña respuesta PNG válida
  • destino de redirección explícito
  • listener solo interno vinculado a loopback

Eso importaba porque Penpot no solo obtiene bytes arbitrarios y se detiene. Realiza validación orientada a medios después de la solicitud.

Por lo tanto, la prueba correcta no era:

"el backend puede intentar conectarse a algún lugar"

La prueba más sólida era:

"se puede hacer que el backend se conecte a algún lugar interno y complete la solicitud con éxito bajo las mismas restricciones similares a imágenes que la función espera"

Eso es exactamente lo que demostró la validación.


Por Qué Aún Valió la Pena Reportar Esto

Una reacción común a errores SSRF como este es:

"el objetivo aún debe devolver una imagen"

Esa observación es cierta pero incompleta.

No elimina la vulnerabilidad.

Solo te dice qué objetivos internos son más directamente útiles.

Este problema aún permite:

  • alcance interno de origen de backend
  • pivoteo asistido por redirección hacia espacio de loopback o red privada
  • interacción con endpoints internos que devuelven imágenes
  • abuso de confianza de red desde la posición del servidor de Penpot

Eso sigue siendo una ruptura real del límite de seguridad.

Especialmente en entornos autoalojados, los servicios internos a menudo existen específicamente detrás de ese límite.


Gravedad y Clasificación

Este problema finalmente recibió una gravedad Alta en CVSS:

  • CWE-918: Server-Side Request Forgery (SSRF)
  • CVSS:
root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N

Esa clasificación tiene sentido.

La afirmación no es que un atacante no autenticado pueda comprometer instantáneamente cada implementación de Penpot desde cero.

La afirmación es que cualquier editor de archivos autenticado normal puede convertir Penpot en una primitiva de solicitud de backend contra destinos internos, incluyendo acceso asistido por redirección a objetivos de loopback y red privada.

Hubo cierta discusión sobre la gravedad durante la divulgación, principalmente en torno a:

  • servicios internos que requieren autenticación
  • que el contenido obtenido debe pasar la validación de imagen
  • la explotación depende del conocimiento de la infraestructura interna

Esas son restricciones justas para discutir.

Pero no eliminan el problema central:

  • URL controlada por el atacante
  • origen de solicitud del lado del backend
  • seguimiento de redirecciones
  • ninguna política de destino saliente en la ruta revisada

Eso es una vulnerabilidad SSRF real y defendible.


Análisis de la Corrección

La corrección importante aquí no es un manejo MIME más estricto.

La verdadera corrección es una política de destino saliente.

Una remediación correcta para esta clase de error necesita:

  1. permitir solo http y https
  2. resolver y rechazar rangos loopback, RFC1918/privados, link-local, multicast, no especificados y de metadata de servicio antes de la conexión
  3. volver a verificar cada salto de redirección contra la misma política
  4. considerar deshabilitar las redirecciones para esta función o limitarlas estrictamente
  5. agregar cobertura de regresión para:
    • localhost
    • objetivos privados directos
    • casos de redirección a privado
    • escenarios estilo secuestro de DNS

Esa es la dirección correcta de corrección porque esto no era un error de análisis de imágenes. Era un error de límite de confianza de red.


Divulgación

Este problema se reportó de forma privada a través del flujo de reporte de seguridad de GitHub.

El informe incluía:

  • análisis de causa raíz a nivel de código fuente
  • un modelo de validación local sólido
  • prueba de pivoteo interno basado en redirección
  • evidencia de artefactos y registros
  • orientación de remediación

Los mantenedores confirmaron el problema y comenzaron a trabajar en una resolución.

El problema luego recibió:

CVE-2026-45806


Qué Enseña Realmente Este Error

La lección clave aquí es simple:

la importación remota de medios es un límite de confianza de salida, no solo una función de conveniencia

Muchos desarrolladores piensan en términos de:

  • URL aceptada
  • solicitud exitosa
  • imagen pasa validación
  • medio se almacena

Esos son detalles de implementación.

La verdadera pregunta de seguridad es:

¿a dónde puede conectarse el backend en nombre de un usuario?

Si esa pregunta no se responde explícitamente, funciones como la importación remota se convierten en superficies SSRF por defecto.

Este error también refuerza algo importante sobre la revisión de SSRF:

  • las redirecciones importan
  • la validación de contenido no es un sustituto de la política de red
  • la SSRF autenticada sigue siendo grave cuando cruza hacia límites de confianza internos

Esa es la verdadera conclusión.


Puntos Clave

  • la importación remota de imágenes es un límite de confianza real del backend
  • las funciones autenticadas aún pueden exponer SSRF grave
  • el seguimiento de redirecciones hace que las rutas de búsqueda salientes sean mucho más peligrosas
  • la validación solo de imágenes reduce algunas rutas de abuso pero no elimina la SSRF
  • demostrar una ruta de redirección interna exitosa es más sólido que solo mostrar un intento de conexión fallido
  • la corrección correcta es una política de destino saliente, no una validación de respuesta cosmética

Palabras Finales

Esta vulnerabilidad no se trataba de un payload llamativo.

Se trataba de hacer la pregunta correcta sobre el límite de confianza.

Penpot permitió que un editor de archivos autenticado proporcionara una URL de imagen remota, y el backend confió en esa URL más de lo que debería. El manejo de redirecciones hizo el resto.

Por eso esto se convirtió en CVE-2026-45806.

Descargar herramienta