antd-img-crop GitHub Repository Hijacked to Deliver OverLord Stealer

Kunal Singh5 min read

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 a prebuild hook that runs on npm run build.
  • The malware steals browser passwords, cookies, keychains, cryptocurrency wallets, SSH keys and .env files 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:

package.json @ 2aa8504
"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.

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 .kdbx files

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.UpdateSupporter LaunchDaemon
  • 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

The full IOC list:

IoC: antd-img-crop OverLord campaign
Rowtypevaluenote
1vcs_commit2aa850469fa1ff2e2efe8eebdf1e085e4d11212aforged unsigned "4.30.0" commit in github.com/nanxiaobei/antd-img-crop (legit repo; force-pushed 2026-10-31)
2file_sha2562c09fce2856bcd92b8afea424da0f9daa67bf2d22ceb625af60deaabd3d0573dscripts/prebuild.js stage 1 dropper
3file_sha2567f287aa27edecd135400060c3581bcbcf6320b53bb23da4f1bc0421bfd2c239cpackage.json @2aa85046 with prebuild hook
4file_pathscripts/prebuild.jsstage 1 dropper run by npm prebuild (repo-relative)
5payload_sha256c7c22e322c17bda8198257342d4034af6250a5c433242461b870879ba9aa285dverify_m stage 2 bash loader (Linux/macOS)
6payload_sha256465cd1a445782c72cbb30e82e57ebbae38f1535f248bf821b11bc4897d90180everify_w / v.cmd stage 2 batch loader (Windows)
7payload_urlhttps://icagllmbt.space/verify_mstage 2 Linux/macOS
8payload_urlhttps://icagllmbt.space/verify_wstage 2 Windows
9c2_domainicagllmbt.spacestage 2 host; registered 2026-10-12 NameCheap
10c2_ipv4193.160.32.10icagllmbt.space
11c2_domainapi.gaganata.inkstage 3 store + telemetry + lure site
12c2_domainapi.fallgganata.inkfallback stage 3 store + telemetry
13c2_domaingaganata.inkattacker domain; registered 2026-07-28 NameCheap
14c2_domainfallgganata.inkattacker domain; registered 2026-07-28 NameCheap
15c2_domaindashboard.gaganata.inkattacker subdomain seen in CT logs; role unknown
16c2_ipv4208.84.100.64api.gaganata.ink and api.fallgganata.ink
17payload_urlhttps://api.gaganata.ink/install_guard.jsstage 3 (serves decoy HTML unless gated)
18payload_urlhttps://api.fallgganata.ink/install_guard.jsstage 3 fallback
19exfil_urlhttps://api.gaganata.ink/guard-install-logvictim install log upload (POST)
20c2_urlhttps://api.gaganata.ink/guard-install-progressprogress beacon (POST)
93 rows · showing first 203 columns
  • supply-chain
  • malware
  • github
  • contagious-interview
  • stealer

Author

Kunal Singh

Kunal Singh

safedep.io

Share

Ship Code.Not Malware.

Start free with open source tools on your machine. Scale to a unified platform for your organization.