lote.guide
esc
  • npm lifecycle scriptsscripts field in package.jsonNode.js
  • setup.py arbitrary code executionsetup.py in source distributions (sdist)Python
  • NODE_OPTIONS preload injectionNODE_OPTIONS environment variable, CLI flags, or .env files loaded via --env-fileNode.js
  • .pth file import execution*.pth files on sys.path (commonly site-packages)Python
  • binding.gyp / node-gyp native compilationbinding.gyp file in the package rootNode.js
  • Corepack (packageManager field)"packageManager" field in package.json, COREPACK_HOME cache directoryNode.js
  • .npmrc registry manipulation.npmrc file (project, user, or global)Node.js
  • overrides / resolutions dependency swapoverrides (npm) or resolutions (Yarn) field in package.jsonNode.js
  • pnpm hooks (pnpmfile.cjs).pnpmfile.cjs in the project rootNode.js
  • .yarnrc.yml plugins and registry.yarnrc.yml in the project rootNode.js
  • pyproject.toml build backendspyproject.toml [build-system] tablePython
  • sitecustomize / usercustomize auto-importsitecustomize.py / usercustomize.py on sys.path (usually site-packages)Python
  • .node native addon loading.node files in node_modules/ (typically under build/Release/ or prebuilds/)Node.js
  • Yarn Plug'n'Play (.pnp.cjs).pnp.cjs in the project rootNode.js
  • __init__.py execution on import__init__.py in any package directory on sys.pathPython
  • .pyc bytecode cache poisoning.pyc files in __pycache__/ directories alongside source modulesPython
  • PYTHONPATH / PYTHONHOME module shadowingPYTHONPATH / PYTHONHOME environment variablesPython
  • npx / npm exec remote executionnpx, npm exec, npm create / npm init (initializer flows)Node.js
  • conftest.py auto-loading (pytest)conftest.py files in any directory pytest traversesPython
  • NODE_PATH environment variableNODE_PATH environment variableNode.js
  • "imports" field (subpath imports)imports field in package.jsonNode.js
  • require.extensions / Module._extensionsrequire.extensions / Module._extensions in any loaded moduleNode.js
  • .egg files and EGG-INFO scripts.egg files in site-packages (registered via easy-install.pth)Python
  • Zip imports (zipimport).zip / .pyz files on sys.path, or passed directly to the interpreterPython
  • PYTHONSTARTUP environment variablePYTHONSTARTUP environment variablePython
  • node_modules/.hooks/ directorynode_modules/.hooks/ directoryNode.js
Node.js
Invocation / runtime/CLI flag/Explicit

npx / npm exec remote execution

Immediately on invocation, with full process permissions

Lives in
npx, npm exec, npm create / npm init (initializer flows)
Attacker needs
Registry / config control
Lifecycle
Install
Startup
your code
Module load
Runtime
REPL

Runs when someone invokes a command or tool, with full process permissions.

How it runs

npx (and npm exec) fetches a package from the registry, installs it into a throwaway cache, and runs the binary named in its bin field. You never added it to package.json. You might not even have a project yet.

npx create-next-app@latest
npx -y cowsay hello   # -y skips the install confirmation

Those commands pull down the package and its dependencies, then run its CLI with full access to your machine's filesystem, env vars and network. Lifecycle scripts (preinstall, postinstall) still run as part of the install step.

What people actually hit is typosquatting. You fat-finger a name, copy a blog command with a typo, or run npx @scope/some-cli where the scope is one character off. npx resolves whatever string you pass on the public registry. If a squatter owns that name, you just executed their code. You can even run straight from a tarball URL via --package=, which fetches whatever is at that URL right now, with no lockfile guarantees. And npx leaves little trace in the project, which makes audits after the fact hard.

Defend

Verify package names before running; avoid pasting npx one-liners from docs; use a private registry; prefer pinned local devDependencies over ad-hoc npx.