install
source · Clone the upstream repo
git clone https://github.com/Intense-Visions/harness-engineering
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/Intense-Visions/harness-engineering "$T" && mkdir -p ~/.claude/skills && cp -r "$T/agents/skills/codex/owasp-dependency-security" ~/.claude/skills/intense-visions-harness-engineering-owasp-dependency-security-a64910 && rm -rf "$T"
manifest:
agents/skills/codex/owasp-dependency-security/SKILL.mdsource content
Dependency Security
Manage third-party dependency risks with auditing, lockfiles, automated scanning, and supply chain hardening
When to Use
- Adding new dependencies to a project
- Setting up automated vulnerability scanning in CI
- Responding to a CVE in a dependency
- Reviewing the dependency tree for unnecessary packages
- Hardening the supply chain against typosquatting and malicious packages
Instructions
- Run
regularly and in CI. It checks installed packages against the npm advisory database for known vulnerabilities.npm audit
# Check for vulnerabilities npm audit # Fix automatically where possible npm audit fix # Only report high and critical severity npm audit --audit-level=high # CI gate — fail build on high/critical vulnerabilities npm audit --audit-level=high --production
-
Always commit lockfiles.
,package-lock.json
, oryarn.lock
pin exact dependency versions. Without a lockfile,pnpm-lock.yaml
can silently install different (potentially compromised) versions.npm install -
Set up automated dependency updates with Dependabot or Renovate.
# .github/dependabot.yml version: 2 updates: - package-ecosystem: npm directory: / schedule: interval: weekly open-pull-requests-limit: 10 groups: dev-dependencies: dependency-type: development update-types: [minor, patch] production-dependencies: dependency-type: production update-types: [patch] ignore: - dependency-name: '*' update-types: ['version-update:semver-major']
- Review new dependencies before adding them. Check these criteria:
# Check package health signals npm info <package> # Last publish date, maintainers, weekly downloads npx is-my-dep-secure <package> # Security audit # Manual checklist: # - Actively maintained? (commits within last 6 months) # - Trusted maintainer? (known individual or organization) # - Reasonable download count? (not a typosquat of a popular package) # - Small dependency tree? (fewer transitive deps = smaller attack surface) # - License compatible? (MIT, Apache-2.0, ISC are safe for commercial use)
- Use
for untrusted packages. Postinstall scripts can execute arbitrary code. Disable them globally and whitelist trusted packages.--ignore-scripts
# Disable all lifecycle scripts globally npm config set ignore-scripts true # Allow specific packages npx allow-scripts # Or use package.json { "scripts": { "preinstall": "npx only-allow pnpm" } }
- Pin critical production dependencies. For security-sensitive packages (auth, crypto, parsing), use exact versions instead of semver ranges.
{ "dependencies": { "jsonwebtoken": "9.0.2", "bcrypt": "5.1.1", "helmet": "7.1.0" } }
- Monitor for vulnerabilities continuously. Use GitHub's security alerts, Snyk, or Socket.dev for real-time notifications when new CVEs affect your dependencies.
# GitHub Actions — run audit on every PR - name: Security audit run: npm audit --audit-level=high --production
- Remove unused dependencies. Dead dependencies still introduce risk. Use
to find unused packages.depcheck
npx depcheck # Lists unused dependencies, missing dependencies, and unused devDependencies
- Use Subresource Integrity (SRI) for CDN-loaded scripts. If loading JavaScript from a CDN, use
attributes to verify the script has not been tampered with.integrity
<script src="https://cdn.example.com/lib.js" integrity="sha384-abc123..." crossorigin="anonymous" ></script>
- Keep Node.js itself updated. The runtime has its own vulnerability history. Use LTS versions and update when security patches are released.
Details
Supply chain attack vectors:
- Typosquatting:
instead oflodas
— a malicious package with a similar namelodash - Dependency confusion: A public package with the same name as an internal package — npm may pull the public one
- Maintainer compromise: Legitimate package maintainer's account is hacked (e.g., event-stream incident)
- Malicious postinstall scripts: Code runs during
before you ever import the packagenpm install
Dependency confusion prevention: Use scoped packages (
@company/utils), configure .npmrc to point to your private registry for scoped packages, and use npm-package-arg to detect resolution anomalies.
# .npmrc @company:registry=https://npm.company.com/
SBOM (Software Bill of Materials): Generate an SBOM for compliance and audit trails. Use
cyclonedx-npm or spdx-sbom-generator to produce machine-readable dependency inventories.
When to accept audit findings: Some vulnerabilities are in dev dependencies that never run in production, or in code paths your application does not exercise. Document accepted risks rather than ignoring them silently.
Common mistakes:
- Ignoring
output because "everything still works"npm audit - Not committing the lockfile (different installs on different machines)
- Using
without reviewing breaking changesnpm audit fix --force - Installing packages from unverified registries
- Running
in production instead ofnpm install
(lockfile not respected)npm ci
Source
https://cheatsheetseries.owasp.org/cheatsheets/Vulnerable_and_Outdated_Components_Cheat_Sheet.html
Process
- Read the instructions and examples in this document.
- Apply the patterns to your implementation, adapting to your specific context.
- Verify your implementation against the details and edge cases listed above.
Harness Integration
- Type: knowledge — this skill is a reference document, not a procedural workflow.
- No tools or state — consumed as context by other skills and agents.
Success Criteria
- The patterns described in this document are applied correctly in the implementation.
- Edge cases and anti-patterns listed in this document are avoided.