P.K. SHARMA

Cyber security intelligence, AI governance, practitioner analysis

Threat Intel

A fake coding test forbade AI assistants. The researchers say an AI would have caught the malware.

The rule is not about fairness. It removes the one control most likely to flag the trojanised import on line 1 of the file you were told not to open.

By Parminder Kumar Sharma · · 8 min read

A blank manila envelope on a dark wooden desk, one corner slightly lifted to reveal darkness inside, lit by a cold indigo rim light.

Start with the attribution, because the headline is not the research

Kaspersky published this on 1 September 2026 as "Mirage Kitten targeting aviation and FinTech sectors across the Middle East and Africa with a new malware set". Their confidence statement is precise:

"We attribute this activity to Mirage Kitten with a high degree of confidence based on the following observations:"

Read that carefully. The high-confidence claim is that this malware belongs to a known cluster. It is not a claim about a country. The word "Iran" does not appear anywhere in the report.

The nationality in the headlines arrives by inheritance. Third parties equate Mirage Kitten with UNC1549 and Nimbus Manticore. Mandiant assessed UNC1549 as Iranian in February 2024, and did so "with moderate confidence", using "suspected" in its own title. Check Point asserted it flatly in September 2025 with no qualifier at all.

The three rules in the README

The lure is a take-home engineering test, sent by someone posing as a talent acquisition specialist at a major technology company, over LinkedIn. Archives named Front-Technical-Challenge.zip and Task-FullStack.zip, hosted in an S3 bucket named to impersonate Oracle.

Three rules in the README, and what each one is for

THREE RULES IN THE README, AND WHAT EACH ONE IS FORA take-home engineering test, sent by a recruiter. None of the rules is project hygiene.WHAT THE CHALLENGE ASKSWHAT IT ACHIEVES“Find and fix all bugs in the frontend code.”Points you at the half of the project that is clean.“server.js is bug-free and functions correctly.”Line 1 of server.js is the trojanised import. It is the onlyapplication file they altered.“No AI assistants.”Kaspersky: an AI reviewer “would likely have flagged thesuspicious first-line import”.AND THE MOMENT IT RUNS IS THE MOMENT YOU DO THE TASKThe package was shipped inside the archive’s own node_modules, never published to the registry.It fires on import, when the candidate starts the app to see the bugs they were asked to fix.So npm install --ignore-scripts would not have stopped this.There is no lifecycle script, nothing is fetched, and no lockfile, audit or software composition tool sees anything at all.
The third rule is the one worth carrying into a hiring policy. A technical assessment that forbids the candidate from using an AI code reviewer is asking them to switch off the control most likely to catch a planted dependency, and the researchers say so directly. Treat that instruction as a signal in itself.
The instructions are not project hygiene. Each closes a route by which the candidate might notice.

The third rule is why this belongs on a site about AI security, and Kaspersky says the quiet part directly:

"Notably, an AI code-review assistant tasked with auditing the project would likely have flagged the suspicious first-line import of an unknown npm package and warned the targeted developer that the project was trojanized."

The rule banning AI assistants is an evasion control. Not an integrity measure, not a fairness measure. The attacker identified an AI code reviewer as the thing most likely to catch them, and wrote a rule to switch it off. A three-hour clock does the rest.

That inverts the usual framing on this site. Most weeks the story is an AI tool creating exposure. Here an AI tool is the control that works, and the attacker had to design around it.

The execution moment, and why the standard advice fails

The archive contains TaskFlow, an Express, React and Vite project-management app. The README says fix the frontend, and states that server.js is "bug-free and functions correctly" and must not be modified.

Line 1 of server.js is a require of a package called colorized_terminal, version 2.1.0. As Kaspersky puts it, the instruction "conveniently direct[s] attention away from the only application source file the attackers had altered."

Now the detail that matters operationally:

"The attackers bundled the package directly in the challenge task archive's node_modules directory rather than publishing it to the npm registry."

Once running, the package launches an implant from node_modules/.cache/.320697f1/index.js as a detached background process.

What "cross-platform" is and is not

NodeRabbit is a Node.js RAT and Kaspersky documents per-platform persistence in detail: Windows Run keys, Linux @reboot cron, macOS LaunchAgents named com.microsoft.edgeupdate and com.intel.dsa.helper. Three variants, masquerading as Microsoft Edge Update and Intel Driver and Support Assistant.

So the code is cross-platform, confirmed. But Kaspersky never states the operating system of a single victim. Victims are identified only by country: Afghanistan, Egypt, Ethiopia.

And the feature set leans heavily Windows. PE subsystem patching of node.exe, Run registry keys, curl.exe --proxy-anyauth for NTLM, WinHTTP proxy discovery, Outlook OST and PST harvesting, a RUNDLL command, a dedicated WSL persistence path, and drive-letter enumeration.

Cross-platform by construction. Not demonstrated in the wild. Note that The Hacker News hedges this correctly in its body text and not in its headline.

The prior art is North Korean, and nobody in the research says so

Lazarus has run this exact play. ESET documented it in September 2023: a fake Meta recruiter approached an employee at a Spanish aerospace company over LinkedIn Messaging and "sent two coding challenges required as part of a hiring process, which the victim downloaded and executed on a company device." ESET called it "a known Lazarus tactic, used at least since Operation DreamJob", which MITRE ATT&CK dates to September 2019.

Same social mechanism, three years apart

Lazarus, 2023Mirage Kitten, 2026
ApproachFake Meta recruiter on LinkedInRecruiter persona on LinkedIn
ArtefactCompiled binaries on ISO imagesNode project in a ZIP
ExecutionDLL side-loading on runImport of a bundled dependency on run
Who runs itThe candidate, on a work deviceThe candidate, on a work device
PayloadLightlessCan RATNodeRabbit RAT
The Lazarus case is ESET, September 2023. The Mirage Kitten case is Kaspersky, September 2026. The comparison is ours: neither vendor draws it for this campaign.

Be careful with this comparison. Kaspersky makes no reference to North Korea, Lazarus or Dream Job. ClearSky named an "Iranian Dream Job" campaign in November 2024 and argued the imitation was deliberate misdirection rather than convergence, but their site was unreachable during this research, so that reading reaches us second hand and we are not resting anything on it.

What is solid: this cluster has used recruitment lures since at least June 2022, per Mandiant, including fake hiring sites for aviation and aerospace roles. The recruitment lure is not borrowed. The coding-test-as-payload refinement is the newer part.

What to actually do

Take this with you

For engineering leaders and anyone taking technical assessments

  • Run candidate-supplied code only in a disposable VM. This is the control that survives regardless of the execution primitive, because the trigger here was simply starting the app, which is what the exercise asks for. Note that Kaspersky publishes no mitigations section at all, so this is our recommendation grounded in the mechanism.
  • Treat a bundled node_modules as the red flag it is. A legitimate assessment has you install dependencies yourself. A dependency shipped inside the archive has bypassed the registry, and with it every scanner you own.
  • Keep Workspace Trust on in VS Code, because the malware attacks it. One NodeRabbit variant explicitly tries to disable Workspace Trust, and installs a fake extension displayed as GitHub Copilot Helper. The operators consider it worth defeating.
  • Grep your repositories for the marker # shepherd-persist in .git/hooks/post-merge and .git/hooks/post-checkout. That is the comment the Git-hook persistence leaves behind.
  • Treat a hiring process that forbids AI code review as a signal. On the researchers’ own reading, that rule exists to remove the control most likely to catch a planted dependency.
  • Watch for the named artefacts: scheduled tasks IntelDriverSupportUpdate at 10:00 and NetSync_<username> at 09:00, LaunchAgents com.microsoft.edgeupdate and com.intel.dsa.helper, and node processes beaconing to azurewebsites.net.

The position

There is no CVE here and there cannot be one. Verified against the CISA Known Exploited Vulnerabilities catalogue, version 2026.08.31, 1,687 entries: nothing matches. No software flaw is exploited. The developer runs the project because they were asked to, which is precisely why it works and why there is nothing to patch.

The finding worth taking to a board is not the malware. It is that an attacker looked at a developer's toolchain, decided the AI code reviewer was the most dangerous thing in it, and wrote a rule to turn it off. We have spent two years on this site cataloguing the exposure that AI tooling creates, and much of that stands. This is the other column in the ledger.

If you run technical assessments, the practical consequence is small and immediate: candidates should be told to run them in a VM, and a client or employer who forbids AI review during an assessment has just told you something about themselves.

Share this briefing

Know someone who owns this problem? Send it to them.

Related briefings

The briefing, in your inbox

Practitioner analysis of cyber and AI security news. No vendor noise.

One email per briefing. Unsubscribe any time.