Aller au contenu

Sécurité supply-chain

monsys.ai couvre trois catégories de risques supply-chain :

  1. Paquets OS — apt/rpm/winget/wmic → NVD + EPSS
  2. Images conteneurs — Docker images → Trivy (côté hub)
  3. Dépendances applicatives — npm/pip/composer/go/gem → OSV.dev

Aucune des trois ne nécessite de logiciel supplémentaire sur l’hôte client. L’agent remonte noms + versions ; la hub fait le travail CVE.

L’agent lit l’état du gestionnaire de paquets :

OSSource
Debian/Ubuntudpkg-query -W
RHEL/Alma/Rockyrpm -qa
Alpineapk info -vv
Windowswinget list avec fallback wmic product get

Résultat par agent : ligne inventory_packages avec (name, version, manager). La hub matche contre le feed NVD courant + probabilité d’exploit EPSS, avec parsing des plages de versions pour les expressions exactes, geq/leq et multi-range.

Par match un risk_score est calculé :

base = cvss × max(epss, 0.05)
× 1.5 si CVE > 30 jours sans patch (age factor)
× 2.0 si exploit public connu (exploit factor)
× 1.5 si le paquet écoute sur un port internet-facing
capped at 10.0

L’internet-exposure est déduit de inventory_portsaddress NOT IN ('127.0.0.1', '::1'), matché sur le nom de processus.

Endpoint : GET /api/v1/inventory/cves (fleet-wide) ou ?agent=<uuid> (par hôte). Filtres : cve, pkg, min_cvss, tag. Export CSV : &format=csv.

Pour les clients qui font tourner Docker, l’agent remonte les lignes inventory_containers — nom + tag d’image, image-digest, run-state, port mappings, run-as user, cap_add, privileged flag.

La hub fait tourner trivy image --severity=HIGH,CRITICAL --scanners=vuln contre chaque (image, tag) unique toutes les 6h. Trivy utilise la base officielle (miroir de GitHub Advisory + NVD) ; nous synchronisons cette DB une seule fois sur la hub.

Important : Trivy n’est pas sur l’hôte client. Nous avons brièvement considéré cette approche, mais elle exige root et installation de logiciel chez chaque client. L’approche hub-side fonctionne pour :

  • Registries publics (Docker Hub, GHCR, Quay) — immédiat
  • Registries privés — un seul trivy registry login sur le hub host

Les findings vont dans inventory_container_cves et sont visibles dans l’onglet Containers de chaque agent.

Limites :

  • Pas de scan pour les images uniquement disponibles via un registry privé derrière un VPN auquel la hub n’a pas d’accès réseau. Pour ce scénario voir RFC-0001 Tailscale integration.
  • Pas de scan du contenu d’exécution (process tree, secrets montés) — uniquement ce qui est dans les manifests d’image.

Dépendances applicatives (npm/pip/composer/go/gem)

Section intitulée « Dépendances applicatives (npm/pip/composer/go/gem) »

L’agent parcourt /var/www, /opt, /srv, /home/*, /root (profondeur max 6) et parse les lockfiles :

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

Seuls les tuples (name, version, ecosystem, is_direct) sont envoyés à la hub — pas de contenu de fichier. Caps par hôte : 100 projets max, 20 000 packages max, 6 niveaux de profondeur max. node_modules, vendor, .git sont skipped.

Le DependencyScanWorker de la hub batch-query https://api.osv.dev/v1/querybatch (1000 tuples/requête, gratuit, public). Pour chaque match il récupère le détail vuln depuis /v1/vulns/<id>, normalise la sévérité, et écrit dans inventory_dependency_cves.

Cadence cold-start : toutes les 30s pendant les 15 premières minutes après hub-start (capture les nouveaux deps), ensuite 6h steady.

  • CVE connues avec aliases (CVE-, GHSA-, PYSEC-, RUSTSEC-, …)
  • Plages de versions affectées avec fix-versions
  • Sévérité depuis GitHub Advisory DB (normalisée par nous vers CRITICAL/HIGH/MODERATE/LOW)
  • Aliases cross-ecosystem — un GHSA peut couvrir à la fois npm et Python
  • Typosquattingreact-dom vs react.dom. Pas de détection de patterns.
  • Scripts d’install malicieuxnpm install d’un paquet d’apparence légitime qui pose des backdoors. Demande analyse de tarball.
  • Comptes mainteneur compromis où un paquet normal contient soudain du code malicieux (style event-stream).

Pour ces catégories, vous avez besoin d’analyse comportementale comme Socket.dev ou npm audit signatures (signature sigstore). Les deux pourront être intégrés plus tard.

  1. npm ci --ignore-scripts en CI et production — npm install uniquement en dev où vous savez ce que vous lancez.
  2. Pinnez les dépendances de production (package-lock.json committé, pas de ranges ^X.Y.Z).
  3. Mettez une alert rule : nouvelle CVE CRITICAL dans inventory_dependency_cves pour un agent avec tag production → notify dans la minute.
  4. Maintenance windows pendant les deploys — sinon votre rolling-update déclenche une tempête d’alertes.
  5. Audit log review hebdo pour les actions playbook_run ou branding-PUT anormales.