Field Notes / Supply Chain
Open the folder, run the malware. North Korea hides it in a font file, and keeps renaming the font.
PolinRider plants obfuscated JavaScript in a fake Font Awesome file and a hidden VS Code task that runs it when a developer opens the project. The file names change every few weeks to dodge detection. On 6 November we counted 2,470 GitHub task files pointing at the newest one, a ".orc" font that does not exist. How it reaches your developers, why the setting that should stop it often does not, and what to check today.
01 How the fake font runs
S Code can run a task the moment you open a folder. Teams use it to
start a dev server or a linter. The instruction lives in
.vscode/tasks.json, a file most developers never read. They
open the project and get to work.
PolinRider’s version of that file has three parts OSM Sep 2026 :
- A harmless name. The task is labelled
eslint-check. It looks like a code-quality step. - No trace on screen. It is set to
"reveal": "never"and"hide": true, so no terminal opens. - A font that is code. The command runs
nodeagainst a file in a fonts folder. The "font" is obfuscated JavaScript, often pushed far to the right behind hundreds of tabs so it looks empty in an editor.
The copy we read on GitHub on 6 November went further. It chains the command three ways, so it runs on macOS, Linux and Windows, and fails silently where Node is missing.
Once running, the script looks up its next stage in public blockchain transactions. Addresses on TRON, Aptos and Ethereum hold the server details, so there is no fixed domain to block OSM Mar 2026 . The stealer then takes saved logins and cookies from Chrome, Edge, Brave and Firefox and targets about 150 browser extensions for password managers and crypto wallets GitGuardian 2026 . Other samples take SSH keys, environment variables and GitHub tokens.
02 The renaming game
For most of 2026 one GitHub search found thousands of infections: the
font name plus tasks.json. Defenders shared it widely. The
attackers noticed.
| First seen | Fake font | Note |
|---|---|---|
| Jan 2026 | fa-brands-regular.woff2 | Fake recruiter "coding assessment" |
| 25 Apr 2026 | fa-solid-400.woff2 | The name most detection rules still search for |
| 3 Sep 2026 | fa-solid-500.woff2 | 32 KB, padded with 421 tabs |
| 25 Sep 2026 | fa-solid-900.woff2 | A real Font Awesome file name. No padding |
| 28 Sep 2026 | fa-solid-300.llf | Not a font format |
| Late Oct 2026 | fa-brand-400.orc | Real name is fa-brands. ".orc" is a data format, not a font |
Sources: OpenSourceMalware, January and September 2026
OSM Jan 2026 OSM Sep 2026 . Our GitHub code
search on 6 November counted 2,470 task files pointing at
fa-brand-400.orc, 888 at fa-solid-900.woff2 and
462 at fa-solid-400.woff2. Search counts move daily and
include repositories that were already cleaned.
The researchers call it A/B testing. Each new name runs alongside the
old one until defenders catch up. The payload also moved out of the
top-level public/fonts folder into deeply nested project
paths. A rule that matches a file name or a path is out of date within
weeks.
The font is not even the main route any more. In July, about 94% of
infected repositories carried the code inside build configs such as
postcss.config.mjs, tailwind.config.js and
eslint.config.mjs, after the export, where it runs during
an ordinary build. The fake font accounted for about 6%
OSM Jul 2026 . And not every
fake font is PolinRider. A copycat called GhostAction reuses the same
task and font trick to steal cloud, npm, PyPI and SSH credentials, plus
Claude and Gemini config files OSM Oct 2026 .
03 How it reaches your team
Three routes, all through normal developer work.
- A job interview. The fake-font trick first appeared in North Korea’s Contagious Interview operation. A recruiter on LinkedIn sends a "coding assessment" on GitHub. The candidate opens it. In January the full infection took under 40 seconds OSM Jan 2026 .
- A repository you trust. Because PolinRider pushes with real developers’ credentials, the infected repository can be a client project, a contractor’s template or an open-source tool your team already uses.
- A package. Malicious packages linked to the campaign have appeared on npm, Packagist and Go, and in a Chrome extension. The earliest PolinRider npm versions date from May 2025 OSM Oct 2026 .
VS Code closed the easiest door in February. Since version 1.109 the
task.allowAutomaticTasks setting defaults to off
VS Code 1.109 . VS Code then asks
once per workspace, and automatic tasks "never run in an untrusted
workspace" VS Code docs . That
helps only if the developer says no. A candidate under time pressure on
an assessment clicks Trust and Allow. So does someone opening what looks
like a colleague’s repository. Machines where the setting was switched
on earlier, and older or forked editors, have no prompt at all.
04 What to check today
A team lead can run the first four checks this afternoon. Detect on what the code does, never on a file name.
- Set "task.allowAutomaticTasks": "off" explicitly in every developer’s VS Code user settings, update to 1.109 or later, and open any unknown repository in Restricted Mode
- Search your repositories, all branches, for tasks.json files containing "folderOpen", and for any command that runs node against a file in a fonts folder
- Find fake fonts by content: run the file command over every fonts folder. A real font is binary. Anything reported as text is suspect
- Check build configs (postcss, tailwind, eslint, next) for code after the export or after long runs of spaces, and .gitignore for config.bat or temp_auto_push.bat
- Turn on branch protection that blocks force-pushes on every repository that matters, and review recent force-push activity
- Tell your developers: a coding assessment from a recruiter is opened in a throwaway virtual machine, never on a work laptop
- Treat the developer’s machine as compromised. Rebuild it rather than clean it
- From a clean machine, rotate GitHub tokens, SSH keys, npm and cloud credentials, and signing keys. Revoke OAuth apps and personal access tokens
- Log out every browser session and move any crypto held on that machine
- Audit authorized_keys, cron, launchd, systemd and scheduled tasks on every server those credentials reached
OpenSourceMalware publishes a free scanner script for the known markers PolinRider scanner . Use it, and expect the next rename to miss it. What decides the damage is what one developer laptop can reach once it is infected. In a 14-day penetration test we show you exactly that: the repositories, pipelines and cloud keys, ranked, with the change that cuts each path. Start with your Threat Map. Enterprise-grade. Not enterprise-priced.
References
Sources
- OpenSourceMalware. DPRK Contagious Interview "Fake Font" abuses VS Code tasks. 28 January 2026. opensourcemalware.com
- OpenSourceMalware. PolinRider: DPRK compromised hundreds of GitHub repos. 8 March 2026. opensourcemalware.com
- OpenSourceMalware. PolinRider’s blast radius grows. 15 July 2026. opensourcemalware.com
- OpenSourceMalware. PolinRider is A/B testing its way past your detections. 26 September 2026. opensourcemalware.com
- OpenSourceMalware. GhostAction copycats PolinRider by hiding a stealer in a fake font file. October 2026. opensourcemalware.com
- GitGuardian via Security Boulevard. GhostAction crosses paths with PolinRider: inside the October escalation. 27 October 2026. securityboulevard.com
- Visual Studio Code. Tasks documentation: automatic tasks and task.allowAutomaticTasks. code.visualstudio.com
- Visual Studio Code 1.109 release notes. Automatic tasks disabled by default. 4 February 2026. code.visualstudio.com
- OpenSourceMalware. PolinRider malware found in 2025 npm packages. 30 October 2026. opensourcemalware.com
- OpenSourceMalware. PolinRider scanner (polinrider-scanner.sh). GitHub. github.com