<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><channel><title>ReactPHP - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/vendors/reactphp/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Fri, 18 Sep 2026 01:11:26 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/vendors/reactphp/feed.xml" rel="self" type="application/rss+xml"/><image><url>https://feed.craftedsignal.io/favicon-32x32.png</url><title>CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/</link><width>32</width><height>32</height></image><webfeeds:icon>https://feed.craftedsignal.io/favicon.svg</webfeeds:icon><item><title>Denial of Service via Malformed HTTP Chunked Encoding in react/http</title><link>https://feed.craftedsignal.io/briefs/2026-09-react-http-dos/</link><pubDate>Fri, 18 Sep 2026 01:11:26 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-09-react-http-dos/</guid><description>A malformed HTTP chunked body triggers an infinite loop in the react/http ChunkedDecoder, causing 100% CPU usage and service disruption in both server and client implementations.</description><content:encoded><![CDATA[<p>The ReactPHP <code>react/http</code> package (versions 0.6.0 through 1.11.0) contains a vulnerability in the <code>ChunkedDecoder::handleData()</code> method. The decoder enters an infinite loop when processing specific malformed HTTP chunked bodies, leading to a denial-of-service condition. Because ReactPHP utilizes a single-threaded event loop, this infinite loop pegs a CPU core and halts all other event processing, effectively freezing the application.</p>
<p>The vulnerability manifests in two primary scenarios:</p>
<ol>
<li>Terminal-chunk trailers where <code>strpos()</code> fails to locate a CRLF, causing the buffer to never advance.</li>
<li>Off-by-one errors after a completed chunk where two bytes slip past existing guards, causing the loop to re-enter with identical state.</li>
</ol>
<p>The vulnerability impacts both the <code>HttpServer</code> (server-side, exploitable by malicious clients) and the <code>Browser</code> component (client-side, exploitable by malicious servers). Servers protected by a reverse proxy that normalizes HTTP traffic may mitigate the server-side vector, but client-side applications fetching attacker-influenced URLs remain fully exposed.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>Attacker identifies a target application utilizing <code>react/http</code> (versions &gt;= 0.6.0, &lt;= 1.11.0).</li>
<li>For server-side attacks, the attacker crafts a malicious HTTP request with <code>Transfer-Encoding: chunked</code>.</li>
<li>Attacker includes a terminating <code>0</code> chunk followed by trailer data without a trailing <code>\r\n</code> sequence.</li>
<li>The request is passed to the <code>HttpServer</code> component and subsequently the <code>ChunkedDecoder</code>.</li>
<li><code>ChunkedDecoder::handleData()</code> enters an infinite <code>while</code> loop due to the buffer state never advancing.</li>
<li>The process hits 100% CPU usage on a single core, stalling the event loop.</li>
<li>The application stops responding to all other legitimate client requests.</li>
<li>Service availability is lost until the process is manually killed or restarted.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>Successful exploitation results in a full denial of service for the target application. Since ReactPHP is single-threaded, a single malicious request freezes the entire event loop, preventing the processing of legitimate traffic. This impacts any PHP application relying on these components for HTTP handling, including services acting as clients (Browser) that perform external fetches.</p>
<h2 id="recommendation">Recommendation</h2>
<ol>
<li>Update <code>react/http</code> to a version beyond 1.11.0.</li>
<li>If an immediate update is not feasible, implement a reverse proxy (e.g., nginx) in front of <code>HttpServer</code> to normalize incoming HTTP traffic and filter non-compliant chunked payloads.</li>
<li>Review all client-side logic using <code>React\Http\Browser</code> to ensure that responses from external services are validated or that the fetching service is isolated from core application processing.</li>
<li>Implement resource monitoring to alert on persistent 100% CPU spikes in PHP-based HTTP services.</li>
</ol>
]]></content:encoded><category domain="severity">low</category><category domain="type">advisory</category><category>denial-of-service</category><category>php</category><category>vulnerability</category></item></channel></rss>