Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain file-write access via app
-
DeliverySubmit filename with malformed UTF-8 + ANSI escapes
-
ExploitBypass CorruptedPathDetected normalizer check
-
ExecutionFilesystem::write() persists tainted name
-
PersistAdmin runs listContents() in terminal
-
ImpactEscape sequences hide/spoof listing
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Escape character neutralization
|
| Exploitation Conditions | Requires all of the following: (1) the attacker can write a file whose name they control through a Flysystem-backed operation (Filesystem::write()), i.e. some authenticated or exposed write path (PR:L); (2) the crafted filename contains malformed UTF-8 that makes PCRE's preg_match with the u modifier return false, combined with control/ANSI escape bytes - this is what bypasses the pre-3.35.3 WhitespacePathNormalizer check in src/WhitespacePathNormalizer.php; and (3) an administrator subsequently renders Filesystem::listContents() output in an ANSI-interpreting terminal (UI:R) for the escape sequences to have any effect. Limiting factors: only the default WhitespacePathNormalizer versions before 3.35.3 are affected, impact is confined to spoofed/hidden terminal listings (no code execution, no data disclosure), and the payload has no effect if listings are viewed in a sanitized UI or non-terminal context. |
| Impact | This is a genuinely low-severity issue and the signals are internally consistent. The vendor CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:L/A:N = 3.5) correctly captures a limited-integrity flaw with no confidentiality or availability impact: the only consequence is that control characters and ANSI escape sequences survive path normalization and can be written into stored filenames, then rendered when an administrator lists directory contents in a terminal. Exploitation requires the attacker to already have file-write privileges through the application (PR:L) AND requires an out-of-band human action - an admin viewing the listing in an ANSI-capable terminal (UI:R). There is no EPSS score, no CISA KEV listing, and no public exploit code provided in the intelligence, so this is 'no public exploit identified at time of analysis.' The root cause is confirmed by the vendor advisory (GHSA-cxf4-7mrp-vvpr) and the commit diff, which shows the exact bug: preg_match('#\p{C}+#u', ...) returns false on malformed UTF-8, and the original code treated both false and 0 as 'no control chars found,' letting malformed-UTF-8-plus-control-char paths bypass CorruptedPathDetected::forPath(). Despite Flysystem's ubiquity in the PHP ecosystem, the narrow trigger (write access + terminal display + malformed UTF-8) and cosmetic/spoofing impact make this a low real-world priority, not a high-urgency item. The 'Authentication Bypass' tag is inaccurate and overstates the nature of the flaw. |
| Exploit ScenarioDerived | An attacker with the ability to write files through a Flysystem-backed feature (e.g. a user upload or a filename they control) crafts a filename containing malformed UTF-8 followed by control/ANSI escape bytes (as in the regression test's 'foo\x80\x1bbar'). Because the normalizer fails to reject it, Filesystem::write() stores the name and Filesystem::listContents() later returns the raw escape sequences; when an administrator inspects the listing in a terminal, the escapes execute, hiding or spoofing filenames. No public exploit code is identified, and successful abuse depends on the admin viewing output in an ANSI-interpreting terminal. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 29, 2026
Malformed UTF-8 in a filename can bypass the control-character check performed by Flysystem's default WhitespacePathNormalizer before version 3.35.3, letting a filename containing ANSI escape sequences survive normalization and be stored via Filesystem::write(). When an administrator later renders Filesystem::listContents() output in an ANSI-interpreting terminal, those sequences can hide or spoof entries in the listing, giving a malicious write-capable user (PR:L) a terminal-output deception primitive with UI:R. The issue is confined to spoofed or hidden directory listings - there is no code execution, no data disclosure, and no integrity impact beyond the stored filename itself; no public exploit code has been identified at time of analysis and there is no confirmed active exploitation, and the CVSS 3.5 score reflects the low overall risk.
RemediationAI
Upgrade the thephpleague/flysystem Composer dependency to 3.35.3 or later, which is the vendor-released fix containing commit ef4a9a557d769b5d472c403125716706a0d9cc77 (see https://github.com/thephpleague/flysystem/releases/tag/3.35.3 and the advisory https://github.com/thephpleague/flysystem/security/advisories/GHSA-cxf4-7mrp-vvpr); because the patch is confined to src/WhitespacePathNormalizer.php, no adapter or storage backend changes are required. If an immediate upgrade is not possible, the most direct compensating control is to register a custom path normalizer that fails closed on invalid UTF-8 - for example one that tests mb_check_encoding()/preg_last_error() and rejects the path instead of relying on a truthiness check - which closes the bypass with the trade-off that a few legitimate non-UTF-8 filenames may now be rejected. As an additional control, validate or strip control and ANSI escape bytes from user-supplied filenames before calling Filesystem::write(), and render Filesystem::listContents() output through a sanitizer or a non-ANSI-interpreting viewer (piped through cat -v, a web UI, or an editor) rather than a raw terminal; these measures reduce but do not eliminate the risk if untrusted writers still control stored names, and they add an escaping/encoding step that may alter displayed output. Since the impact is limited to spoofed terminal listings, deprioritize this behind higher-severity findings, but do eliminate bypass-capable write paths for unprivileged users where practical.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in composer, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Flysystem is an open source file storage abstraction library for PHP, and its default path normalizer lives in src/WhitespacePathNormalizer.php. That class validates paths with preg_match('#\p{C}+#u', $unixPath), where the \p{C} Unicode property class matches control and other non-printable codepoints and the u modifier tells PCRE to interpret the subject as UTF-8. When the subject string is not valid UTF-8, PCRE fails and preg_match() returns false rather than an integer; pre-3.35.3 code used the return value directly in a boolean context, so both a legitimate 'no match' (0) and a PCRE error (false) took the same falsy branch and the CorruptedPathDetected::forPath() exception was never thrown. A path that mixes malformed UTF-8 bytes with real control characters therefore escaped detection and was written verbatim by Filesystem::write(), later re-emerging raw from Filesystem::listContents(). This is CWE-150 (Improper Neutralization of Escape, Meta, or Control Sequences) rather than an authentication flaw, despite the 'Authentication Bypass' tag attached to the upstream record; the authoritative assessment is a low-severity integrity/UI issue scoped to terminal rendering, not a privilege or access-control bypass. The fix in commit ef4a9a55 changes the guard to compare the result explicitly ($match !== 0), so PCRE errors are no longer treated as 'no control characters found', and the accompanying test case adds a payload such as "foo\x80\x1bbar" covering the malformed-UTF-8-plus-escape combination.
Know when Flysystem gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:L/A:N
Attacker needs app-level write access (PR:L) and an admin to view listings in a terminal (UI:R); impact is limited integrity/spoofing only (I:L, C:N, A:N).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Flysystem is an open source file storage library for PHP. Prior to 3.35.3, the default WhitespacePathNormalizer in src/WhitespacePathNormalizer.php used by Filesystem across adapters calls preg_match with the u modifier and treats both false and 0 as falsy. A path containing malformed UTF-8 causes PCRE to return false, so paths that also contain control characters bypass CorruptedPathDetected::forPath() in normalizePath(). Filesystem::write() can store such names and Filesystem::listContents() can return the raw ANSI escape sequences, allowing hidden or spoofed terminal file listings when an administrator displays them. This issue is fixed in version 3.35.3.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
EUVD-2026-88998
GHSA-cxf4-7mrp-vvpr
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB