A LinkedIn Recruiter Asked a Developer to Review a GitHub Repo — The Repo Had a Backdoor, the Recruiter Was an Arts Journalist’s Stolen Identity, and npm Install Was the Only Interview Question

🤚 The Open-Palm Recruitment Dossier

A developer named Roman Imankulov received a perfectly normal LinkedIn message from a perfectly normal recruiter at a perfectly normal crypto startup. The recruiter asked him to review a GitHub repository. The repository contained a backdoor. The backdoor was hidden inside a test file. And the entire operation was built on two stolen identities — a real engineer and a real arts journalist — because apparently, threat actors have better HR processes than most actual startups.

Key details of the attack:

  • The attacker posed as a recruiter for a crypto startup, requesting a “code review” of a GitHub repository
  • The malicious payload was buried in app/test/index.js, disguised among commented-out test code
  • Running npm install triggered a prepare script that executed app/index.js, which loaded the backdoor
  • The backdoor contacted rest-icon-handler.store/icons/77 to fetch and execute arbitrary commands
  • The recruiter profile belonged to a real arts journalist with no technical background
  • Repository commits were attributed to a real full-stack engineer who had previously been impersonated on GitHub

👐 The Two-Handed npm Autopsy

Let’s talk about the elegance of this attack, because it deserves a reluctant standing ovation.

The threat actor didn’t exploit a zero-day. They didn’t brute-force credentials. They didn’t even write particularly sophisticated malware. They exploited professionalism. A developer received a recruitment message, was asked to evaluate code — a reasonable request in any hiring process — and the act of running npm install would have compromised their machine entirely.

The prepare script is npm’s designated lifecycle hook for post-installation setup. It’s meant for compiling native modules or generating configuration files. It is also, as the security community has been screaming about since approximately 2019, a perfect malware trigger. It runs automatically. It runs silently. And most developers never check what it does because they assume npm install installs npm packages, not remote access trojans.

The stolen identities are the cherry on this particular poison sundae. The commit history looked legitimate because it was attributed to a real engineer. The recruiter profile looked legitimate because it belonged to a real person. The only thing that wasn’t legitimate was the entire operation, but by the time you notice that, your credentials are already on a server called rest-icon-handler.store.

🌿 The Gentle Awakening

Imankulov didn’t fall for it. He grew suspicious and used a read-only sandbox environment with an AI agent to analyze the repository. The agent identified the malicious payload almost immediately. This is the cybersecurity version of asking someone else to open the suspicious envelope.

But here’s the uncomfortable question: how many developers received similar messages and simply ran the code?

LinkedIn has 1 billion users. Developer recruitment on the platform is constant, aggressive, and largely indistinguishable from social engineering even when it’s legitimate. The difference between a real recruiter asking you to look at a codebase and a threat actor asking you to install malware is, from the recipient’s perspective, approximately zero visual cues. They both have stock photos. They both write in vaguely enthusiastic corporate prose. They both want you to click something.

The malicious repository was still active on GitHub at the time of reporting.

👑 The Gold-Leaf Developer Trust Reckoning

This attack sits at the intersection of three trends that are collectively dismantling the developer ecosystem’s trust model:

  • npm lifecycle scripts remain an unsandboxed execution vector that the Node.js community has been debating for seven years without resolution
  • Identity theft on developer platforms has become trivial — fake GitHub commits, cloned LinkedIn profiles, and AI-generated recruiter personas are indistinguishable from the real thing
  • The hiring process itself is now an attack surface, because asking candidates to run code is standard practice in an industry that treats npm install as casually as opening an email

The fix isn’t technical. It’s cultural. Every developer needs to treat npm install on an untrusted repository with the same suspicion they’d give a USB drive in a parking lot. Which is to say: don’t. Use sandboxes. Use containers. Use an AI agent in a read-only environment, like Imankulov did. Or at minimum, read the package.json scripts before you run them.

But we both know nobody’s going to do that. The next recruiter message is already in your inbox.

“The job description said ‘full-stack developer’ but the actual role was ‘unwitting malware distribution endpoint.’ The benefits package included remote access, unlimited PTO of your credentials, and a signing bonus paid directly to a C2 server.” — The Slap of Wisdom Talent Acquisition Desk, currently reviewing a very promising GitHub repository in a Faraday cage