antd-img-crop GitHub Repository Hijacked to Deliver OverLord Stealer
On this page
A forged commit in the antd-img-crop GitHub repository installs a credential stealer called OverLord when a developer
runs npm run build. The npm package is not affected.
TL;DR
- On October 31, 2026, an attacker force-pushed a forged commit to
antd-img-crop(opens in new tab), an Ant Design image cropper with about 98,000 weekly npm downloads. The commit adds aprebuildhook that runs onnpm run build. - The malware steals browser passwords, cookies, keychains, cryptocurrency wallets, SSH keys and
.envfiles on macOS, Linux and Windows, then installs a remote-access agent disguised as Google software. - The same payload has two more ways in. One is a fake Amber Group careers portal. The other is most likely a sideloaded VS Code or Cursor extension that the malware deletes after it runs.
- The methods match the Contagious Interview campaign that targets developers.
The forged commit
The malicious commit 2aa8504 is a rebuild of the real 4.30.0 release commit. It keeps the same author, date (March 12)
and message, and adds two things. The first is a new script entry in package.json:
"prebuild": "node scripts/prebuild.js"The second is the scripts/prebuild.js file itself. Git lets the committer set the author and date to any value, so
GitHub’s commit list still shows nanxiaobei committed on Mar 12.
The committer cannot fake GitHub’s push record. The repository’s activity log(opens in new tab) shows a force push on 2026-10-31 at 15:12 UTC, made from the maintainer’s account, that the commit list hides. Maintainers who sign their commits can also watch for a head commit that loses its Verified badge.
How the payload reaches a machine
The hijacked repository and a fake job portal lead to the same stage 2 loader.
In the repository path, prebuild.js downloads and runs stage 2, a fake deepfake_guard installer that sets up
Node.js. Stage 2 fetches stage 3, encrypted JavaScript that runs in memory and finds its server through a GitLab
dead-drop. Stage 3 steals credentials and wallets and installs the OverLord agent.
The servers that host stage 3 also host a fake careers portal for Amber Group, a real cryptocurrency firm. It
collects a candidate’s name, email and GitHub profile, then displays a harmless “verification” command but copies a
different one to the clipboard. That command downloads and runs verify_m or verify_w, the same file
names as the stage 2 loader.
The editor extension that erases itself
The macOS and Linux agent has a cleanup routine that deletes a VS Code or Cursor extension named
google-dev-tools.google-update-support, both its folder and its entry in extensions.json. The agent never installs
this extension itself. Started from a workspace folder, the agent waits two seconds, then deletes the bundle it
launched from and every file on a cleanup list.
The extension is on neither the VS Code Marketplace nor Open VSX. SafeDep’s assessment is that the attacker sideloads it,
plausibly inside a fake take-home assignment repository or as a .vsix file. That makes it a third entry point into the
same payload.
Rotated infrastructure
The final payload writes buildwithknexus[.]xyz/check_m into a macOS login script as a re-infection hook. The attacker
registered that domain on August 5, while stage 2 comes from the newer icagllmbt[.]space, registered on October 12.
The attacker rotates delivery hosts and keeps older ones in secondary roles. buildwithknexus[.]xyz is now offline.
| Date | Event |
|---|---|
| Aug 5 | buildwithknexus[.]xyz registered |
| Aug 25 | Source revision of the OverLord agent builds |
| Oct 12 | icagllmbt[.]space registered |
| Oct 31 | antd-img-crop poisoned, stage 2 from icagllmbt[.]space |
What OverLord does on an infected machine
The malware runs on macOS, Linux and Windows. It steals:
- browser passwords and cookies (Chromium browsers and Firefox)
- the macOS Keychain and the Linux keyring
- browser wallet extensions (MetaMask, Phantom, Rabby and dozens more)
- about 34 desktop wallets per operating system (Exodus, Electrum, Ledger Live, Trezor Suite and others)
- command-line key stores for Solana, Sui, NEAR and Foundry
.env,.npmrc,.gitconfig, SSH keys and.kdbxfiles
On macOS and Linux it shows a fake system dialog that asks for the user’s password. On macOS the dialog carries the title “System Preferences” and reads “macOS needs your password to apply system updates and verify drivers and security settings”. Linux shows a similar “Authentication Required” prompt. The malware then uses the password to unlock more stored secrets and install itself with admin rights.
It persists as fake Google software:
- macOS:
com.google.UpdateSupporterLaunchDaemon - Linux:
google-agent.service - Windows: scheduled task
GoogleUpdateSupporterNode
The agent gives the attacker remote control, with shell commands, file transfer and process control. On Windows it also captures screenshots and the clipboard and allows remote keyboard and mouse input.
To decrypt protected browser passwords on Windows, the stealer runs as SYSTEM for a few seconds through a scheduled
task that it creates, runs once and deletes. The task names follow short patterns such as ABES######, CNGS######,
CNG?????? and WU??????. Defenders can alert on these short-lived SYSTEM tasks.
Who is behind it
The attacker built the agents from a Go module named overlord-client, and their configuration uses OVERLORD_*
settings, so the operators call their toolkit OverLord.
The fake recruiter, the paste-a-command “verification” step and the focus on developers and cryptocurrency holders match the publicly documented Contagious Interview campaign. The match rests on technique and does not prove who the operators are.
An earlier attempt in hugo-paper
On August 21, the same maintainer account added a similar install-time dropper to
hugo-paper(opens in new tab), a Hugo theme, pulling from the same buildwithknexus[.]xyz
host. A commit on October 21 removed the dropper, and the repository is clean as of November 3. Only the install hook changed, so sites
that use the theme were not affected. Ten days later the attacker hit antd-img-crop, so SafeDep treats the account as
still compromised.
Indicators of compromise
| Type | Value |
|---|---|
| Malicious commit | 2aa850469fa1ff2e2efe8eebdf1e085e4d11212a |
scripts/prebuild.js | 2c09fce2856bcd92b8afea424da0f9daa67bf2d22ceb625af60deaabd3d0573d |
| Infrastructure | icagllmbt[.]space, api.gaganata[.]ink, api.fallgganata[.]ink, api.chestsoi[.]ink, buildwithknexus[.]xyz |
| Dead-drop | gitlab[.]com/drop-indexings/tasks |
| macOS re-infection | buildwithknexus[.]xyz/check_m, dropped to /var/tmp/check |
| Editor extension | google-dev-tools.google-update-support (VS Code, Cursor) |
| Persistence | com.google.UpdateSupporter, google-agent.service, GoogleUpdateSupporterNode |
| Windows SYSTEM tasks | ABES######, CNGS######, CNG??????, WU?????? (short-lived) |
The full IOC list:
| Row | type | value | note |
|---|---|---|---|
| 1 | vcs_commit | 2aa850469fa1ff2e2efe8eebdf1e085e4d11212a | forged unsigned "4.30.0" commit in github.com/nanxiaobei/antd-img-crop (legit repo; force-pushed 2026-10-31) |
| 2 | file_sha256 | 2c09fce2856bcd92b8afea424da0f9daa67bf2d22ceb625af60deaabd3d0573d | scripts/prebuild.js stage 1 dropper |
| 3 | file_sha256 | 7f287aa27edecd135400060c3581bcbcf6320b53bb23da4f1bc0421bfd2c239c | package.json @2aa85046 with prebuild hook |
| 4 | file_path | scripts/prebuild.js | stage 1 dropper run by npm prebuild (repo-relative) |
| 5 | payload_sha256 | c7c22e322c17bda8198257342d4034af6250a5c433242461b870879ba9aa285d | verify_m stage 2 bash loader (Linux/macOS) |
| 6 | payload_sha256 | 465cd1a445782c72cbb30e82e57ebbae38f1535f248bf821b11bc4897d90180e | verify_w / v.cmd stage 2 batch loader (Windows) |
| 7 | payload_url | https://icagllmbt.space/verify_m | stage 2 Linux/macOS |
| 8 | payload_url | https://icagllmbt.space/verify_w | stage 2 Windows |
| 9 | c2_domain | icagllmbt.space | stage 2 host; registered 2026-10-12 NameCheap |
| 10 | c2_ipv4 | 193.160.32.10 | icagllmbt.space |
| 11 | c2_domain | api.gaganata.ink | stage 3 store + telemetry + lure site |
| 12 | c2_domain | api.fallgganata.ink | fallback stage 3 store + telemetry |
| 13 | c2_domain | gaganata.ink | attacker domain; registered 2026-07-28 NameCheap |
| 14 | c2_domain | fallgganata.ink | attacker domain; registered 2026-07-28 NameCheap |
| 15 | c2_domain | dashboard.gaganata.ink | attacker subdomain seen in CT logs; role unknown |
| 16 | c2_ipv4 | 208.84.100.64 | api.gaganata.ink and api.fallgganata.ink |
| 17 | payload_url | https://api.gaganata.ink/install_guard.js | stage 3 (serves decoy HTML unless gated) |
| 18 | payload_url | https://api.fallgganata.ink/install_guard.js | stage 3 fallback |
| 19 | exfil_url | https://api.gaganata.ink/guard-install-log | victim install log upload (POST) |
| 20 | c2_url | https://api.gaganata.ink/guard-install-progress | progress beacon (POST) |
- supply-chain
- malware
- github
- contagious-interview
- stealer
Author
safedep.io
