<rss version="2.0">
  <channel>
    <title>Blog on Experience Digest</title>
    <link>https://experiencedigest.org/blog/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Sat, 23 May 2026 10:00:00 -0500</lastBuildDate>
    
    <item>
      <title>The Perforce Driver You Never Knew You Had: Composer CVE-2026-40261 and CVE-2026-40176</title>
      <link>https://experiencedigest.org/blog/2026-05-23-composer-perforce-command-injection/</link>
      <pubDate>Sat, 23 May 2026 10:00:00 -0500</pubDate>
      <guid>https://experiencedigest.org/blog/2026-05-23-composer-perforce-command-injection/</guid>
      <description>&lt;p&gt;Update Composer to 2.9.6 or 2.2.27 LTS now. If that sentence is enough, you&amp;rsquo;re done. If you want to understand why this one is worth a closer look, keep reading.&lt;/p&gt;
&lt;p&gt;Background: the Composer maintainers published &lt;a href=&#34;https://blog.packagist.com/composer-2-9-6-perforce-driver-command-injection-vulnerabilities/&#34;&gt;their own writeup of these advisories&lt;/a&gt; on the Packagist blog. The technical details and the registry-level mitigations described below come from that post; this piece is the operator&amp;rsquo;s read for commerce teams.&lt;/p&gt;
&lt;h2 id=&#34;quick-refresher-composer-drivers-and-why-perforce-is-in-there&#34;&gt;Quick Refresher: Composer, Drivers, and Why Perforce Is in There&lt;/h2&gt;
&lt;p&gt;If you don&amp;rsquo;t live in PHP-land daily, this advisory reads as opaque, so a thirty-second primer.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://getcomposer.org/&#34;&gt;Composer&lt;/a&gt; is the dependency manager every modern PHP project uses. For Magento and Adobe Commerce specifically, it is how the core platform itself ships and how every module — first-party, third-party, your own internal libraries — gets installed and updated. When a developer runs &lt;code&gt;composer install&lt;/code&gt; on a fresh Magento checkout, Composer reads &lt;code&gt;composer.json&lt;/code&gt;, resolves the dependency graph, downloads each package, and assembles &lt;code&gt;vendor/&lt;/code&gt;. When CI deploys a release, it runs the same command. There is no Magento install today that does not run Composer many times a day.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;composer.json&lt;/code&gt; lists each dependency along with where to fetch it from. Most packages come from &lt;a href=&#34;https://packagist.org/&#34;&gt;Packagist&lt;/a&gt; (the public PHP registry) or its commercial sibling &lt;a href=&#34;https://packagist.com/&#34;&gt;Private Packagist&lt;/a&gt;. But you can also point Composer directly at a source-control repository — a git URL, a mercurial repo, a subversion checkout, or a &lt;a href=&#34;https://www.perforce.com/products/helix-core&#34;&gt;Perforce&lt;/a&gt; depot. To do that, you declare a repository in &lt;code&gt;composer.json&lt;/code&gt; with a &lt;code&gt;type:&lt;/code&gt; field naming which version-control system to use. Composer ships with a &lt;strong&gt;VCS driver&lt;/strong&gt; for each supported type — &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;svn&lt;/code&gt;, &lt;code&gt;hg&lt;/code&gt;, &lt;code&gt;fossil&lt;/code&gt;, &lt;code&gt;perforce&lt;/code&gt; — that knows how to clone, list versions, and fetch source from that system.&lt;/p&gt;
&lt;p&gt;The Perforce driver is one of those bundled drivers. It exists because Perforce is the dominant version-control system in game studios, large enterprises with legacy commercial codebases, and some sectors of finance and manufacturing — places where PHP shops occasionally need to pull a package from a Perforce depot. The driver is shipped with Composer by default. &lt;strong&gt;It loads regardless of whether you have ever configured a Perforce repository.&lt;/strong&gt; That last point is the whole story of this CVE.&lt;/p&gt;
&lt;h2 id=&#34;the-perforce-driver-is-loaded-whether-you-use-it-or-not&#34;&gt;The Perforce Driver Is Loaded Whether You Use It or Not&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/composer/composer/security/advisories/GHSA-gqw4-4w2p-838q&#34;&gt;CVE-2026-40261&lt;/a&gt; and &lt;a href=&#34;https://github.com/composer/composer/security/advisories/GHSA-wg36-wvj6-r67p&#34;&gt;CVE-2026-40176&lt;/a&gt; are both in Composer&amp;rsquo;s Perforce VCS driver - the code that handles repositories declared as perforce type in a composer.json. Neither requires Perforce to be installed. Both allow arbitrary command execution in the context of whatever runs composer install or composer update.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the part the advisory buries in the third paragraph. Most Magento shops have never configured a Perforce repository and have no intention of doing so. That doesn&amp;rsquo;t matter. The vulnerable code path loads regardless, and an attacker-controlled composer.json or package metadata can reach it.&lt;/p&gt;
&lt;h2 id=&#34;two-different-attack-surfaces&#34;&gt;Two Different Attack Surfaces&lt;/h2&gt;
&lt;p&gt;CVE-2026-40176 requires the attacker to control the composer.json you&amp;rsquo;re actually running - the root manifest. The injected values are Perforce connection parameters (port, user, client) that get interpolated into shell commands without escaping. This is the local-project risk: if you&amp;rsquo;re running Composer commands on a project from an untrusted source, this fires.&lt;/p&gt;
&lt;p&gt;CVE-2026-40261 is the wider problem. It affects the syncCodeBase() method, which handles a source reference parameter that can come from &lt;em&gt;package metadata&lt;/em&gt; - not just the root composer.json. That means any Composer repository, including a compromised or malicious third-party repository, can serve package metadata that exploits this. You don&amp;rsquo;t have to touch the root manifest. You just have to install or update a dependency from source.&lt;/p&gt;
&lt;p&gt;The trigger condition: installing dev-prefixed versions (anything before 1.0.0, or packages with dev- prefix) defaults to &amp;ndash;prefer-source in Composer. Commerce agencies running Magento module development pipelines almost certainly have some dev-constraint packages in their dependency tree.&lt;/p&gt;
&lt;h2 id=&#34;what-this-means-for-a-magento-and-commerce-pipeline&#34;&gt;What This Means for a Magento and Commerce Pipeline&lt;/h2&gt;
&lt;p&gt;Enterprise commerce platforms run layered dependency graphs. The core is typically Magento/Adobe Commerce, which comes from the Magento Composer repository. Third-party modules come from a mix of Packagist, private repositories, and occasionally vendor-managed repos. Development workflows - module builds, staging deploys, CI pipelines - regularly operate with dev- constraints to pull HEAD on in-development extensions.&lt;/p&gt;
&lt;p&gt;In that environment, CVE-2026-40261 is not hypothetical. Any point in the supply chain where package metadata can be influenced - a compromised private repo, a package repository serving malicious metadata, a CI secret that got rotated too late - becomes a command injection entry point into your build environment. The build environment has access to credentials, cloud provider tokens, and staging infrastructure that production doesn&amp;rsquo;t expose directly.&lt;/p&gt;
&lt;p&gt;The patch notes say there&amp;rsquo;s no evidence of exploitation prior to publication. That&amp;rsquo;s the standard disclosure language and it&amp;rsquo;s worth taking at face value. It also doesn&amp;rsquo;t change the update calculus.&lt;/p&gt;
&lt;h2 id=&#34;packagist-and-private-packagist-already-moved&#34;&gt;Packagist and Private Packagist Already Moved&lt;/h2&gt;
&lt;p&gt;Packagist.org disabled Perforce source metadata on April 10, 2026 as a precaution. Private Packagist did the same. If your dependencies come exclusively from these sources and you&amp;rsquo;re not running &amp;ndash;prefer-source against anything that reaches Perforce metadata, your exposure was already mitigated at the registry layer.&lt;/p&gt;
&lt;p&gt;If you run Private Packagist Self-Hosted, the new release is dropping now - and you should scan your installation using the verification command the release announcement documents before relying on the registry-level mitigation.&lt;/p&gt;
&lt;h2 id=&#34;the-practical-calls&#34;&gt;The Practical Calls&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Run composer.phar self-update on every machine and CI runner that executes Composer commands. This includes local dev environments - dev machines are a vector, not just pipelines.&lt;/li&gt;
&lt;li&gt;If you can&amp;rsquo;t update immediately, &amp;ndash;prefer-dist in your installs eliminates the CVE-2026-40261 exposure by avoiding the source-fetch path. It&amp;rsquo;s a workaround, not a fix.&lt;/li&gt;
&lt;li&gt;For CVE-2026-40176: review any composer.json files you run Composer commands against and aren&amp;rsquo;t fully trust-anchored. If your dev workflow clones external projects and runs composer install on them without inspection, that&amp;rsquo;s a habit worth fixing regardless of this CVE.&lt;/li&gt;
&lt;li&gt;Audit your private Composer repositories for Perforce-type source declarations. These should not exist in commerce dependency graphs. If they do, understand why.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a straightforward dependency update with a clear fix. The reason it&amp;rsquo;s worth editorial attention is the &amp;ldquo;doesn&amp;rsquo;t affect Perforce users&amp;rdquo; misread - the relevant audience here is every team running a PHP/Composer-based build pipeline, which in the commerce world is essentially everyone.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Three Signals from November: What the Bulletins Don&#39;t Say</title>
      <link>https://experiencedigest.org/blog/2025-11-26-three-signals-from-november/</link>
      <pubDate>Wed, 26 Nov 2025 09:00:00 -0500</pubDate>
      <guid>https://experiencedigest.org/blog/2025-11-26-three-signals-from-november/</guid>
      <description>&lt;p&gt;Three items from the November 2025 bulletin queue, taken individually, look like routine security hygiene. Together they tell a different story.&lt;/p&gt;
&lt;h2 id=&#34;the-setup-xurum-is-still-running-playbooks-from-2022&#34;&gt;The Setup: Xurum Is Still Running Playbooks from 2022&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://www.akamai.com/blog/security-research/new-sophisticated-magento-campaign-xurum-webshell&#34;&gt;Xurum webshell campaign&lt;/a&gt; that Akamai documented isn&amp;rsquo;t new technique — it targets a known Magento vulnerability and deploys a sophisticated webshell that fingerprints server environment, exfiltrates payment data, and provides persistent shell access. What&amp;rsquo;s notable is that the campaign is &lt;em&gt;still running&lt;/em&gt;, which means:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A meaningful percentage of Magento installs are still unpatched against a well-documented attack chain.&lt;/li&gt;
&lt;li&gt;The attacker tooling has matured — Xurum has environment-awareness that older skimmer campaigns lacked.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The practical read for commerce ops teams: if you&amp;rsquo;re running a Magento instance and haven&amp;rsquo;t validated your patching posture against Akamai&amp;rsquo;s published indicators, do that before reading the rest of this.&lt;/p&gt;
&lt;h2 id=&#34;the-risk-that-patch-notes-dont-quantify-cve-2025-54236&#34;&gt;The Risk That Patch Notes Don&amp;rsquo;t Quantify: CVE-2025-54236&lt;/h2&gt;
&lt;p&gt;CVSS 9.1. Adobe Commerce. No user interaction required. Session takeover.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://helpx.adobe.com/security/products/magento/apsb25-88.html&#34;&gt;APSB25-88 advisory&lt;/a&gt; covers an improper input validation vulnerability affecting Adobe Commerce through 2.4.8-p2 and back to 2.4.4-p15. What the advisory doesn&amp;rsquo;t foreground: in a multi-store environment where admin sessions are long-lived (common in managed service deployments), &amp;ldquo;session takeover&amp;rdquo; means an attacker who can reach your admin panel URL has a path to full platform control without needing to know a single credential.&lt;/p&gt;
&lt;p&gt;The patch is available. The gap is the deployment window. A vulnerability that requires no user interaction closes fast in the wild once PoC code circulates — and for a CVSS 9.1 Adobe Commerce advisory, that window is short. If you&amp;rsquo;re on any affected version and your deployment pipeline adds days of testing overhead before applying security patches, that&amp;rsquo;s the thing worth fixing.&lt;/p&gt;
&lt;h2 id=&#34;the-sleeper-cve-2025-64174-and-admin-db-access-assumptions&#34;&gt;The Sleeper: CVE-2025-64174 and Admin DB Access Assumptions&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/OpenMage/magento-lts/security/advisories/GHSA-qv78-c8hc-438r&#34;&gt;Magento-lts stored XSS&lt;/a&gt; (fixed in 20.16.0) requires an admin with direct database access or control over the admin notification feed source. That sounds narrow. It isn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;In practice, multi-vendor commerce deployments frequently involve third-party integrations that touch the database directly — ETL pipelines, ERP connectors, PIM syncs. Any of those that write to notification tables or translation strings without sanitizing output are an injection vector that bypasses the application layer entirely. The &amp;ldquo;requires admin DB access&amp;rdquo; framing in the CVE undersells the real-world exposure surface.&lt;/p&gt;
&lt;h2 id=&#34;the-pattern&#34;&gt;The Pattern&lt;/h2&gt;
&lt;p&gt;All three of these point at the same underlying gap: Commerce platform security posture is often evaluated at the application layer (patches applied, WAF rules updated) while the actual attack surface extends further — into long-lived sessions, admin-adjacent integrations, and deployment lag. The bulletins report what&amp;rsquo;s been patched. The editorial job here is flagging what that means for how you run the platform.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s what this blog is for.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>