Ga naar inhoud

Dependency scanning

De agent walkt elke 6h een aantal standaard project-locaties en parset lockfiles per package manager. Alleen (name, version, ecosystem, is_direct) tuples + het project_path worden naar de hub gestuurd — nooit file-inhoud, nooit env vars, nooit secrets.

Welke paden worden gescand

/var/www
/opt
/srv
/home/<user>
/root
/var/lib/jenkins/workspace
C:\inetpub\wwwroot (Windows)
C:\Program Files\nodejs (Windows)

Diepte: max 6 niveaus. Skipt node_modules, vendor, .git, .svn, .idea, .vscode, target, build, dist, __pycache__, en alles dat met . begint.

Welke lockfiles worden herkend

BestandEcosystem
package-lock.json (npm v1/v2/v3)npm
yarn.locknpm
pnpm-lock.yamlnpm
requirements.txtPyPI
Pipfile.lockPyPI
composer.lockPackagist
Gemfile.lockRubyGems
go.sumGo

Niet (yet) ondersteund: Cargo.lock, pubspec.lock, mix.lock, Maven pom.xml. PR’s welkom.

Caps om payload te bounden

  • Max 100 projecten per host
  • Max 20.000 packages totaal per host
  • node_modules-style transitives worden meegenomen maar is_direct=false gemarkeerd

Wat de hub ermee doet

De DependencyScanWorker neemt elke 30s (cold-start) of 6h (steady) alle unique (ecosystem, package_name, version) tuples uit inventory_dependencies en batch-queryt https://api.osv.dev/v1/querybatch (1000 tuples per call). Per match wordt de vuln-detail opgehaald van /v1/vulns/<id>, severity genormaliseerd, en geschreven naar inventory_dependency_cves.

Endpoint: GET /api/v1/agents/:id/inventory/dependencies → returnt:

{
"projects": [
{ "project_path": "/var/www/api", "manifest": "package-lock.json",
"ecosystem": "npm", "dep_count": 1248, "direct_count": 47,
"cve_count": 89, "critical_count": 3 }
],
"cves": [
{ "vulnerability_id": "GHSA-9jj7-4m8r-rfcm",
"severity": "CRITICAL", "package_name": "jackc/pgx/v5",
"installed_version": "5.7.0", "fixed_version": "5.9.0", ... }
]
}

Privacy

Wat WEL naar de hub gaat:

  • Project pad (bv. /var/www/api)
  • Package naam + versie
  • Ecosystem label
  • Direct/transitive flag

Wat NIET naar de hub gaat:

  • Lockfile-inhoud
  • Andere bestanden in het project (geen .env, geen broncode)
  • Sha256 van de lockfile zelf
  • Env vars uit het project

De npm ls output op de host zelf onthult exact dezelfde informatie aan iedereen met shell-toegang. We sturen niet meer dan dat.

Wat te doen met findings

inventory_dependency_cves rijen zijn idle data zonder operator-actie. Je kan ze:

  1. Bekijken in /agents/<id>Dependencies tab (per agent, per project)
  2. Fleet-wide doorzoeken in /inventory (filter op CVE-id, package, severity)
  3. Alert rule maken: trigger als een agent met tag production ≥1 CRITICAL dependency-CVE heeft (combineerbaar met threshold + duration)
  4. CSV exporteren voor je security-team

Limitaties die je moet weten:

  • Geen typosquatting-detectie (react-dom vs react.dom). OSV.dev matcht alleen op exacte (pakket, versie).
  • Geen malicious install-script-detectie (post-install hooks die backdoors plaatsen).
  • Geen detectie van gecompromitteerde maintainer accounts waar legitieme versies plots malicious worden.

Voor die drie zou je tools zoals Socket.dev of npm audit signatures (sigstore) moeten toevoegen — staat op de roadmap.