Logo Arboris
Auth & SécuritéSûr100100/100

cve-scan

Scans project dependencies against CVE databases (OSV.dev, NVD) from package.json and other lockfiles. Use when the user asks for CVE, vulnerabilities, security advisories, OSV, NVD, npm audit, or /cve.

ou envoie-le directement à ton agent.

Installer dans ton projet

$ npx arboris-cli install cve-scan
Contenu à copier
---
name: cve-scan
description: >-
  Scans project dependencies against CVE databases (OSV.dev, NVD) from
  package.json and other lockfiles. Use when the user asks for CVE, vulnerabilities,
  security advisories, OSV, NVD, npm audit, or /cve.
metadata:
  origin: Arboris
---

# CVE scan — dépendances

Interroge les **API CVE** (source de vérité : [OSV.dev](https://osv.dev)) à partir des manifests du repo. Ne pas se limiter à `npm audit`.

## When to Activate

- Scan CVE / vulnérabilités de dépendances (`/cve`, « y a-t-il une faille ? »)
- Revue d’un `package.json`, lockfile, SBOM ou bump de deps
- Avant merge / release, ou après une alerte (GHSA, CVE-…)
- Projet polyglot (npm, PyPI, Maven, Go, Cargo, Ruby, PHP, NuGet, …)

## 1. Inventaire des manifests

Cherche à la racine **et** dans les workspaces (ignore `node_modules`, `vendor`, `dist`, `.git`) :

| Écosystème OSV | Manifests / lockfiles |
|---|---|
| `npm` | `package.json`, `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lock` |
| `PyPI` | `requirements.txt`, `poetry.lock`, `Pipfile.lock`, `pyproject.toml` |
| `Maven` | `pom.xml`, `gradle.lockfile` |
| `Go` | `go.mod`, `go.sum` |
| `crates.io` | `Cargo.lock` |
| `RubyGems` | `Gemfile.lock` |
| `Packagist` | `composer.lock` |
| `NuGet` | `packages.lock.json`, `*.csproj` |
| `Hex` | `mix.lock` |
| `Pub` | `pubspec.lock` |

**Versions résolues** : lockfile > manifest. Sans lockfile, scanner au moins les deps **directes** et le signaler (faux négatifs transitifs).

Prod + dev par défaut (supply chain). Prod-only seulement si l’utilisateur le demande.

## 2. Extraire `(ecosystem, name, version)`

Pour npm, extraire depuis le lockfile (pas à la main sur un gros `package-lock.json`) :

```bash
node --input-type=module -e '
import { readFileSync } from "node:fs"
const lock = JSON.parse(readFileSync("package-lock.json","utf8"))
const pkgs = lock.packages ?? {}
const out = []
for (const [path, meta] of Object.entries(pkgs)) {
  if (!path || path === "") continue
  const name = path.replace(/^node_modules\//, "").replace(/\/node_modules\//g, "/")
  if (meta.version) out.push({ name, version: meta.version, ecosystem: "npm" })
}
console.log(JSON.stringify(out))
'
```

Déduplique `(ecosystem, name, version)`. Cap : lots de **1000** max pour `querybatch`.

## 3. Interroger OSV (obligatoire)

Base : `https://api.osv.dev` — pas de clé. Ne pas inventer de CVE.

**Un package** (détail complet) :

```bash
curl -sS https://api.osv.dev/v1/query \
  -H 'Content-Type: application/json' \
  -d '{"version":"4.17.20","package":{"name":"lodash","ecosystem":"npm"}}'
```

**Lot** (IDs seulement, même ordre que `queries`) :

```bash
curl -sS https://api.osv.dev/v1/querybatch \
  -H 'Content-Type: application/json' \
  -d '{"queries":[{"package":{"name":"lodash","ecosystem":"npm"},"version":"4.17.20"}]}'
```

Règles OSV :

- `name` + `ecosystem` **ou** `purl`, pas les deux
- `version` **ou** purl versionné, pas les deux
- écosystème et nom **case-sensitive** (`npm`, `PyPI`, `Maven`, `Go`, `crates.io`, `RubyGems`, `Packagist`, `NuGet`, `Hex`, `Pub`)

**Détail** pour chaque ID touché (critique/haut en priorité) :

```bash
curl -sS "https://api.osv.dev/v1/vulns/GHSA-xxxx-xxxx-xxxx"
```

Champs utiles : `id`, `aliases` (CVE-…), `summary`, `severity`, `affected[].ranges`, `references`.

Pagination `querybatch` : si `next_page_token` sur un item, relancer **cet** item avec `page_token`.

## 4. Enrichir (optionnel)

- **NVD** (score CVSS d’un CVE connu) :
  `curl -sS "https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2024-XXXXX"`
  Rate-limit sans clé : rester sobre (seulement les HIGH/CRITICAL).
- **Audit natif** en complément, pas en remplacement :
  - npm / pnpm / yarn / bun → `npm audit --json` (ou équivalent)
  - Python → `pip-audit` si dispo
  - Go → `govulncheck` si dispo
  - Rust → `cargo audit` si dispo

Ne pas installer d’outil lourd (`osv-scanner` Go, Docker) si l’API suffit.

## 5. Compte-rendu

Trier **CRITICAL → HIGH → MODERATE → LOW**. Ignorer le bruit LOW hors runtime sauf demande.

Tableau :

| Package | Version | Éco | ID (CVE / GHSA) | Sévérité | Fix | Action |
|---|---|---|---|---|---|---|

Pour chaque finding actionnable :

1. version corrigée (`affected` / `database_specific` / advisory)
2. directe vs transitive
3. action : bump ciblé, `overrides`/`resolutions`, ou *risk accepted* (justifié)

**Ne pas** modifier `package.json` / lockfiles sauf si l’utilisateur demande le fix. Proposer `/audit-deps` (fix npm) et `/ncu` (maj versions).

Si aucun manifest : expliquer et s’arrêter. Si l’API échoue : coller l’erreur, basculer sur l’audit natif, le dire.

## Compléments

- Revue code (auth, XSS, secrets) → skill `security-review`, commande `/security-diff`
- Config agent (`.claude/`) → skill `security-scan` — **pas** un scan de deps
Colle ce Markdown dans ton agent ou utilise les boutons ci-dessus pour l’écrire dans ton projet.

Ce que fait cve-scan

Scan CVE / vulnérabilités de dépendances (`/cve`, « y a-t-il une faille ? »)
Revue d’un `package.json`, lockfile, SBOM ou bump de deps
Avant merge / release, ou après une alerte (GHSA, CVE-…)
Projet polyglot (npm, PyPI, Maven, Go, Cargo, Ruby, PHP, NuGet, …)

Comment utiliser cve-scan

1
Copie le prompt
Un clic copie le prompt packagé (ou l'envoie à ton agent).
2
L'agent installe le skill
Il ajoute le SKILL.md et ses ressources à ton projet.
3
Activation automatique
Le skill s'active dès que le contexte correspond.

Déclencheurs pour cve-scan

Dis simplement à ton agent quelque chose comme :

Applique le skill cve-scan à cette tâche
Utilise cve-scan pour améliorer cette implémentation
Passe en revue ce sujet avec cve-scan

Skills liés à cve-scan