Laravel Supply Chain Attack Backdoors 5,561 Repos: Git Tag Rewrite Defeats Version Pinning

Attackers poisoned 700 version tags in 15 minutes; the backdoor fires automatically on every app startup.

Laravel Lang
Laravel Lang Github

On the night of May 22, 2026, an unidentified attacker with push access to the Laravel-Lang GitHub organization rewrote every existing version tag across four widely used PHP localization packages — delivering a credential-stealing backdoor to any developer or CI/CD pipeline that ran composer update or performed a fresh install after 22:32 UTC. Security firm StepSecurity, which confirmed end-to-end exploitation in an isolated test runner, reported that within six hours more than 5,561 downstream GitHub repositories had been backdoored. If your application uses any of the four affected laravel-lang packages and you ran a Composer install or update during that window, every cloud key, database password, and CI token accessible from that environment must be treated as compromised and rotated immediately.

The attack exposed a structural gap in standard supply chain hygiene: version pinning — the widely recommended practice of locking a dependency to a specific release number — offered no protection, because the content behind those version tags had been silently replaced.

What Packages Were Compromised in the Laravel-Lang Attack?

The four affected packages are laravel-lang/lang, laravel-lang/http-statuses, laravel-lang/attributes, and laravel-lang/actions — community-maintained localization libraries that translate error messages, validation strings, and UI labels into dozens of languages for applications built on Laravel and Symfony. They are not part of the official Laravel framework but are widely adopted across enterprise and open-source PHP projects. The flagship package, laravel-lang/lang, carries more than 7,800 GitHub stars and had 502 version tags — each of which was rewritten during the attack.

Aikido Security, which first detected the compromise on May 22 and immediately reported it to the Laravel-Lang maintainers and to Packagist, confirmed 233 backdoored versions across three of the four repositories. Socket Security, whose independent analysis covered historical tags more broadly, placed the total at more than 700 affected versions. Packagist responded by removing the malicious versions and temporarily unlisting all four packages to prevent further installations on May 23.

No CVE has been assigned as of publication. The attack targeted the packages' release infrastructure — not their source code — which means any automated scanning tool that checks only committed code would see nothing wrong.

Git Tag Poisoning: Why Version Pinning Failed

The technical mechanism that made this attack so difficult to detect exploits a largely overlooked property of GitHub's tagging system. Standard supply chain guidance tells developers to pin dependencies to a specific version number to prevent surprise updates from injecting malicious code. That protection assumes a version tag is immutable once published. It is not.

Git tags are mutable references. GitHub permits a maintainer — or an attacker with sufficient push access — to force-rewrite any existing tag to point at an entirely different commit. Composer, PHP's de facto package manager, resolves a version constraint by checking the latest matching tag on the upstream repository and downloading the commit it points to at that moment. Composer performs no cryptographic verification of the commit, and makes no comparison against any previously recorded hash for that tag.

The result, as Socket's research team explained in its disclosure, is that a composer.lock file pinned to a version downloaded before 22:32 UTC on May 22 was safe only if the developer ran composer install against that existing lockfile without ever re-resolving dependencies. Anyone who ran composer update, or performed a fresh install that re-fetched version constraints against the current state of the repository, pulled the backdoored code with no warning.

GitHub does display a subtle indicator on each rewritten tag: a banner reading "This commit does not belong to any branch on this repository." Under normal circumstances that warning would almost certainly go unread by automated tooling and most developers.

Composer Backdoor: Boot-Time Credential Theft

Every malicious commit across all four repositories shared an identical structure and a fake author identity — Your Name <you@example.com> — and made the same two-file modification: an entry added to composer.json and a new file placed at src/helpers.php. StepSecurity's full technical analysis details the complete kill chain from initial tag rewrite to credential exfiltration.

The src/helpers.php file was registered in the autoload.files directive in each package's composer.json, which instructs Composer to load the file automatically whenever an application initializes its vendor autoloader. Because every Laravel and Symfony application calls require vendor/autoload.php on startup — the very first thing any PHP application does — the payload executed without any user interaction, without any unusual function call, and without leaving any obvious trace in application code. Simply starting the application was enough to fire it.

The dropper reached out to the attacker-controlled domain flipboxstudio.info — a typosquat of the legitimate flipboxstudio.com — to fetch a second-stage payload. On Windows environments, the dropper delivered a Visual Basic Script launcher executed via cscript. On Linux and macOS, it executed the stealer via exec(). The payload generated a unique per-host marker — an MD5 hash combining the directory path, system architecture, and file inode — to ensure it fired only once per machine, reducing the risk of detection through repeated activity.

StepSecurity, which detonated the laravel-lang/http-statuses v3.4.5 tag in a fully instrumented GitHub Actions runner, confirmed the full credential-exfiltration sequence. The stealer targeted AWS access keys and IAM role documents, GitHub personal access tokens, Slack and Stripe API keys, SSH keys and host certificates, .env files, JSON Web Tokens, Kubernetes service account tokens, HashiCorp Vault tokens, and cryptocurrency wallet recovery phrases. Researchers also noted that binary symbols in the Windows-stage binary referenced a username — Mero — and the string "claude," suggesting possible AI tooling involvement in the malware's development.

Part of PHP Ecosystem's Worst Month for Supply Chain Attacks

The Laravel-Lang incident did not emerge in isolation. May 2026 has produced an unprecedented cluster of supply chain attacks across multiple package ecosystems in rapid succession.

On May 11, an attacker chained three GitHub Actions vulnerabilities — a "Pwn Request" pattern, cache poisoning across fork boundaries, and runtime memory extraction of an OIDC token — to publish 84 malicious versions across 42 TanStack packages. The attack, attributed by StepSecurity to a threat group called TeamPCP and designated CVE-2026-45321, spread within hours to Mistral AI, UiPath, OpenSearch, and Guardrails AI. It became the first documented case of a malicious npm package carrying valid cryptographic SLSA provenance certificates. OpenAI disclosed that two employee devices were impacted. On May 19, more than 300 malicious versions of AntV data visualization packages appeared on npm in a 22-minute window.

Four confirmed supply chain campaigns across npm, PyPI, and Composer in eleven days — each with a different initial access vector, each ending the same way: credentials exfiltrated to attacker-controlled infrastructure within minutes of package installation.

Researchers have noted a further dimension to the TanStack worm campaign: the malware persisted itself inside developer tool configuration directories — including .claude/ — reflecting attackers' growing interest in AI coding assistant environments as a propagation surface.

How to Tell Whether Your Application Is Affected

Security researchers from StepSecurity, Aikido Security, and Snyk have published consistent guidance for any team that uses PHP and may have had the four packages installed.

Search your composer.json and composer.lock files for any of the four package names: laravel-lang/lang, laravel-lang/http-statuses, laravel-lang/attributes, and laravel-lang/actions. If any are present, determine whether your environment ran composer install or composer update at any point between 22:32 UTC on May 22 and approximately midday on May 23, 2026. Any environment that did must be treated as compromised.

Audit network logs from the build machine, CI runner, or container image for outbound connections to flipboxstudio.info. That domain is the definitive indicator of compromise; Aikido and Socket both reported it was still resolving actively at the time of their disclosures.

Inspect the installed vendor directory for the presence of a file at vendor/laravel-lang/*/src/helpers.php. That file has no business existing in any legitimate installation of these packages.

What Credentials to Rotate Now

Because the malware targeted credentials accessible at the moment of application startup — which in a CI/CD pipeline means every secret injected into that pipeline run — the rotation scope is broad:

Rotate AWS, Google Cloud Platform, and Azure access keys and IAM role credentials immediately. GitHub personal access tokens, deploy keys, Kubernetes service account tokens, and HashiCorp Vault tokens should be cycled at the same time. Any Slack, Stripe, or other third-party API keys accessible from the affected machine, database connection strings and passwords, .env file secrets, OAuth client secrets, SSH host and user certificates, and any cryptocurrency wallet recovery phrases reachable from the build environment are all in scope.

Pin future dependency installs to a commit SHA predating 22:32 UTC on May 22 — verified against a local repository clone or the Packagist distribution mirror — rather than relying on a version tag. Block flipboxstudio.info at the DNS resolver and firewall egress level.

Git Tag Immutability: Structural Gap Package Managers Must Close

The Laravel-Lang attack exposed a limitation that version pinning was not designed to address. Neither GitHub nor Composer enforces tag immutability by default. Composer does not record the commit hash it observed the first time a tag was resolved, and does not check whether that hash has changed in subsequent installs. Until package registries enforce tag immutability or require cryptographically signed commits — and until package managers verify tag-to-commit consistency against an anchored reference — there is no reliable mechanism for a developer to detect that a version they have safely used for months has been silently replaced.

The speed and cross-repository coordination of the Laravel-Lang attack — four repositories, 700-plus tags, one 15-minute window, one compromised organizational credential — represent an escalation in the targeting of open-source developer infrastructure that the PHP ecosystem, and the software supply chain community broadly, must now reckon with.


Frequently Asked Questions

What packages were affected in the Laravel supply chain attack?

The four compromised packages are laravel-lang/lang, laravel-lang/http-statuses, laravel-lang/attributes, and laravel-lang/actions — third-party PHP localization libraries used by Laravel and Symfony applications. They are not part of the official Laravel framework. Packagist temporarily unlisted all four after the attack was disclosed on May 22–23, 2026.

How do I check if my Laravel project is affected by the supply chain attack?

Search your composer.lock file for any of the four package names and determine whether you ran composer install or composer update between 22:32 UTC May 22 and midday May 23, 2026. You can also check for a file at vendor/laravel-lang/*/src/helpers.php — its presence confirms the backdoor was installed — and audit outbound network logs for any connections to flipboxstudio.info.

What credentials should I rotate after the Laravel-Lang attack?

Treat every secret accessible from the affected build environment as compromised: AWS and cloud provider keys, GitHub personal access tokens, Kubernetes service account tokens, database passwords, Slack and Stripe API keys, HashiCorp Vault tokens, SSH keys, .env file secrets, and any cryptocurrency wallet recovery phrases stored or accessible on the affected machine or in any CI/CD pipeline it ran.

Why did version pinning fail to protect against this attack?

Version pinning assumes that a package version tag always points to the same code. Git tags are mutable: an attacker with push access to a GitHub organization can force-rewrite any existing tag to point at a new, malicious commit. Composer does not verify that a tag's commit hash matches any previously recorded value, so a pinned version number provides no protection once the tag has been rewritten.

ⓒ 2026 TECHTIMES.com All rights reserved. Do not reproduce without permission.

Join the Discussion