Famous Chollima Targets PHP Developers Through Compromised Packagist Package

Famous Chollima Targets PHP Developers Through Compromised Packagist Package
A malicious obfuscated JavaScript loader was discovered appended to tailwind.js in the Packagist dev version dev-drewroberts/feature/test-case of the roberts/leads package, which appears to be tied to a compromised development branch rather than the stable release. The loader uses TRON, Aptos, and BNB Smart Chain infrastructure to fetch encrypted payloads, then decrypts and executes them, with indicators and infrastructure overlapping Famous Chollima, DEV#POPPER RAT, OmniStealer, and BeaverTail activity. #FamousChollima #DEVPOPPERRAT #OmniStealer #BeaverTail #robertsleads #DrewRoberts

Keypoints

  • The malicious code was found in the Packagist dev version dev-drewroberts/feature/test-case of the legitimate PHP package roberts/leads.
  • The payload was appended after a normal Tailwind configuration in tailwind.js and was hidden by a large whitespace gap.
  • After deobfuscation, the script acted as a JavaScript loader that retrieved encrypted content from blockchain and public RPC services.
  • The loader used TRON and Aptos as payload pointers and BNB Smart Chain transaction data as encrypted payload material.
  • The decrypted payload was executed with eval(), and a second stage could be launched in a detached hidden Node.js child process.
  • Analysts assessed the issue as likely a poisoned dev branch or repository compromise, with patterns linked to North Korean APT activity and Famous Chollima.
  • The malicious version was published on May 30, 2026, and the maintainers, Packagist, and GitHub Security were notified.

MITRE Techniques

  • [T1195.002 ] Supply Chain Compromise – The malicious code was inserted into a legitimate package development branch and delivered through trusted developer infrastructure (‘poisoned-branch workflow’ and ‘exposed through Packagist as an installable dev version’).
  • [T1204.002 ] User Execution: Malicious File – The attack relied on a victim installing or checking out the poisoned dev branch and running the project (‘composer require roberts/leads:dev-drewroberts/feature/test-case’ and ‘clone the GitHub repository and check out the branch’).
  • [T1059.007 ] Command and Scripting Interpreter: JavaScript – The payload was JavaScript code that decrypted and executed additional stages in Node.js (‘it behaves as a JavaScript malware loader’ and ‘eval() executes the decrypted payload’).
  • [T1027 ] Obfuscated Files or Information – The malicious payload was hidden and obfuscated after a normal configuration block (‘hidden far to the right after a large whitespace gap’ and ‘the appended JavaScript is obfuscated’).
  • [T1102.001 ] Web Service: Dead Drop Resolver – The loader used public blockchain and RPC services as a dead drop to retrieve payload pointers (‘TRON and Aptos provide payload pointers’ and ‘BNB Smart Chain RPC services return transaction input data’).
  • [T1105 ] Ingress Tool Transfer – The malware retrieved encrypted payload material from remote services before decryption and execution (‘retrieves encrypted payload material’ and ‘return xorDecrypt(encryptedPayload, xorKey)’).
  • [T1059 ] Command and Scripting Interpreter – The payload was ultimately run as code within the Node.js environment (‘execute the result with eval()’ and ‘launch a detached hidden Node.js child process’).

Indicators of Compromise

  • [Package/Version ] affected package release – dev-drewroberts/feature/test-case, roberts/leads
  • [Repository/Branch ] affected source branch – drewroberts/feature/test-case, GitHub repository roberts/leads
  • [File name ] malicious file and package archive – tailwind.js, archive
  • [SHA-256 hash ] file and archive hashes – 96afdba882046385242cbed46871e41147c8055c5d9eff7460847b2c01a77dc3, 522b28a2f78771715497ba53729d4ab9a50e982322c391379f3bddf7c8cb363f
  • [Wallet address ] TRON wallet pointers used by the loader – TMfKQEd7TJJa5xNZJZ2Lep838vrzrs7mAP, TXfxHUet9pJVU1BgVkBAbrES4YUc1nGzcG
  • [Aptos identifier ] fallback payload identifiers – 0xbe037400670fbf1c32364f762975908dc43eeb38759263e7dfcdabc76380811e, 0x3f0e5781d0855fb460661ac63257376db1941b2bb522499e4757ecb3ebd5dce3
  • [XOR key ] decryption keys embedded in the loader – 2[gWfGj;<:-93Z^C, m6:tTh^D)cBz?NM]
  • [Commit hash ] observed branch commit – 6c5c3c7655ce76399af11126b7e9a9058eb2e45d
  • [URL ] package and repository URLs – https://packagist.org/packages/roberts/leads, hxxps://github[.]com/roberts/leads/blob/drewroberts/feature/test-case/tailwind.js


Read more: https://socket.dev/blog/famous-chollima-targets-php-developers-through-compromised-packagist-package