GitHub Security Advisory: GHSA-qrr6-mg7r-m243
Package: phpunit/phpunit (COMPOSER)
Severity: HIGH (CVSS 7.8)
CWE: CWE-88: Improper Neutralization of Argument Delimiters in a Command ('Argument Injection'), CWE-93: Improper Neutralization of CRLF Sequences ('CRLF Injection')
Vulnerable versions: = 13.1.5
Patched in: 13.1.6

Summary: PHPUnit has Argument injection via newline in PHP INI values that are forwarded to child processes

Details:
## Impact

PHPUnit forwards PHP INI settings to child processes (used for isolated/PHPT test execution) as `-d name=value` command-line arguments without neutralizing INI metacharacters. Because PHP's INI parser interprets `"` as a string delimiter, `;` as the start of a comment, and most importantly a newline as a directive separator, a value containing a newline is parsed by the child process as multiple INI directives.

An attacker able to influence a single INI value can therefore inject arbitrary additional directives into the child's configuration, including `auto_prepend_file`, `extension`, `disable_functions`, `open_basedir`, and others. Setting `auto_prepend_file` to an attacker-controlled path yields remote code execution in the child process.

Sources of INI values that participate in the attack:

- `<ini name="…" value="…"/>` entries in `phpunit.xml` / `phpunit.xml.dist`
- INI settings inherited from the host PHP runtime via `ini_get_all()`

### Threat Model

Exploitation requires the attacker to control the content of an INI value read by PHPUnit. In practice this means write access to the project's `phpunit.xml`, the host `php.ini`, or the PHP binary's environment. The most realistic exposure is [Poisoned Pipeline Execution](https://owasp.org/www-project-top-10-ci-cd-security-risks/CICD-SEC-04-Poisoned-Pipeline-Execution) (PPE): a pull request from an untrusted contributor that modifies `phpunit.xml` to include a newline-containing INI value, executed by a CI system that runs PHPUnit against the PR without isolation. A malicious newline is not visibly distinguishable from a legitimate value in a typical diff review.

### Affected component

`PHPUnit\Util\PHP\JobRunner::settingsToParameters()`.

## Patches

The fix has two parts:

**1. Reject line-break characters**

Because a newline or carriage return in an INI value has no legitimate use and is the primitive that enables directive injection, any PHP setting value containing `\n` or `\r` is now rejected with an explicit `PhpProcessException`. This follows the same "visibility over silence" principle applied in [CVE-2026-24765](https://github.com/sebastianbergmann/phpunit/security/advisories/GHSA-vvj3-c3rp-c85p): the anomalous state fails loudly in CI output rather than being silently sanitized, giving operators an opportunity to investigate whether it reflects tampering, environment contamination, or an unexpected upstream change.

**2. Quote remaining metacharacters**

Values containing `"` or `;`, both of which have legitimate uses (e.g., regex-valued INI settings such as `ddtrace`'s `datadog.appsec.obfuscation_parameter_value_regexp`), are wrapped in double quotes with inner `"` escaped as `\"`, so PHP's INI parser reads them as literal string contents rather than comment/delimiter tokens. Plain values are forwarded unchanged so that boolean keywords (`On`/`Off`) and bitwise expressions (`E_ALL & ~E_NOTICE`) retain their INI semantics.

## Workarounds

If upgrading is not immedi