<?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>FrankenPHP (&lt;= 1.12.4) - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/frankenphp--1.12.4/</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>Thu, 15 Oct 2026 22:24:45 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/frankenphp--1.12.4/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>FrankenPHP Cross-Request Session ID Leak in Worker Mode</title><link>https://feed.craftedsignal.io/briefs/2026-10-frankenphp-session-leak/</link><pubDate>Thu, 15 Oct 2026 22:24:45 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-10-frankenphp-session-leak/</guid><description>A build-time dependency issue in FrankenPHP causes cross-user session ID leakage when the PHP session extension is loaded as a shared module in worker mode.</description><content:encoded><![CDATA[<p>FrankenPHP is susceptible to a cross-user session ID leakage vulnerability when operating in worker mode. The root cause is a build-time configuration discrepancy: the internal logic designed to clear session identifiers (<code>PS(id)</code>) between requests is wrapped in a preprocessor macro <code>#ifdef HAVE_PHP_SESSION</code>. This macro is only defined if the PHP session extension is statically linked at the time FrankenPHP is compiled.</p>
<p>When FrankenPHP is deployed using packages that utilize a shared PHP session extension (common in many Linux distribution repositories), the cleanup function is excluded from the binary. Consequently, worker threads retain the session state from the previous request. If a subsequent request arrives, the <code>session_start()</code> function may reuse the stale session identifier instead of parsing the cookie provided by the current client. This results in session hijacking or cross-user data exposure, impacting any FrankenPHP worker mode deployment relying on shared-module PHP builds (v1.12.4 and earlier).</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>Attacker identifies a target server running FrankenPHP in worker mode with a shared <code>session</code> extension.</li>
<li>Attacker maintains an active session (Session A) and observes that the application uses cookie-based session tracking.</li>
<li>Attacker sends a high volume of concurrent requests to the target, alternating between their Session A and a second controlled Session B.</li>
<li>The FrankenPHP worker thread serves Request 1 for User A, leaving the session ID in <code>PS(id)</code> memory space.</li>
<li>The same worker thread processes Request 2 for User B. Because the session state was not reset, the application fails to re-read the provided cookie and instead defaults to the lingering ID from User A.</li>
<li>The server returns a response to User B that includes data or state associated with User A, confirming the cross-user leak.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>The vulnerability results in critical session exposure, where a user may be assigned an arbitrary, foreign session ID, leading to account takeover or unauthorized access to other users' data. This behavior is persistent under load in multi-worker environments. Deployment on standard Linux package manager distributions (RPM/Debian) that ship PHP as shared modules is highly likely to be affected.</p>
<h2 id="recommendation">Recommendation</h2>
<ul>
<li>Upgrade to a FrankenPHP build where the <code>session</code> extension is statically linked, such as the official static binaries or Docker images.</li>
<li>If upgrading is not immediately possible, implement an application-level workaround by calling <code>session_id('')</code> immediately after <code>session_write_close()</code> in the worker loop to force a re-read of session cookies on the next request.</li>
<li>Audit current environment deployment configurations to determine if the <code>session</code> extension is loaded as a shared module via <code>conf.d</code> or statically compiled into the PHP-ZTS binary.</li>
</ul>
]]></content:encoded><category domain="severity">high</category><category domain="type">advisory</category><category>web-application</category><category>session-management</category><category>vulnerability</category></item></channel></rss>