Skip to main content

guzzlehttp/psr7 CVE-2026-55766

| EUVDEUVD-2026-38458 MEDIUM
Improper Neutralization of CRLF Sequences ('CRLF Injection') (CWE-93)
2026-06-19 https://github.com/guzzle/psr7 GHSA-vm85-hxw5-5432
4.8
CVSS 3.1 · Vendor: https://github.com/guzzle/psr7
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Supply CR/LF in HTTP method, version, or reason phrase
  2. Delivery
    Application stores value in PSR-7 object without sanitization
  3. Exploit
    Application serializes PSR-7 message to raw HTTP/1.x via Message::toString()
  4. Execution
    Injected CRLF creates synthetic header boundary in serialized bytes
  5. Persist
    Downstream HTTP parser interprets injected bytes as legitimate headers
  6. Impact
    Header 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 Message::toString(), an equivalent serializer, or by reparsing a malformed raw message through Message::parseRequest()/Message::parseResponse() and then re-emitting it. Third, the serialized bytes must be consumed by a downstream HTTP/1.1 component that does not independently reject malformed start lines. The vendor explicitly states that applications using guzzlehttp/psr7 only through Guzzle's standard high-level HTTP client APIs are not expected to be affected, since those code paths do not expose start-line fields to untrusted input in the serialization pathway. Exploitation is therefore limited to custom transports, proxying, crawling, webhook delivery, raw message forwarding, or test harnesses - not typical application HTTP client usage. The CVSS AC:H metric reflects these compound preconditions.

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 X-Forwarded-For: attacker-host to an endpoint that stores the method in a PSR-7 Request object and then forwards it by calling Message::toString() over a keep-alive connection to an upstream server. The upstream HTTP/1.1 parser, processing the serialized bytes, interprets the injected CRLF as a header boundary and treats X-Forwarded-For: attacker-host as a legitimate header, enabling header spoofing or, in a shared-connection context, request smuggling that desynchronizes the upstream parser and poisons the request queue for subsequent users. No public exploit code has been identified at time of analysis, but the attack pattern is well-understood from prior CRLF injection research.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

psr7 < 2.12.1

Affected Packages

composer guzzlehttp/psr7 fix: 2.12.1
euvd psr7 fix: 2.12.1

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

Vendor (https://github.com/guzzle/psr7) PRIMARY 4.8 MEDIUM
AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N
vuln.today AI 4.8 MEDIUM

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.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (https://github.com/guzzle/psr7).

CVSS VectorVendor: https://github.com/guzzle/psr7

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
Low
Integrity
Low
Availability
None

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

EPSS Score
0.2%
Top 95% exploitable
Threat Intel
1
1 sources
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

24
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +24
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Code Injection CRITICAL

Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy