🛡️ CVE-2026-55825 — contao
Description
Contao: Possible path traversal in job download URIs
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:
```text
<authorized-job>/../<victim-job>/debug_log.csv
```
canonicalizes to:
```text
<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 inidentifier. - 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 aFilesystemItem. - 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.
How this vulnerability can be exploited
This issue can be reached over the network, attack complexity is high, an attacker needs low-level privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality low, integrity none, availability none.
Weakness class
CVE-2026-55825 is classified as CWE-22: Path Traversal. A file path built from user input is not confined to the intended directory, letting an attacker reach files elsewhere on the filesystem.
Affected software
CVE-2026-55825 is recorded against 3 packages.
- contao/contao (from 5.7.0 up to 5.7.7)
- contao/core-bundle (from 5.7.0 up to 5.7.7)
- unknown
Timeline and source
Published on 6 August 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.
References
github.com (Web)
nvd.nist.gov (Advisory)
contao.org (Web)
github.com (Web)
github.com (Web)
github.com (Package)
Details
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:L/I:N/A:N
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| contao/contao | 5.7.0 | 5.7.7 |
| contao/core-bundle | 5.7.0 | 5.7.7 |
| unknown | — | — |
Similar Threats
- Low CVE-2026-55824
- Medium CVE-2025-57756
- Medium CVE-2025-57757
- Medium CVE-2025-57758
- Medium CVE-2025-57759
More CVE 2026 advisories
Browse all of CVE 2026 in the advisory index.
Free Vulnerability Check
Is your site affected by CVE-2026-55825?
BotEraser helps you identify potentially vulnerable plugins and themes by checking your installation against CVE-2026-55825 and other known CVE records.
Scan My Site Free →No credit card required · Results in minutes
ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.