Baja

Contao: Possible path traversal in job download URIs

  • Publicada: 06.08.2026
  • Actualizado: 11.10.2026 10:22

Summary

An authenticated backend user who can access one job can request an attachment identifier containing ../ segments and make the job attachment download endpoint read a file from another job directory inside var/job-attachments.

The controller authorizes only the jobUuid route parameter. The later attachment lookup joins that authorized job UUID with the attacker-controlled identifier, then passes the combined path to the virtual filesystem. VirtualFilesystem::resolve() canonicalizes the whole path and only rejects paths that escape the filesystem mount, so authorized-job/../victim-job/debug_log.csv becomes victim-job/debug_log.csv.

This is a cross-job authorization bypass for known job attachment paths. It is not a practical brute-force against unknown jobs because job directories are UUID v4 values.

Root Cause

JobsController::downloadJobAttachment() checks access to the route jobUuid before loading the attachment:

php
$job = $this->jobs->getByUuid($jobUuid);

if (!$job || !$this->jobs->hasAccess($job)) {
    throw $this->createNotFoundException();
}

$attachment = $this->jobs->getAttachment($jobUuid, $identifier);

Jobs::getAttachment() then resolves a path built from the authorized job UUID and the attacker-controlled identifier:

php
$fileItem = $this->jobAttachmentsStorage->get($this->getAttachmentIdentifier($job, $identifier));
php
return $job->getUuid().'/'.$identifier;

VirtualFilesystem::resolve() canonicalizes the combined path. It rejects absolute paths and paths that start with .., but it does not preserve the authorized job directory as a boundary:

php
$path = Path::canonicalize($location);

if (str_starts_with($path, '..')) {
    throw new \OutOfBoundsException(...);
}

return Path::join($this->prefix, $path);

Therefore:

<authorized-job>/../<victim-job>/debug_log.csv

canonicalizes to:

<victim-job>/debug_log.csv

which remains inside the job-attachments filesystem mount and is accepted.

Recommended Fix

Treat the attachment identifier as a filename, not a path:

  • Reject /, \, NUL, and dot-segment components in identifier.
  • Add a route requirement that prevents slashes in {identifier} if nested attachment paths are not intended.
  • After resolving, assert the canonical relative path starts with <authorized-job-uuid>/ before returning a FilesystemItem.
  • Apply the same identifier validation in Jobs::addAttachment() so future producers/extensions cannot write outside the owning job directory.

Impact

A low-privileged backend user can read another job's attachment if they know or obtain the target job UUID and attachment filename. Built-in crawler jobs attach CSV logs such as debug_log.csv, broken-link-checker_log.csv, and search-index_log.csv, which can contain crawled URLs, referring URLs, tags, and error messages.

Software afectado

Haz clic en una tecnología para ver todas sus vulnerabilidades.

PlataformaPaqueteVersiones vulnerablesCorregida en
Paquete de Composer contao/contao >= 5.7.0, < 5.7.7 5.7.7
Paquete de Composer contao/core-bundle >= 5.7.0, < 5.7.7 5.7.7

Referencias

Puntuación CVSS 3.1/10
Vector CVSS
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N
Debilidad (CWE)
CWE-22
Plataforma
Composer
Paquete
contao/contao, contao/core-bundle
Publicada
06.08.2026
Actualizado
11.10.2026 10:22

Fuentes y licencias

OSV / GitHub Advisory Database - GHSA-grm4-wm43-9jh5 - CC BY 4.0

Historial de vulnerabilidades: contao/contao

Todas las vulnerabilidades publicadas de este paquete (Paquete de Composer), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.

Todas (25) en el archivo
Entradas en total
25
Primera → última
12.2019 09.2026
Sin corrección
0
Explotada en ataques
0

Distribución por gravedad

  • Crítica 4
  • Alta 6
  • Media 12
  • Baja 3

Divulgaciones por año

  1. 2019: 3
  2. 2020: 1
  3. 2021: 4
  4. 2022: 9
  5. 2023: 1
  6. 2024: 0
  7. 2025: 4
  8. 2026: 3
Gravedad:
  1. Contao: Possible path traversal in job download URIs esta entrada
    Baja · 3.1 CVE-2026-55825 >= 5.7.0, < 5.7.7 5.7.7
  2. Alta · 8.8 CVE-2023-29200 >= 4.9.0, < 4.9.40, >= 4.13.0, < 4.13.21, >= 5.1.0, < 5.1.4 4.9.40, 4.13.21, 5.1.4
  3. Crítica · 9.8 CVE-2019-11512 >= 4.1.0, < 4.4.39, >= 4.5.0, < 4.7.5 4.4.39, 4.7.5
  4. Crítica · 9.8 CVE-2017-16558 >= 3.0.0, <= 3.5.30, >= 4.0.0, < 4.4.8 4.4.8
  5. Alta · 7.2 CVE-2022-24899 >= 4.13.0, < 4.13.3 4.13.3
  6. Alta · 8.8 CVE-2019-10642 >= 4.7.0, < 4.7.3 4.7.3
  7. Crítica · 9.8 CVE-2019-10641 >= 4.0.0, < 4.4.37, >= 4.5.0, < 4.7.3 4.4.37, 4.7.3
  8. Alta · 8.8 CVE-2017-10993 >= 4.0.0, < 4.4.1 4.4.1
  9. Crítica · 9.8 CVE-2019-10643 >= 4.7.0, < 4.7.3 4.7.3
  10. Alta · 8.0 CVE-2021-37627 >= 4.0.0, < 4.4.56, >= 4.5.0, < 4.9.18, >= 4.10.0, < 4.11.7 4.4.56, 4.9.18, 4.11.7
  11. Alta · 8.8 CVE-2019-19745 >= 4.0.0, < 4.4.46, >= 4.5.0, < 4.8.6 4.4.46, 4.8.6

Identifica las vulnerabilidades de tu aplicación

Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.