Dependency and lockfile supply-chain security review with 2025–2026 attack campaign patterns. Use when reviewing package.json, pyproject.toml, requirements.txt, pixi.toml, conda-lock.yml, or any lockfile; when evaluating a new dependency for addition; or when responding to a supply-chain compromise incident. Contains patterns for detecting maintainer-account-takeover style attacks that CVE scanners miss.
The dominant supply-chain threat is maintainer account takeover of legitimate, widely-trusted packages — not typosquatting. Your CVE scanner will not catch these.
Active campaigns:
Shai-Hulud: 500+ npm packages compromised via maintainer account takeover
TeamPCP: Trivy, Checkmarx, LiteLLM, Bitwarden CLI, SAP CAP — targeted at security tooling
axios: 100M weekly downloads; compromise via release tag hijack
LiteLLM 1.82.8: malicious .pth file injected for persistent execution on every Python startup
New dependencies are held for ≥7 days before merging — most malicious releases are yanked within hours
Version pins in lockfile match expected package metadata (author, homepage, hash)
No unpinned latest or * in production dependency specs
Incident response
When a compromise is reported:
Identify affected version range from the advisory
Check if that version range is in the lockfile
Check if the install was cached (CI cache may still contain the compromised version)
Rotate any secrets or tokens accessible from the CI environment where the package ran
Check for persistence artifacts: .pth files, postinstall side effects, modified node_modules/.bin/
Findings format
Name the vulnerability class, cite the package name + version + advisory or campaign name, state blast radius (what can the package access at install time), and propose the fix (version pin, lockfile update, --ignore-scripts).
1---2name: supply-chain-dependency-security3description: Dependency and lockfile supply-chain security review with 2025–2026 attack campaign patterns. Use when reviewing package.json, pyproject.toml, requirements.txt, pixi.toml, conda-lock.yml, or any lockfile; when evaluating a new dependency for addition; or when responding to a supply-chain compromise incident. Contains patterns for detecting maintainer-account-takeover style attacks that CVE scanners miss.4---56# Supply Chain Dependency Security78## Threat Model (2025–2026)910The dominant supply-chain threat is **maintainer account takeover of legitimate, widely-trusted packages** — not typosquatting. Your CVE scanner will not catch these.1112Active campaigns:13- **Shai-Hulud**: 500+ npm packages compromised via maintainer account takeover14- **TeamPCP**: Trivy, Checkmarx, LiteLLM, Bitwarden CLI, SAP CAP — targeted at security tooling15- **axios**: 100M weekly downloads; compromise via release tag hijack16- **LiteLLM 1.82.8**: malicious `.pth` file injected for persistent execution on every Python startup1718## Review Checklist1920### Lockfiles2122- [ ] Lockfile committed (`package-lock.json`, `yarn.lock`, `poetry.lock`, `uv.lock`, `pixi.lock`, `conda-lock.yml`)23- [ ] Lockfile is used in CI (`npm ci`, `pip install --require-hashes`, `uv sync --frozen`, `pixi install`)24- [ ] No floating version specs in production paths (e.g., `*`, `>=x` without upper bound in lockfile-less environments)2526### Install-time script execution2728- [ ] `npm ci --ignore-scripts` (or `ignore-scripts=true` in `.npmrc`) in all CI environments29- [ ] `preinstall`/`postinstall` hooks are the dominant execution vector — verify no hooks run untrusted code30- [ ] Python: check for unexpected `.pth` files that execute on every interpreter start:31 ```bash32 find $(python -c "import site; print(site.getsitepackages()[0])") -name "*.pth"33 ```3435### Dependency freshness and cooldown3637- [ ] New dependencies are held for ≥7 days before merging — most malicious releases are yanked within hours38- [ ] Version pins in lockfile match expected package metadata (author, homepage, hash)39- [ ] No unpinned `latest` or `*` in production dependency specs4041### Incident response4243When a compromise is reported:441. Identify affected version range from the advisory452. Check if that version range is in the lockfile463. Check if the install was cached (CI cache may still contain the compromised version)474. Rotate any secrets or tokens accessible from the CI environment where the package ran485. Check for persistence artifacts: `.pth` files, `postinstall` side effects, modified `node_modules/.bin/`4950## Findings format5152Name the vulnerability class, cite the package name + version + advisory or campaign name, state blast radius (what can the package access at install time), and propose the fix (version pin, lockfile update, `--ignore-scripts`).
Run npx skillmds add uw-ssec/supply-chain-dependency-security in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Dependency and lockfile supply-chain security review with 2025–2026 attack campaign patterns. Use when reviewing package.json, pyproject.toml, requirements.txt, pixi.toml, conda-lock.yml, or any lockfile; when evaluating a new dependency for addition; or when responding to a supply-chain compromise incident. Contains patterns for detecting maintainer-account-takeover style attacks that CVE scanners miss. It is listed under Marketing & Growth on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: makes network calls. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
uw-ssec (@uw-ssec) published this skill. Their other Agent Skills are listed on their SkillMD profile.