Skip to content

Back to the catalog

Socket: Famous Chollima Targets PHP Developers via Compromised Packagist Package
socket.devwriteup

Socket: Famous Chollima Targets PHP Developers via Compromised Packagist Package

Socket researchers found malicious obfuscated JavaScript appended to a tailwind.js file inside a dev branch (dev-drewroberts/feature/test-case) of the legitimate Laravel package roberts/leads on Packagist. The payload uses TRON, Aptos, and BNB Smart Chain RPC services as a blockchain "dead drop" to fetch XOR-encrypted second-stage code, decrypt it, and execute it via eval() and a hidden detached Node.js child process, consistent with prior DEV#POPPER/OmniStealer/BeaverTail-family DPRK campaigns. The activity is attributed to Famous Chollima and resembles a Contagious Interview-style fake job/recruiter lure targeting PHP/Laravel developers, with full IOCs (wallets, XOR keys, hashes) and detection guidance provided.

TL;DR A Packagist dev-branch of the Laravel package roberts/leads was found hiding a blockchain-dead-drop JS loader tied to DPRK's Famous Chollima / Contagious Interview campaign.
Document

What it is

A JavaScript malware loader appended to tailwind.js in the Packagist dev version dev-drewroberts/feature/test-case of the legitimate Laravel package roberts/leads (maintainer: Drew Roberts). Socket attributes it to North Korean group Famous Chollima and assesses it as a developer/repo compromise or poisoned-branch workflow — not a package built from scratch. The stable release line did not show the same indicators.

How it works

The payload is concealed after the valid Tailwind config, pushed far right behind a large whitespace gap so it is easy to miss in review. Everything after the closing }; is the obfuscated loader. It reconstructs require and module via global aliases, then uses a two-stage, blockchain-as-dead-drop retrieval: a TRON trongrid.io account-transactions call returns data used as a payload pointer (reversed hex string), falling back to Aptos aptoslabs.com if TRON fails; that pointer (a BNB Smart Chain tx hash) is resolved via BSC RPC to fetch encrypted transaction input data, which is XOR-decrypted with a hardcoded key.

  • First stage: decrypted and run with eval() in-process.
  • Second stage: launched via child_process.spawn("node", ["-e", ...]) as a detached, windowsHide: true, stdio: "ignore" process.

Because the second-stage payload lives on-chain, the actor can rotate it without touching the package.

Preconditions / Affected

You must have installed the specific dev branch version dev-drewroberts/feature/test-case of roberts/leads. A normal stable install of the package was not flagged. Node.js execution of the tailwind.js config is what triggers the loader.

What to do

Check installs for the poisoned branch, then hunt for these indicators the page provides:

  • Campaign markers: global['!']='9-0264-2' expanding to global['_V']='A9-0264-2'.
  • TRON wallets used as pointers: TMfKQEd7TJJa5xNZJZ2Lep838vrzrs7mAP and TXfxHUet9pJVU1BgVkBAbrES4YUc1nGzcG.
  • Aptos fallback / BSC tx-hash arguments: 0xbe037400670fbf1c32364f762975908dc43eeb38759263e7dfcdabc76380811e and 0x3f0e5781d0855fb460661ac63257376db1941b2bb522499e4757ecb3ebd5dce3.
  • XOR keys: 2[gWfGj;<:-93Z^C and m6:tTh^D)cBz?NM].
  • Outbound calls to api.trongrid.io, fullnode.mainnet.aptoslabs.com, and BSC RPC from a build/dev context.
  • Config files (e.g. tailwind.js) with trailing code after a large whitespace gap.

Socket reported the version to Packagist, notified the maintainer via GitHub and the listed security email, and flagged the file to GitHub Security.

Caveats

Attribution is an assessment ("we assess," "likely," "may have been intended"), not confirmed. The loader logic shown is a shortened, defanged excerpt, so it is not a complete IOC set. Socket says the stable line did not show indicators "in our review" — absence, not a guarantee.

Organisations named here

  • OpenClaw
  • T1027
  • T1059.007
  • T1102.001
  • T1105
  • T1195.002
  • T1204.002

Technologies named here

  • roberts/leads
  • Packagist
  • GitHub Security
  • tailwind.js
  • GitHub repository roberts/leads
  • Socket's automated AI scanner
  • TRON
  • Aptos
  • BNB Smart Chain RPC services
  • grep
  • git
  • Laravel
  • Node.js
  • PHP
  • Composer
  • JavaScript
  • Socket

Techniques named here

  • Supply chain compromise
  • User Execution
  • Command and Scripting Interpreter
  • Obfuscated Files or Information
  • Web Service
  • Ingress Tool Transfer

Threat actors named here

  • Famous Chollima
  • Contagious Interview
  • DEV#POPPER
  • OmniStealer
  • BeaverTail
  • ShoeVista
  • OpenClaw
  • PolinRider
  • DPRK