What RepoCanary catches
Measured, not asserted. Every row on this page comes from running the real detection engine over a corpus of the techniques these campaigns use and recording which rules fire. Nothing is run, cloned, or installed: each sample is scanned as text, the same path a real scan uses.
Modelled on the documented playbooks of Contagious Interview, BeaverTail, InvisibleFerret, and OtterCookie, plus the wider npm and PyPI supply-chain scene.
- 69do not run
- 32flagged
- 0not caught
- Do not runa high-confidence signal fired
- Flaggedraised for human review
- Nothing known matchednever proven safe
Rule chips are coloured by severity: high, medium, low. Any high fires red; mediums and lows accumulate toward a flag.
Nine ways a repository can be a trap
Pick a category to jump to its techniques and the rules that catch each one.
Npm install-time
8 techniquesScripts that fire the moment npm install finishes, before you have read a line.
- 5do not run
- 3flagged
Other ecosystems
15 techniquesThe same trick in Python, Rust, Go, Gradle, Maven, PHP, Ruby, and notebooks.
- 11do not run
- 4flagged
Dependency poisoning
12 techniquesA dependency that is not what the manifest says: git sources, tarballs, lookalike names, poisoned lockfiles.
- 5do not run
- 7flagged
Obfuscation and loaders
12 techniquesPayloads hidden as encoded blobs, invisible characters, or two-stage loaders.
- 11do not run
- 1flagged
Credential theft
7 techniquesCode that reads browser passwords, wallets, SSH keys, keychains, and environment secrets.
- 4do not run
- 3flagged
Command and control
11 techniquesBeacons, dead drops, backdoors, and exfiltration to attacker infrastructure.
- 7do not run
- 4flagged
Auto-run on open
30 techniquesEditor, AI-agent, container, make, and CI hooks that run with no install step at all.
- 23do not run
- 7flagged
Manifest and persistence
3 techniquesShadowed commands, shell-startup persistence, and sandbox checks before activating.
- 2do not run
- 1flagged
Context signals
3 techniquesAccount and README signals that raise suspicion but never convict on their own.
- 1do not run
- 2flagged
The full catalog
Npm install-time
8 techniquesScripts that fire the moment npm install finishes, before you have read a line.
- 5do not run
- 3flagged
Npm install-time
8 techniquesScripts that fire the moment npm install finishes, before you have read a line.
- 5do not run
- 3flagged
BeaverTail postinstall pipes a download into a shell
Do not runlifecycle-scriptreadme-install-firstpreinstall runs base64-decoded code with node -e
Do not runlifecycle-scriptpostinstall runs a local file that fetches and runs code
Do not rundownload-and-executelifecycle-scriptpostinstall hands a download to bash by process substitution, no pipe to match
Do not runlifecycle-scriptreadme-install-firstprepare script (runs on git install) fetches and evals
Do not runlifecycle-scripta plain npm script the README asks you to run pipes a download into a shell
Flaggeddangerous-npm-scriptgypfile: true compiles and runs a native build during npm install
Flaggednative-build-at-installa frontend app that also pulls in server and raw network packages
Flaggedodd-dependency-mix
Other ecosystems
15 techniquesThe same trick in Python, Rust, Go, Gradle, Maven, PHP, Ruby, and notebooks.
- 11do not run
- 4flagged
Other ecosystems
15 techniquesThe same trick in Python, Rust, Go, Gradle, Maven, PHP, Ruby, and notebooks.
- 11do not run
- 4flagged
Python setup.py shells out at install time
Do not rundownload-and-executesetup-py-install-execRust build.rs reaches for the network at compile time
Do not runbuild-rs-network-execdownload-and-executeGradle build runs an external command
Do not rungradle-build-execMaven exec plugin downloads and runs during build
Do not runmaven-build-execrequirements.txt installs from a URL, not PyPI
Flaggedrequirements-url-dependencyPHP composer post-install script downloads and runs code
Do not runcomposer-install-scriptYarn Berry yarnPath points at a checked-in program, not the release bundle
Do not rundownload-and-executeyarnrc-yarnpatha Jupyter notebook code cell downloads and executes a payload
Do not rundownload-and-executepython-download-executeRuby native-extension build (extconf.rb) shells out at gem install time
Do not rundownload-and-executeruby-build-execa go:generate directive that downloads and runs a script
Do not rundownload-and-executego-generate-execGradle pulls dependencies from a plain-http repository
Flaggedgradle-insecure-repoMaven pulls dependencies from a plain-http repository
Flaggedmaven-insecure-reporequirements.txt redirects pip to a private index
Flaggedrequirements-custom-indexa Kotlin DSL Gradle build hands a download to a shell; commandLine("x") is the Kotlin spelling of commandLine 'x'
Do not rungradle-build-execYarn 1's .yarnrc points yarn-path at a checked-in program, the same hijack as Berry's yarnPath
Do not rundownload-and-executeyarnrc-yarnpath
Dependency poisoning
12 techniquesA dependency that is not what the manifest says: git sources, tarballs, lookalike names, poisoned lockfiles.
- 5do not run
- 7flagged
Dependency poisoning
12 techniquesA dependency that is not what the manifest says: git sources, tarballs, lookalike names, poisoned lockfiles.
- 5do not run
- 7flagged
lockfile resolves a familiar name to an attacker tarball
Do not runlockfile-off-registrynpm alias protocol installs a different package under a trusted name
Do not runnpm-alias-mismatcha scope one edit from @types
Flaggedscope-confusiondepends on a package confirmed malicious in these campaigns
Do not runknown-malicious-packageone-edit lookalike of a popular package, in a repository from a fresh account
Flaggednew-accounttyposquat-dependencymanifest asks for a version range, the lockfile resolves it from a git repository
Do not runlockfile-git-dependencylockfile-manifest-mismatcha dependency installed from a git source, not the registry
Flaggedmanifest-non-registry-dependencya deep dependency declares an install script
Flaggedtransitive-install-scriptcommitted .npmrc points npm at an attacker registry
Do not runnpmrc-registry-overridea committed .npmrc carries an auth token
Flaggednpmrc-committed-tokenan npm override sends a trusted name to a tarball URL
Flaggedoverride-redirecta committed .npmrc pointing npm at an unknown https registry with nothing else beside it; a company mirror and a hijack look the same, so it is a caution to read
Flaggednpmrc-registry-override
Obfuscation and loaders
12 techniquesPayloads hidden as encoded blobs, invisible characters, or two-stage loaders.
- 11do not run
- 1flagged
Obfuscation and loaders
12 techniquesPayloads hidden as encoded blobs, invisible characters, or two-stage loaders.
- 11do not run
- 1flagged
obfuscated eval(atob()) hidden in a build config
Do not rundynamic-code-executioneval-decoded-blobhex-obfuscationpayload-in-confignew Function('require', fetchedCode) staged loader
Do not rundownload-and-executedynamic-code-executionremote-code-executionchild_process assembled from string pieces to dodge scanners
Do not runstring-concat-api-hidinga zero-width character splits an identifier
Do not runinvisible-charactersUnicode Private Use Area characters hide a payload as blank space
Do not runprivate-use-steganographybidirectional override characters make the source read differently than it runs
Do not runbidi-overridea lookalike domain using a Cyrillic letter
Do not runhomoglyph-urla large base64 blob beside the code that decodes it
Do not runbase64-bloba loader parked after hundreds of spaces on a line that looks like a comment
Do not rundynamic-code-executionreadme-install-firstwhitespace-hidden-codea source file that is mostly hex data
Flaggedencoded-blob-densitythe self-rotating string table of an automated JavaScript obfuscator
Do not runhex-obfuscationobfuscator-iotext carried in Unicode tag characters, a block that renders as nothing at all
Do not rununicode-tag-smuggling
Credential theft
7 techniquesCode that reads browser passwords, wallets, SSH keys, keychains, and environment secrets.
- 4do not run
- 3flagged
Credential theft
7 techniquesCode that reads browser passwords, wallets, SSH keys, keychains, and environment secrets.
- 4do not run
- 3flagged
reads browser credential stores and a wallet extension by id
Do not runlure-themewallet-extension-idwallet-file-accessreads SSH keys and cloud credential files
Do not runwallet-file-accessreads the environment and posts it out
Do not runenv-exfiltrationwalks the filesystem hunting for wallet and seed files
Flaggedstealer-file-globbingpulls in keylogging and screen-capture components
Flaggedsurveillance-dependencyosascript pops a fake system password dialog to phish the login password
Do not runmacos-password-phisha keylogger and a screen-capture module wired into an app
Flaggedspyware-dependencysurveillance-dependency
Command and control
11 techniquesBeacons, dead drops, backdoors, and exfiltration to attacker infrastructure.
- 7do not run
- 4flagged
Command and control
11 techniquesBeacons, dead drops, backdoors, and exfiltration to attacker infrastructure.
- 7do not run
- 4flagged
bare IP on a Contagious Interview C2 port
Do not runc2-port-fingerprintdynamic-code-executioncalls documented BeaverTail command-and-control paths
Do not runbeavertail-c2-pathsInvisibleFerret remote-command handlers
Do not runbackdoor-command-handlersfetches its next server address from a Google Doc dead drop
Flaggeddead-drop-resolverposts collected data to a Discord webhook
Flaggedexfil-sinkopens a tunnel to reach the victim without a fixed server
Flaggedtunneling-infrauploads collected data to an anonymous file host
Flaggedexfil-sinksilently installs a remote-desktop tool for unattended access
Do not runremote-desktop-ratssh-backdoorspawns PowerShell with a base64-encoded command to hide the payload
Do not rundownload-and-executepowershell-encoded-commanduses certutil, a trusted Windows binary, to download the payload
Do not runwindows-lolbin-downloada disposable free-hosting endpoint on a campaign-style path
Do not runbeavertail-c2-pathsthrowaway-host-c2
Auto-run on open
30 techniquesEditor, AI-agent, container, make, and CI hooks that run with no install step at all.
- 23do not run
- 7flagged
Auto-run on open
30 techniquesEditor, AI-agent, container, make, and CI hooks that run with no install step at all.
- 23do not run
- 7flagged
VS Code task runs a command the moment the folder opens
Do not runvscode-autorun-taskdev container hook downloads and runs code on open
Do not rundevcontainer-dangerous-hookthe same dev container hook behind a comment and a trailing comma; devcontainer.json is JSONC, so the tooling runs it either way
Do not rundevcontainer-dangerous-hooka dev container configuration that cannot be parsed at all, so what it starts is unknown
Flaggedunparseable-autorun-configMakefile target pipes a download into a shell
Do not runmakefile-remote-execpull_request_target runs untrusted code with secrets
Flaggedworkflow-pwn-requestworkflow curls repository secrets out
Do not runworkflow-secret-exfiltrationDockerfile pipes a download into a shell during build
Do not rundockerfile-remote-execDockerfile saves a script on one line and runs it on a later one
Do not rundockerfile-remote-execMakefile target evaluates a download as command text
Do not runmakefile-remote-exec.pnpmfile.cjs runs code during pnpm install
Do not rundownload-and-executepnpm-install-hookVS Code settings point a linter at a checked-in binary run on folder open
Do not runvscode-tool-path-hijack.envrc runs on cd into the directory and downloads code
Do not rundirenv-envrcdocker compose service pipes a download into a shell
Do not runcompose-remote-execa dev container initializeCommand runs on the host, outside the container
Flaggeddevcontainer-initialize-commandDockerfile bakes a file straight from a URL into the image
Flaggeddockerfile-remote-adda make target decodes base64 into a command
Flaggedmakefile-obfuscated-commandworkspace settings inject environment variables into every terminal
Flaggedvscode-terminal-enva workflow that targets a self-hosted runner the candidate is asked to register
Flaggedworkflow-self-hosted-runnera checked-in MCP server the AI editor starts when the folder is opened
Do not rundownload-and-executemcp-server-autostartan agent hook runs a downloaded script while the coding agent works
Do not runagent-hook-autoruna .code-workspace file carries the tool-path hijack outside .vscode/
Do not runvscode-tool-path-hijacka dir-local eval form runs when a file in the directory is opened
Do not runemacs-dir-locals-evala project-local Neovim config spawns a process when the folder is opened
Do not rundownload-and-executeeditor-rc-autorunan instruction hidden in an HTML comment, aimed at the coding agent and invisible to the reader
Do not runagent-instruction-filean instruction file that displaces the agent's own instructions and tells it to hide what it does
Do not runagent-instruction-fileinstructions painted out of sight, so the rendered file and the file the agent reads differ
Do not runagent-instruction-filea forged system turn inside the file an agent reads as instructions
Do not runagent-instruction-filea markdown image whose address carries a secret, so rendering it is the exfiltration
Do not runagent-instruction-filea folder-open task whose args name a checked-in program by a bare relative path, with the interpreter in command and the file in args
Do not rundynamic-code-executionvscode-autorun-task
Manifest and persistence
3 techniquesShadowed commands, shell-startup persistence, and sandbox checks before activating.
- 2do not run
- 1flagged
Manifest and persistence
3 techniquesShadowed commands, shell-startup persistence, and sandbox checks before activating.
- 2do not run
- 1flagged
installs an executable that shadows the real npm command
Do not runbin-command-shadowinginstalls itself into a shell startup file to survive reboot
Do not runlifecycle-scriptstartup-persistencechecks for a VM before activating (OtterCookie behavior)
Flaggedsandbox-evasion
Context signals
3 techniquesAccount and README signals that raise suspicion but never convict on their own.
- 1do not run
- 2flagged
Context signals
3 techniquesAccount and README signals that raise suspicion but never convict on their own.
- 1do not run
- 2flagged
brand-new account, crypto theme, install-first README
Flaggedauthor-mismatchlure-themereadme-install-firstsingle-repo-accountREADME tells the victim to paste a shell command to fix a fake error
Do not runreadme-clickfixa company organization with no public members
Flaggedempty-org
Documented blind spots
6 kept in the openA tool that claims to catch everything is lying. These are techniques the static engine does not reliably catch, kept in the corpus and measured so the limit stays visible rather than quietly forgotten. This is why a green result never means safe.
a CI workflow pipes a script from an unknown host into a shell; it runs on the CI provider's machines, so it is reported as a note, not a caution
Not caughtworkflow-remote-scriptclean loader; payload only ever arrives from a normal-looking API at run time
Not caughtNo rule fires. This is a documented blind spot, kept visible on purpose.
malice would live in a dependency that resolves cleanly from the registry
Not caughtNo rule fires. This is a documented blind spot, kept visible on purpose.
no malicious code committed; the attack is an instruction delivered elsewhere
Not caughtNo rule fires. This is a documented blind spot, kept visible on purpose.
a one-edit lookalike in an established repository with no other signal stays informational
Not caughttyposquat-dependencya plausible but non-existent package name an LLM might hallucinate and an attacker register
Not caughtNo rule fires. This is a documented blind spot, kept visible on purpose.
Got a repo someone sent you?
Check it against every technique above before you run a single line, or before you open it in your editor.
Scan a repository