Socket researchers found malicious code in the dev-main version of visanduma/nova-two-factor, a Packagist package linked to the broader PolinRider campaign that spreads through compromised developer accounts and Git repositories. The campaign uses Git-based intrusion, hidden payloads, and staged delivery to reach developer environments and later-stage infostealers, while also targeting PHP projects with a new shell_exec execution method. #PolinRider #visanduma/nova-two-factor #Packagist #LaHiRu
Keypoints
- Socket identified malicious code in visanduma/nova-two-factor’s dev-main branch, not in any confirmed stable release.
- The package has more than 700,000 cumulative downloads, increasing concern about potential exposure.
- PolinRider continues to spread through compromised developer accounts and Git repositories rather than relying only on package registry publishing.
- The Visanduma GitHub organization appears compromised since mid-June 2026 through the LaHiRu developer account.
- The campaign uses Git history rewriting, payload concealment, automatic execution, and staged payload delivery to infect developers.
- Researchers found a new PHP technique where obfuscated JavaScript was inserted into index.php and executed via shell_exec.
- Impact is difficult to measure because private repositories, cleaned repositories, and compromised endpoints may be missed by public code search.
MITRE Techniques
- [T1098 ] Account Manipulation – The operators compromise developer accounts and use them to insert malicious changes into repositories, extending access over time (‘compromised developer accounts’).
- [T1036 ] Masquerading – Malicious JavaScript is hidden in configuration files or disguised as .woff2 fonts to avoid inspection (‘files presented as .woff2 fonts’).
- [T1059.007 ] Command and Scripting Interpreter: JavaScript – The infection chain uses JavaScript as the payload language and later-stage malicious content (‘Malicious JavaScript is hidden’).
- [T1106 ] Native API – The PHP entry point executes the infection chain via shell_exec, launching commands from the application (‘executed through PHP’s shell_exec function’).
- [T1105 ] Ingress Tool Transfer – The initial code resolves C2 infrastructure and downloads later-stage infostealer payloads from remote servers (‘it then downloads later-stage infostealer payloads’).
- [T1027 ] Obfuscated Files or Information – The JavaScript payload is heavily obfuscated and concealed in repository files (‘heavily obfuscated JavaScript’).
- [T1195.002 ] Supply Chain Compromise: Compromise Software Supply Chain – The attackers plant malicious source in repositories and later let package resolution expose it through ecosystems like Packagist and Go modules (‘package-registry compromise is often a consequence’).
- [T1566 ] Phishing – No direct phishing is described; not applicable from the article content.
- [T1078 ] Valid Accounts – Compromised developer identities are used to access repositories and private projects (‘through compromised developer accounts’).
- [T1105 ] Ingress Tool Transfer – Staged delivery fetches payloads after resolving C2 via dead-drop mechanisms (‘using techniques including EtherHiding and, more recently, NullReceiver’).
Indicators of Compromise
- [Malicious package versions ] affected Packagist branches/releases – visanduma/nova-two-factor@dev-main, visanduma/nova-two-factor@dev-nova4support, and 2 more items
- [Ethereum address ] dead-drop resolver sender address – 0xa322E5f3D311D3080e6f0121063e9aDC2490Ef1a
- [IP addresses ] resolved C2 infrastructure – 193.247.144.38, 166.88.73.46, and 2 more items
- [File hashes ] payload files associated with tailwind.config.js – 7d47c430e6e404dc2fa8b4837678d1cbdb4d0aeacec9b405655cab79d54a2ad9, b7ede935d4979146b55f12b9eec7c83b61962b478f5dc9b8db251e539ec2abd3, and 3 more items
- [File names ] payload or configuration targets – tailwind.config.js, index.php, and .vscode/tasks.json
Read more: https://socket.dev/blog/polinrider-github-packagist