PushWarden overview
PushWarden is a free security tool that protects developer machines and GitHub repositories from the PolinRider / Contagious Interview supply-chain malware. It runs on Linux, macOS and Windows as a single program with no dependencies.
It works like an antivirus that knows one malware family very well. It catches a malicious file the moment it is written, moves it to quarantine before it can run, names the threat, and lets you decide in a native dialog whether to remove it for good or restore it.
The threat
PolinRider is a campaign attributed to North Korean (DPRK, Lazarus) operators. It targets software developers, often through fake job interviews in which the victim is asked to clone and run a repository. Between March and September 2026 it reached more than 2,000 GitHub owners and 4,000 repositories.
The malware:
- Hides loaders in ordinary project files. Obfuscated JavaScript is appended to framework config files such as
postcss.config.mjs,eslint.config.mjsandnext.config.js, placed in files that pretend to be fonts (fa-solid-900.woff2), and started by.vscode/tasks.jsontasks that run when a folder is opened. - Runs as soon as the project is opened or built. Opening the folder in VS Code, running the dev server or installing dependencies is enough.
- Steals credentials. Tokens, SSH keys, browser sessions, wallet files and environment files are collected and sent to command-and-control (C2) servers.
- Spreads through git. With a stolen token it rewrites repositories and force-pushes the backdoor to every branch it can reach, so colleagues who pull become infected too.
- Stays on the machine. It installs remote access tools and persistence entries (systemd units, LaunchAgents, scheduled tasks, cron lines).
What PushWarden does about it
| Capability | What it means | Guide |
|---|---|---|
| Real-time file protection | Every script, config, font, image and editor task file written under your project folders is scanned within a second | Real-time guard |
| Process and network watch | Every 5 seconds: running processes and connections to known C2 addresses are checked, and confirmed payloads are killed | Real-time guard |
| Scheduled full sweep | Every 6 hours: every repository plus the host (persistence, remote access tools, editor injection, exposed credentials) | Real-time guard |
| On-demand scan | Scan any folder or the whole home directory, interactively or in CI | Scanning |
| Reversible response | Payloads are stripped by byte offset or the file is quarantined; everything can be restored | Response and recovery |
| Native dialogs and notifications | Desktop notifications name the threat; a dialog shows the evidence and asks what to do | Response and recovery |
| C2 firewall block | Outgoing traffic to the C2 servers is dropped system-wide and the block survives reboots | Blocking C2 servers |
| Editor and npm hardening | Turns off automatic tasks and turns on workspace trust in every VS Code-family editor | Hardening |
| GitHub clean-up | Removes the malware from every branch of every repository you can push to, without rewriting history | Cleaning GitHub repositories |
| Guided screens | The easy way to clean your GitHub repositories: sign in, tick repositories, check, review, fix. Opens from the Start menu on Windows and the Applications folder on macOS | Guided screens |
| CI gate and pre-commit hook | Fails a pipeline or refuses a commit that carries an indicator | CI and automation |
| Complete activity record | Every finding, action, decision, sweep and error is journaled and searchable | Activity history |
| Team reporting | Webhook alerts, a redacted feedback bundle, an opt-in daily digest and an opt-in central event upload | Team reporting |
| Signed self-update | Indicators refresh daily; the program updates itself after verifying a signature, and rolls back if a release fails | Updates |
| Bounded footprint | Every store on disk has a size or age limit that is enforced daily | Disk use and cleanup |
Design principles
- Per user, no administrator rights. Installation, the background guard and every command run as your user. Only the optional firewall block needs elevated rights, and it asks once.
- Every destructive step is reversible. A file is copied to quarantine before it is stripped or deleted.
pushwarden historyputs it back. - Evidence first. A file is acted on only with strong evidence: a literal campaign signature, a known key or hash, or a file whose content does not match its type. Heuristic findings are reported and never acted on automatically.
- Explained decisions. Every finding carries a one-sentence reason for its severity, and every response carries a reason for what was done.
- Indicators are data. All signatures live in one file,
iocs.json, which is updated daily without a new release. - Nothing leaves the machine unless you opt in. Alerts by webhook, the daily digest and the central upload are all off until you set their URL.
Supported platforms
| Platform | Versions | Real-time backend | Service manager |
|---|---|---|---|
| Linux | x86-64 and ARM64, any distribution with a recent kernel | inotify | systemd user service |
| macOS | 11 or later, Intel and Apple silicon | kqueue | LaunchAgent |
| Windows | 10 and 11, x86-64 and ARM64 | ReadDirectoryChangesW | Scheduled Task |
Where a native watcher is unavailable the guard falls back to polling.
Project status
PushWarden is in early development (version 0.x). Releases are frequent while detection is extended for new variants. Up to version 0.4 it was called ThreatScan; see Moving from ThreatScan. It is a single Go program; the earlier Python versions (v4, v5) are archived on the archive/python-v5 branch.
Where to go next
- Installation to set it up.
- Quick start for the commands you will use most.
- Guided screens to clean your GitHub repositories with ease.
- How it works for the architecture.
- Command-line reference for every option of every command.