Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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
Herramientas/GitHubGitHub/a1ohadance/cve-2026-38360
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónSeguridad WebPruebas de PenetraciónAprendizaje y Educación
GitHuba1ohadance/cve-2026-38360

CVE-2026-38360

Aviso: CVE-2026-38360 recorrido de rutas (CWE-22) en dash-uploader (Python/PyPI)

Ver Repositorio
210hace 4 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-38360: Path Traversal en dash-uploader

CVE NVD CWE Severity Patch Auth Version PyPI Downloads Total Downloads License

Path traversal no autenticado en fohrloop/dash-uploader (Python, PyPI) que permite la escritura arbitraria de archivos, lo que conduce a (entre otros) ejecución remota de código (RCE), sobrescritura del código fuente de la aplicación, XSS almacenado e instalación de puertas traseras persistentes.

⚠️ No hay parche disponible y nunca se publicará ninguno

El repositorio fue archivado el 2025-07-19 sin un mantenedor activo. Todas las versiones publicadas (desde 0.1.0 hasta 0.7.0a2) están afectadas y seguirán estándolo. El paquete sigue registrando aproximadamente 28 000 descargas mensuales.

Cualquier persona que ejecute dash-uploader en producción debe aplicar una mitigación por su cuenta. La solución recomendada es migrar al componente dcc.Upload integrado de Plotly Dash. Consulta Mitigación para conocer todas las opciones.

ID de CVECVE-2026-38360 (NVD)
VulnerabilidadPath Traversal (CWE-22)
CVSS 3.19.8 / Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Productodash-uploader
Versiones afectadas0.1.0 hasta 0.7.0a2 (las 18 versiones)
Versión corregidaninguna (proyecto archivado el 2025-07-19)
Vector de ataqueRemoto, sin autenticación
DescubridorMuhammad Fitri Bin Mohd Sultan
Asignado porMITRE, 2026-05-07
RelacionadoCVE-2026-38361 (DoS en la misma librería)

Descripción

Tres parámetros controlados por el usuario, obtenidos de request.form.get() en dash_uploader/httprequesthandler.py, se pasan directamente a os.path.join() y os.makedirs() sin ninguna sanitización ni validación:

  1. upload_id (línea 57 → línea 161, BaseHttpRequestHandler.get_temp_root): controla el directorio de destino. Un atacante puede enviar upload_id=../../../../usr/local/lib/python3.10/site-packages y los archivos se escribirán en el directorio de paquetes de Python.

  2. resumableFilename (línea 51 → línea 108, BaseHttpRequestHandler._post): controla el nombre de archivo final. Un atacante puede salir del directorio de carga mediante el nombre de archivo incluso con un upload_id legítimo.

  3. resumableIdentifier (línea 54 → línea 64, BaseHttpRequestHandler._post): se usa con os.makedirs() para crear el directorio temporal. Un atacante puede crear directorios arbitrarios en cualquier parte del sistema de archivos.

El endpoint de carga (/API/dash-uploader por defecto) no requiere autenticación. El hook http_request_handler añadido en v0.5.0 permite comprobaciones previas a la petición mediante post_before(), pero el método vulnerable _post() lee todos los parámetros directamente de request.form después de que el hook retorne. El hook no puede sanitizar los parámetros antes de que la librería los procese. Un desarrollador que añada autenticación mediante el hook seguirá siendo vulnerable al path traversal por parte de un usuario autenticado.

Código vulnerable

# dash_uploader/httprequesthandler.py
def _post(self):
    resumableFilename = request.form.get("resumableFilename", default="error", type=str)
    resumableIdentifier = request.form.get("resumableIdentifier", default="error", type=str)
    upload_id = request.form.get("upload_id", default="", type=str)
    ...
    temp_root = self.get_temp_root(upload_id)                          # upload_id flows in here
    temp_dir = os.path.join(temp_root, resumableIdentifier)            # raw user input -> os.path.join
    if not os.path.isdir(temp_dir):
        os.makedirs(temp_dir)                                          # raw user input -> os.makedirs

def get_temp_root(self, upload_id):
    return os.path.join(self.upload_folder, upload_id)                 # no sanitization: ../../ escapes upload_folder

Tres sumideros de traversal independientes comparten la misma causa raíz: los valores del formulario llegan a os.path.join y os.makedirs sin validación.

Vectores de ataque

Un atacante remoto sin autenticar envía una petición HTTP POST multipart al endpoint de carga. Al inyectar secuencias de path traversal (../) en el parámetro de formulario upload_id, el atacante controla el directorio de destino del archivo subido. Por ejemplo, upload_id=../../../../usr/local/lib/python3.10/site-packages escribe archivos en el directorio de paquetes de Python, lo que permite RCE en el siguiente arranque del intérprete mediante la ejecución automática de .pth.

No se requiere autenticación, token de sesión ni token CSRF. Dos parámetros adicionales (resumableFilename y resumableIdentifier) proporcionan vectores de traversal independientes a través del mismo endpoint. La configuración predeterminada de la librería, tal como se muestra en la documentación oficial de inicio rápido, es explotable con un único comando curl.

Impacto

Escritura arbitraria de archivos en cualquier directorio escribible por el proceso del servidor. Esto se traduce en ejecución remota de código (RCE) mediante varias primitivas bien conocidas:

Primitivas de RCE

  • Depósito de un archivo .pth de Python en site-packages. Ejecuta código suministrado por el atacante en el siguiente arranque del intérprete.
  • Inyección de sitecustomize.py o usercustomize.py. Se ejecuta en cada inicio de Python.
  • Sobrescritura de un módulo de Python importable en el directorio de paquetes de la aplicación. Se ejecuta en la siguiente importación o reciclaje del worker.
  • Sobrescritura del punto de entrada WSGI/ASGI (p. ej., app.wsgi, wsgi.py). Se ejecuta en la siguiente recarga del worker.
  • Drop-in de cron (/etc/cron.d/, /etc/cron.hourly/, cola de crontab del usuario) cuando el proceso tiene los privilegios necesarios. Ejecución programada.
  • Drop-in de unidad systemd o unidad de usuario (/etc/systemd/system/, ~/.config/systemd/user/). Se ejecuta en el siguiente inicio del servicio o reinicio.
  • Inyección en /etc/ld.so.preload cuando el proceso se ejecuta como root. Precarga código del atacante en cada ejecución binaria posterior.
  • Sobrescritura de archivos de inicio del shell (~/.bashrc, ~/.profile, ~/.bash_profile). Se ejecuta en el siguiente inicio de sesión interactivo del usuario de la aplicación.
  • Añadido a ~/.ssh/authorized_keys. Otorga acceso SSH persistente al host como usuario de la aplicación.

Impacto a nivel web

Descargar herramienta