Guide
How to get rid of PolinRider: a developer's guide
Think PolinRider is on your computer or in your repositories? How to check with polinrider, clean up in the right order and keep it from coming back.
10 min read
Open source PolinRider malware scanner and cleaner
One open source program checks your computer, your GitHub account and your organisation for PolinRider malware, and helps you remove it safely. It is free, runs on macOS, Linux and Windows, and changes nothing until you type yes.
Last updated:
PolinRider is malware that hides inside software projects. Once it runs on a developer's computer, it steals their passwords and tokens, adds itself to the code they work on and pushes that code with their own account, so the next person who opens the project is hit too.
Choose your system. Run only its commands.
macOS
brew install meSingh/tap/polinrider-scannerLinux
brew install meSingh/tap/polinrider-scannerOn Debian or Ubuntu you can use the .deb from the latest release instead.
Windows
scoop bucket add mesingh https://github.com/meSingh/scoop-bucket
scoop install polinrider-scannerpolinriderIt asks What should I check? Type computer, or account or organization for GitHub. Answers are words, never numbers.
It only reads, and shows each check as it runs. A GitHub check copies every repository first, so the evidence is kept before anything is touched.
Clean
None of today's signs found. Not proof it was never there: if you had a reason to check, change your passwords and tokens anyway.
Review
Something a normal project can also have. Read each [review] line and ask: did I put this here? If not, treat it as found.
Compromised
Something only the malware leaves. It lists what it found and the exact command for each next step. Go to step 5.
If it says it could not run, it tells you why, and it found nothing either way. Is it PolinRider or a false alarm?
The order is fixed. If you clean GitHub while an infected computer still holds a valid token, the malware pushes itself back within minutes. Why
Type yes and every confirmed file moves into a quarantine folder, with a list of how to put each one back. Nothing is deleted. A startup entry, a crontab line or a shell startup file is never changed for you: it prints the command that removes it.
If it says This machine cannot be trusted until it is rebuilt, quarantine contains it but only a clean reinstall makes it safe. Checking a computer
Change every one, from a different computer you trust: GitHub tokens and SSH keys, npm and cloud tokens, and the passwords saved in your browser.
First, every repository is copied into an evidence folder. Then each infected repository gets one of these five. When restore is offered, pick it.
| Fix | What it does | History rewritten? | Can you undo it? | When to pick it |
|---|---|---|---|---|
Restoretype restoreRecommended | Puts each branch back where GitHub's own push record says it was before the attack. Nothing is edited. | No. Each branch moves back to an earlier commit. | A copy from before is kept. | Whenever it is offered: GitHub's record shows a clean state, and that commit is checked clean first. |
Removetype remove | Adds one commit per branch that takes the malware out. | No. The malware stays in older commits. | Easy: it is one commit. | There is no clean state to go back to, and the history must stay as it is. |
Erasetype eraseRewrites history | Takes the malware out of every commit and pushes the history back. | Yes. Every commit ID changes, and every existing copy must be updated; it shows how. | A copy from before is kept. | There is no clean state to go back to, and the malware must be in no commit at all. |
Archivetype archive | Puts a large infected notice at the top of the README, rewrites the description and makes the repository read-only. | No. Nothing is removed. | A copy from before is kept. | A repository nobody uses. |
Skiptype skip | Leaves it as it is for now. | No. | Nothing changed. | You want to decide later. |
Each fix shows exactly what would change on GitHub and pushes only after you type yes. Afterwards, delete every local copy and clone it again. A GitHub account · An organisation
Add the scanner to your CI, so a reinfection is caught on the next push. Every future push
Before you run it
It is built for a computer that may already be infected, run by someone under stress. So it looks first, shows you everything and changes only what you agree to.
What it cannot promise: signatures change, so a clean result is about today's signs. Change your passwords anyway if you had a reason to check. The full disclaimer
Check it, do not take our word
Every week's indicator review is public: read them all.
Guide
Think PolinRider is on your computer or in your repositories? How to check with polinrider, clean up in the right order and keep it from coming back.
10 min read
Announcement
The project is now polinrider-scanner, at polinriderscanner.com. The program is the same; the package names and how you verify old releases change.
4 min read
Worth reading · OpenSourceMalware
Nine npm versions published in May 2025 after an account takeover carry the PolinRider payload, eight months before the first known victims.