GHSA-3xjv-pmf2-gf2q

Suggest an improvement
Source
https://github.com/advisories/GHSA-3xjv-pmf2-gf2q
Import Source
https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-3xjv-pmf2-gf2q/GHSA-3xjv-pmf2-gf2q.json
JSON Data
https://api.osv.dev/v1/vulns/GHSA-3xjv-pmf2-gf2q
Aliases
  • CVE-2026-42549
Published
2026-05-06T21:34:39Z
Modified
2026-05-06T21:59:15.193300Z
Severity
  • 4.4 (Medium) CVSS_V3 - CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L CVSS Calculator
Summary
Flight has path traversal in `make:controller` CLI that creates arbitrary directories outside project root
Details

Summary

The make:controller CLI command calls mkdir(..., recursive: true) on a path built from the user-supplied controller name, before Nette's class-name validation runs. The class-file write is correctly rejected by Nette when the name contains /, but the recursive directory creation side effect is already committed — including directories located outside the project root through ../ traversal.

Affected code

flight/commands/ControllerCommand.php (≈ 63-66):

if (is_dir(dirname($controllerPath)) === false) {
    $io->info('Creating directory ' . dirname($controllerPath), true);
    mkdir(dirname($controllerPath), 0755, true);   // un-normalized, runs before validation
}

Proof of concept

$ php vendor/flightphp/runway/runway make:controller '../../../../tmp/CONTROLLER_TRAVERSAL_TEST/pwn'
Creating directory .../app/controllers/../../../../tmp/CONTROLLER_TRAVERSAL_TEST
Nette\InvalidArgumentException: Value '../../../../tmp/CONTROLLER_TRAVERSAL_TEST/pwnController' is not valid class name.

$ ls /home/user/tmp/CONTROLLER_TRAVERSAL_TEST
(directory exists — created before the exception was thrown)

Impact

  • Arbitrary directory creation outside the project root, executable by any local actor that can run the Flight CLI (developer machine, shared CI build agent, compromised dev container).
  • Primes log-file planting for chained LFI exploitation (e.g. creating a directory where an attacker can later drop a .php file to be included via a distinct template-include weakness).
  • On Windows, the \ separator opens additional traversal surface.

Patch (fixed in 3.18.1, commit b8dd23a)

The controller name is now normalized with basename() and validated against ^[A-Za-z_][A-Za-z0-9_]*$ before any mkdir side effect runs.

Credit

Discovered by @Rootingg.

Database specific
{
    "github_reviewed": true,
    "github_reviewed_at": "2026-05-06T21:34:39Z",
    "cwe_ids": [
        "CWE-22"
    ],
    "severity": "MODERATE",
    "nvd_published_at": null
}
References

Affected packages

Packagist / flightphp/core

Package

Name
flightphp/core
Purl
pkg:composer/flightphp/core

Affected ranges

Type
ECOSYSTEM
Events
Introduced
0Unknown introduced version / All previous versions are affected
Fixed
3.18.1

Affected versions

v1.*
v1.0
v1.1
v1.1.5
v1.1.10
v1.2
v1.2.13
v1.2.14
v1.2.15
v1.2.17
v1.2.18
v1.2.19
v1.2.20
v1.2.21
v1.2.22
v1.3.0
v1.3.1
v1.3.2
v1.3.3
v1.3.4
v1.3.5
v1.3.7
v1.3.8
v1.3.9
v2.*
v2.0.0
v2.0.1
v3.*
v3.0.0
v3.0.1
v3.0.2
v3.1.0
v3.1.1
v3.2.0
v3.3.0
v3.4.0
v3.4.1
v3.4.2
v3.5.0
v3.5.2
v3.5.3
v3.6.0
v3.6.1
v3.6.2
v3.7.0
v3.7.1
v3.7.2
v3.8.0
v3.8.1
v3.9.0
v3.10.0
v3.10.1
v3.11.0
v3.11.1
v3.12.0
v3.13.0
v3.13.1
v3.14.0
v3.15.0
v3.15.1
v3.15.2
v3.15.3
v3.16.0
v3.16.1
v3.17.0
v3.17.1
v3.17.2
v3.17.3
v3.17.4
v3.18.0

Database specific

source
"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-3xjv-pmf2-gf2q/GHSA-3xjv-pmf2-gf2q.json"