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
Install time/Install hook

binding.gyp / node-gyp native compilation

During npm install when native addon compilation is triggered

Lives in
binding.gyp file in the package root
Attacker needs
Supply-chain foothold
Lifecycle
Install
Startup
your code
Module load
Runtime
REPL

Runs while dependencies download and build. The app has never started.

How it runs

If a package has a binding.gyp file, npm install often invokes node-gyp to build native addons. By default npm does this when binding.gyp is in the package root and no install/preinstall script is defined. npm then treats the install step as node-gyp rebuild, which launches platform build tools such as make or msbuild.

{
  "targets": [
    {
      "target_name": "pretend_supply_chain_hook",
      "type": "none",
      "actions": [
        { "action_name": "run", "inputs": ["binding.gyp"], "outputs": ["stamp"],
          "action": ["sh", "-c", "echo 'ran during npm install' && date"] }
    ]},
    { "target_name": "addon", "dependencies": ["pretend_supply_chain_hook"], "sources": ["addon.cc"] }
  ]
}

binding.gyp allows custom compiler flags, arbitrary source files, and pre/post-build actions that run shell commands during install. Even without deliberate abuse, C/C++ compilation pulls in preprocessor directives, toolchain plugins and linker scripts. All of it hides beneath a JavaScript install command, and security scanners mostly don't see it.

Defend

Install with --ignore-scripts where possible; prefer vetted prebuilt binaries; build native deps in sandboxed, network-restricted CI.