Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSupply CR/LF in HTTP method, version, or reason phrase
-
DeliveryApplication stores value in PSR-7 object without sanitization
-
ExploitApplication serializes PSR-7 message to raw HTTP/1.x via Message::toString()
-
ExecutionInjected CRLF creates synthetic header boundary in serialized bytes
-
PersistDownstream HTTP parser interprets injected bytes as legitimate headers
-
ImpactHeader injection, response splitting, smuggling, or cache poisoning achieved
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization CRLF sequence sanitization
|
| Exploitation Conditions | Exploitation requires all three of the following conditions to be simultaneously true. First, attacker-controlled data must reach one of exactly three HTTP start-line fields - the request method, the HTTP protocol version string, or the response reason phrase; header fields are not affected because they had pre-existing validation. Second, the application must serialize the resulting PSR-7 object to raw HTTP/1.x bytes, either via |
| Impact | The NVD-assigned CVSS 3.1 score of 4.8 (AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N) is defensible: network-reachable without authentication, but AC:H correctly captures the multiple concurrent preconditions required for exploitation. Real-world risk is strongly deployment-context-dependent. Applications using only Guzzle's high-level HTTP client APIs are explicitly out of scope per vendor advisory, substantially limiting the affected population. The most exposed deployments are PHP-based reverse proxies, webhook relay services, crawlers, or test harnesses that accept external input into start-line fields and re-serialize PSR-7 messages. The potential downstream impacts - request smuggling and cache poisoning in particular - can be severe in those contexts and disproportionate to the moderate CVSS score. No EPSS score is available in the provided data, so exploitation probability cannot be quantified numerically. The vulnerability is not listed in CISA KEV, and no POC exploit code has been identified, indicating no confirmed active exploitation at time of analysis. The gap between raw CVSS and actual risk is primarily determined by whether an application's code touches the serialization pathway with untrusted start-line data. |
| Exploit ScenarioDerived | An attacker targeting a PHP webhook relay service sends an HTTP request with a crafted method string such as |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jun 19, 2026
CRLF injection in guzzlehttp/psr7 (all versions prior to 2.12.1) enables header injection, response splitting, request smuggling, or cache poisoning when attacker-controlled data reaches the HTTP start-line fields - request method, protocol version, or response reason phrase - and the resulting PSR-7 object is serialized to raw HTTP/1.x. The vulnerability is confined to the serialization pathway: standard Guzzle HTTP client usage is explicitly not affected, but proxies, crawlers, webhook delivery systems, and custom transports that call Message::toString(), Message::parseRequest(), or Message::parseResponse() and re-emit the raw bytes are at direct risk. No public exploit has been identified at time of analysis, and the vendor has released a confirmed patch in version 2.12.1.
RemediationAI
Upgrade guzzlehttp/psr7 to version 2.12.1 or later via composer update guzzlehttp/psr7; this is the vendor-confirmed fix that rejects CR/LF characters in HTTP method, protocol version, and reason phrase before storing them in PSR-7 message objects (vendor advisory: https://github.com/guzzle/psr7/security/advisories/GHSA-vm85-hxw5-5432). If immediate upgrade is not feasible, apply input sanitization at every entry point: strip or reject CR (\r) and LF (\n) from untrusted method, protocol version, and reason phrase values before passing them to PSR-7 constructors or setter methods. For raw-message parse paths, validate the raw HTTP start line before calling Message::parseRequest() or Message::parseResponse() - post-parse validation is insufficient because injected bytes are already embedded in the object. If the application uses ServerRequest::fromGlobals(), validate $_SERVER['REQUEST_METHOD'] and $_SERVER['SERVER_PROTOCOL'] for CR/LF before that call. The workaround requires covering all code paths that accept external data into start-line fields; missing a single path leaves the injection surface open, so upgrade is strongly preferred over relying solely on workarounds.
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
CWE-93 (Improper Neutralization of CRLF Sequences) describes the root cause: HTTP/1.x uses bare CR (\r) and LF (\n) as structural delimiters between headers and between the start line and header block, so permitting these characters inside a start-line field allows an attacker to synthesize additional header lines in the serialized output. The affected package is guzzlehttp/psr7 (Composer package pkg:composer/guzzlehttp_psr7), a widely-deployed PHP implementation of the PSR-7 HTTP Message Interface standard. Prior to 2.12.1, the library applied CR/LF validation to header name and value fields but omitted equivalent checks for three start-line components: the HTTP method, the protocol version string, and the response reason phrase. The flaw surfaces through both construction paths (new Request(...), new Response(...)) and parse paths (Message::parseRequest(), Message::parseResponse()), as well as ServerRequest::fromGlobals() when $_SERVER values are attacker-influenced.
Know when the next one hits your stack
- 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:H/PR:N/UI:N/S:U/C:L/I:L/A:N
Network-reachable without authentication (AV:N/PR:N), but AC:H reflects three mandatory concurrent preconditions; integrity and confidentiality limited to header-level manipulation with no availability impact.
Primary rating from Vendor (https://github.com/guzzle/psr7).
CVSS VectorVendor: https://github.com/guzzle/psr7
DescriptionCVE.org
Impact
guzzlehttp/psr7 did not reject CR/LF characters in certain first-party HTTP start-line fields: the request method, protocol version, and response reason phrase. If an application placed attacker-controlled data into one of those fields and later serialized the PSR-7 message as raw HTTP/1.x, for example with Message::toString() or an equivalent serializer, the serialized message could contain attacker-controlled header lines. The issue can also be reached through Message::parseRequest() or Message::parseResponse() when malformed raw messages are parsed into first-party PSR-7 objects and then serialized again.
Creating or modifying a Request, Response, or other PSR-7 object alone is not sufficient. The issue requires the malformed message to be serialized and written to the network, forwarded, replayed, or otherwise processed by software that does not independently reject the malformed start line. This is not the normal request-sending path used by guzzlehttp/guzzle; applications using guzzlehttp/psr7 only through Guzzle's standard HTTP client APIs are not expected to be affected.
Applications are most likely to be affected when they manually serialize PSR-7 messages, forward raw HTTP messages, or use custom transports, proxying, crawling, webhook delivery, testing, or similar code. Depending on how downstream HTTP/1.1 components parse the serialized message, this may lead to header injection, response splitting, request smuggling, or cache poisoning.
Patches
The issue is patched in 2.12.1 and later. Starting in that release, guzzlehttp/psr7 rejects CR/LF characters in HTTP method, protocol version, and response reason phrase values before storing them in first-party message objects.
Workarounds
If you cannot upgrade immediately, reject CR/LF in untrusted method, protocol version, and reason phrase values before constructing or modifying PSR-7 messages.
Applications that parse, forward, replay, or serialize raw HTTP messages cannot work around the parser entry points by validating only after parsing. They should validate the raw start line before calling Message::parseRequest() or Message::parseResponse(), avoid reparsing untrusted raw messages, or upgrade. If an application runs with attacker-controlled synthetic $_SERVER values, validate REQUEST_METHOD and SERVER_PROTOCOL before calling ServerRequest::fromGlobals().
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
Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.
EUVD-2026-38458
GHSA-vm85-hxw5-5432
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB