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 <you@example.com> 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 laravel-lang/attributes, 46 on laravel-lang/actions, and every tag from v1.0.0 through v3.4.5 on laravel-lang/http-statuses. An earlier Aikido report on 2026-05-22 cited 233 tags across three packages and missed laravel-lang/actions.
- The attacker held org-wide push access and rewrote tags directly on the official repositories. An earlier Aikido analysis described a fork-tag mechanism; StepSecurity's git evidence ("Your Name <you@example.com>" commits on the official refs, identical across all four repos) contradicts that and indicates direct push.
- Compromise window was 2026-05-22 22:32 UTC to 2026-05-23 00:00 UTC, with the first rewrite landing on laravel-lang/lang and the campaign extending across the four repositories within roughly 90 minutes.
- The dropper writes a per-host marker so the stealer runs once per machine. The second-stage PHP drops and runs an ELF at /tmp/.<8 hex> and removes it from the directory tree; the live ELF carries parent PID 1 and a deleted executable path.
- flipboxstudio.info is a typosquat of the legitimate flipboxstudio.com.
- Socket counted roughly 700 rewritten tags across the four repositories and documented seventeen credential collectors in stage two covering cloud metadata services, Kubernetes service-account tokens, HashiCorp Vault, CI/CD working directories (Jenkins, GitLab Runner, GitHub Actions, CircleCI, TravisCI, ArgoCD), browsers, password managers (1Password, Bitwarden, LastPass, KeePass, Dashlane, NordPass), SSH keys, Git and Docker credentials, VPN configs, and cryptocurrency wallets.
- On Windows, stage two ships an embedded DebugChromium.exe that uses Chrome's debugging interface to extract the v127+ app-bound encryption key, defeating Chrome's newer cookie- and password-store protections.
- C2 hostname is built at runtime from character codes; TLS certificate verification is disabled on the fetch and a Mozilla User-Agent is spoofed. The string "k9X2mP7vL4nQ8wR1" recurs as an XOR key in the obfuscated payload.
- GitHub still retains all fifteen malicious commits StepSecurity named. Within each repository those commits share one Git tree: lang 3fa9e00c0d2250584e499c5b240a1089fdfa5425, http-statuses 1e4c348f010fdac1d1fe0a35b5339514661adce6, actions d54d14a1b2a389a2285daeedddf7109a747f2e10, and attributes 01a9a5800ac272190ca2cca1887c06d3c4686fe5. 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 at the time; the GitHub repo now carries 504 pre-attack tags, restored after cleanup. Socket independently confirmed malicious code in version 14.3.7. Packagist delisted the package after the malicious versions were removed.
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 now also carries bare-numeric tags (1.0.11, 2.1.4, 3.5.0 through 3.13.0) whose target commits predate the attack 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 <you@example.com>
- 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