Open Source · · 1 day
laravel-lang Packagist packages re-tagged from a compromised org credential
An attacker with push access to Laravel-Lang rewrote every tag in lang, attributes, actions, and http-statuses to commits that autoloaded a credential stealer through composer. The dropper fetched a PHP second stage from flipboxstudio.info and exfiltrated runner environment data.
Late on May 22, 2026, an attacker with push access to the Laravel-Lang GitHub organization rewrote every version tag on four widely used Laravel translation packages, planting a credential stealer that ran on the next composer update for downstream applications.
Laravel-Lang publishes Laravel translation packages on Packagist, the central Composer package index. Four repositories under the organization back four Composer packages: lang, attributes, actions, and http-statuses. Between 22:32 and 23:24 UTC on May 22, researchers at StepSecurity said the attacker rewrote every tag across all four, 502 on the lang repository alone and smaller numbers in proportion to the others. Each malicious commit was authored as Your Name <[email protected]> and changed two files, composer.json and a new src/helpers.php. Identical diffs and the same fake author string across all four repositories pointed StepSecurity to a single compromised organization-wide push credential. An earlier Aikido report had described the delivery as a fork-tag pattern; StepSecurity's git evidence ruled that out. A malware researcher at Aikido filed the compromise directly with the maintainers, urging them to rotate credentials and delete the new tags.
The composer.json change appended src/helpers.php to the autoload.files array. Composer includes every file on that list whenever an application loads vendor/autoload.php, the standard Laravel boot path, so no individual call site needed to import the helper. Any composer update, or any composer install without a pre-attack lockfile, resolved each version constraint to the new tag SHA and executed the helper on the next request, and on every request the application served afterward. Pre-attack lockfiles were safe until they were refreshed. The dropper assembled its C2 hostname at runtime from character codes to avoid plain-text strings, fetched a second stage from flipboxstudio.info, a typosquat of the legitimate flipboxstudio.com, over TLS with certificate verification disabled and a spoofed Mozilla User-Agent, wrote it under sys_get_temp_dir()/.laravel_locale/, executed it in a detached process, and unlinked itself from disk. A per-host MD5 marker kept the stealer from running twice on the same machine. On Windows it dropped a .vbs file and ran it through cscript, and StepSecurity observed a Linux variant that executed an ELF from /tmp/.<8 hex> and removed the path so the process kept running from a deleted inode under parent PID 1.
Socket's reverse engineering of stage two describes a credential-harvesting framework with seventeen collectors, reaching cloud instance metadata, Kubernetes service-account and HashiCorp Vault tokens, working directories for Jenkins, GitLab Runner, GitHub Actions, CircleCI, TravisCI, and ArgoCD, SSH keys, Git and Docker credentials, per-process environments, browser profiles, password manager stores, and cryptocurrency wallets. On Windows the payload shipped an embedded DebugChromium.exe that abused Chrome's own debugging interface to extract the v127+ app-bound encryption key and decrypt saved passwords that Chrome's newer protections would otherwise have kept out of reach. Packagist removed the malicious versions and temporarily delisted the four packages, and StepSecurity advised operators to halt composer update until lockfiles were verified against pre-attack SHAs and to rotate any CI token, cloud credential, or deploy key a runner could reach during the window. The tag-rewrite delivery resembles the actions-cool compromise four days earlier (see [[actions-cool]]), but the two are distinct. There, TeamPCP routed tags on official refs to commits inside an attacker-owned fork without ever pushing to the official repository; here the attacker held push access and rewrote tags directly. The flipboxstudio.info infrastructure does not appear in the Mini Shai-Hulud campaign.
Notes
- StepSecurity counted 502 rewritten tags on laravel-lang/lang, 86 on attributes, 46 on actions, and every tag from v1.0.0 to v3.4.5 on http-statuses. Socket counted roughly 700 across the four. Aikido's earlier count of 233 missed actions.
- The attacker held org-wide push access and rewrote tags directly on the official repositories. Aikido described a fork-tag mechanism; StepSecurity's git evidence, identical "Your Name" commits on official refs, indicates direct push.
- The window was 2026-05-22 22:32 UTC to 2026-05-23 00:00 UTC. The dropper writes a per-host marker, and its second-stage PHP drops an ELF at /tmp/.<8 hex> and unlinks it, leaving a live process with parent PID 1.
- GitHub still retains all fifteen malicious commits StepSecurity named, and within each repository they share one Git tree. The samples manifest records one complete commit-derived reconstruction per distinct malicious tree.
Appendix · Affected releases
496 more versions
- Every tag rewritten during the attack window. StepSecurity reported 502; the repo now carries 504 pre-attack tags, restored after cleanup. Socket confirmed malicious code in 14.3.7, and Packagist delisted the package.
75 more versions
- StepSecurity reported 86 rewritten tags; the GitHub repo now carries 83 pre-attack tags, suggesting three malicious tags were deleted rather than restored. Mix of bare-numeric and v-prefixed tag names.
37 more versions
- StepSecurity reported 46 rewritten tags covering 1.0.0 through 1.12.2; the GitHub repo now carries 45 pre-attack tags (1.0.0 through 1.13.0), so a small amount of tag churn occurred during cleanup. Not flagged in the initial Aikido report.
61 more versions
- StepSecurity reported every tag from v1.0.0 through v3.4.5 was rewritten. The repo also carries bare-numeric tags whose target commits predate the window, so 69 pre-attack tags are listed here in total.
Indicators
- filesrc/helpers.php
- file/tmp/.laravel_locale/<md5>
- file/tmp/.laravel_locale/<12 hex>.php
- file/tmp/.laravel_locale/<8 hex>.vbs
- file/tmp/.<8 hex>
- domainflipboxstudio.info
- urlhttps://flipboxstudio.info/payload
- urlhttps://flipboxstudio.info/exfil
- accountYour Name <[email protected]>
- fileDebugChromium.exe
- stringk9X2mP7vL4nQ8wR1
- commita5ea2e8fa92ccf29cdb1d2dadbeb27722b2bff37
- commit50ac0db454d19234c835716f297bbc5363c0a25c
- commitc45764e70285146da37025cd8601a921ab8a7eda
- commita9f8d88cf98e35988d3d0fd6d79547f980853041
- commitbba2e443dc7ff1f8704f52a5375383e3f4f643b8
- commit26c233e1a0d4fd2331e8e0f175e18f8eed904aa3
- commitdb0c3ef246103fd0f6c318e0d48f26b5289044c3
- commit9ee599d248cc322fa26054694a83a1f4558cc716
- commit6b1d5782a8c8c199d070857802d39bfe609eb6f2
- commit556d2b335d4d6d92139822017ee461b668afe375
- commit722cee67326d932e7f71ba3438f62a255d779aa9
- commitad24b980db8f0dca50ccb3ba6badb3c2331e0ef4
- commitd59561727927117e65b35f0183cae131baad19fe
- commit1713b19cbf609cb101ff5e216be41f7224269082
- commitdaa5212264bb73fb39fe7a36618b62717dc564a5
References
- Laravel-Lang Supply Chain Attack - StepSecuritystepsecurity.io
- Laravel-Lang/lang issue #8295 - Compromised version tagsgithub.com
- Supply Chain Attack Targets Laravel-Lang Packages With Credential Stealer - Aikidoaikido.dev
- Laravel Lang Supply Chain Compromise - Socketsocket.dev
- Laravel-Lang/common issue #257 - Compromised version tagsgithub.com
- Retained malicious Laravel-Lang/lang commit for 15.29.5github.com
- Retained malicious Laravel-Lang/http-statuses commit for v3.4.5github.com
- Retained malicious Laravel-Lang/actions commit for 1.12.2github.com
- Retained malicious Laravel-Lang/attributes commit for v2.4.1github.com
Source record: oss/attacks/laravel-lang/meta.yaml