CVE-2026-40261: Composer has Command Injection via Malicious Perforce Reference
Impact The Perforce::syncCodeBase() method appended the $sourceReference parameter to a shell command without proper escaping, allowing an attacker to inject arbitrary commands through a crafted source reference containing shell metacharacters. Further as in GHSA-wg36-wvj6-r67p / CVE-2026-40176 the Perforce::generateP4Command() method constructed shell commands by interpolating user-supplied Perforce connection parameters (port, user, client) without proper escaping from the source url field. Composer would execute these injected commands even if Perforce is not installed.
The source reference and url are provided as part of package metadata. Any Composer package repository can serve package metadata declaring perforce as a source type with a malicious source reference or source url. This means the vulnerability can be exploited through any package served by a compromised or malicious Composer repository. An attack does not require Perforce to be installed on the client, as Composer will attempt to execute the constructed command regardless.
This vulnerability is exploitable when installing or updating dependencies from source (--prefer-source, default when installing dev prefixed versions), even if you do not use Perforce.
Patches Fixed in Composer 2.2.27 (2.2 LTS) and 2.9.6 (mainline)
Note, the fix for the source url in the Perforce::generateP4Command() was addressed as part of the patches for GHSA-wg36-wvj6-r67p / CVE-2026-40176 in the same versions.
Workarounds
- Avoid installing dependencies from source by using --prefer-dist or the preferred-install: dist config setting. - Only use trusted Composer repositories.
Other sources
Composer is a dependency manager for PHP. Versions 1.0 through 2.2.26 and 2.3 through 2.9.5 contain a command injection vulnerability in the Perforce::syncCodeBase() method, which appends the $sourceReference parameter to a shell command without proper escaping, and additionally in the Perforce::generateP4Command() method as in GHSA-wg36-wvj6-r67p / CVE-2026-40176, which interpolates user-supplied Perforce connection parameters (port, user, client) from the source url field without proper escaping. An attacker can inject arbitrary commands through crafted source reference or source url values containing shell metacharacters, even if Perforce is not installed. Unlike CVE-2026-40176, the source reference and url are provided as part of package metadata, meaning any compromised or malicious Composer repository can serve package metadata declaring perforce as a source type with malicious values. This vulnerability is exploitable when installing or updating dependencies from source, including the default behavior when installing dev-prefixed versions. This issue has been fixed in Composer 2.2.27 (2.2 LTS) and 2.9.6 (mainline). If developers are unable to immediately update, they can avoid installing dependencies from source by using --prefer-dist or the preferred-install: dist config setting, and only use trusted Composer repositories as a workaround.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
composer/composer/composerto a version that resolves this vulnerability.Fixed in 2.2.27 - Upgrade
Upgrade
composer/composer/composerto a version that resolves this vulnerability.Fixed in 2.9.6 - Upgrade
Upgrade
composer/composerto a version that resolves this vulnerability.Fixed in 2.2.27 - Upgrade
Upgrade
composer/composerto a version that resolves this vulnerability.Fixed in 2.9.6 - Configuration
Set Composer config preferred-install to 'dist' (or use --prefer-dist) to avoid installing dependencies from source until Composer is upgraded.
Composer preferred-install = dist - Compensating control
Only use trusted Composer repositories, since any package repository can provide malicious package metadata declaring Perforce as a source type.
Event History
Frequently Asked Questions
What is the severity of CVE-2026-40261?
CVE-2026-40261 has a high severity due to the potential for command injection vulnerabilities.
How do I fix CVE-2026-40261?
To fix CVE-2026-40261, upgrade to composer/composer version 2.2.27 or 2.9.6 or later.
What versions are affected by CVE-2026-40261?
CVE-2026-40261 affects composer/composer versions between 2.0.0 and 2.2.27, and between 2.3.0 and 2.9.6.
What is the nature of the vulnerability in CVE-2026-40261?
CVE-2026-40261 allows attackers to inject arbitrary commands through a crafted source reference due to improper escaping.
Who is affected by CVE-2026-40261?
Users of composer/composer versions that fall within the specified affected ranges are at risk due to CVE-2026-40261.