Skip to main content

Tirer le meilleur parti de snyk test avec JSON

Écrit par
Headshot of Tim Kadlec

Tim Kadlec

29 juin 2017

0 minutes de lecture

La commande snyk test analyse les dépendances de votre application pour détecter d’éventuelles vulnérabilités connues. Si elle en découvre, la commande renvoie une erreur et affiche dans la console des informations sur les vulnérabilités ainsi que sur la manière d’y remédier.

Elle fonctionne très bien dans un environnement CI et fournit de nombreuses informations exploitables. Mais vous souhaiterez parfois aller plus loin : manipuler les résultats des tests ou créer un rapport local facile à partager. C’est là qu’intervient l’option --json, qui exporte les résultats de snyk test au format JSON.

Nous allons vous présenter quelques possibilités offertes par snyk test --json, ainsi que quelques outils gratuits.

L’option JSON

La commande snyk test --json renvoie un objet JSON contenant des informations utiles sur votre projet. Voici le format de base de cet objet :

{
  "ok": false,
  "vulnerabilities": [...],
  "dependencyCount": 72,
  "org": "myOrg",
  "licensesPolicy": null,
  "isPrivate": true,
  "packageManager": "rubygems",
  "summary": "2 vulnerable dependency paths",
  "filtered": {
    "ignore": [],
    "patch": []
  },
  "uniqueCount": 1
}

De plus, vulnerabilities contient des informations détaillées sur chaque vulnérabilité détectée :

{
    "title": "",
    "credit": [],
    "description": "",
    "moduleName": "",
    "language": "",
    "packageManager": "",
    "semver": {
      "unaffected": [],
      "vulnerable": []
    },
    "identifiers": {
      "CWE": [],
      "CVE": []
    },
    "CVSSv3": "",
    "severity": "",
    "creationTime": "",
    "modificationTime": "",
    "publicationTime": "",
    "disclosureTime": "",
    "id": "",
    "packageName": "",
    "from": [],
    "upgradePath": [],
    "version": "",
    "name": "",
    "isUpgradable": false,
    "isPatchable": false
 }

Toutes ces informations vous offrent de nombreuses possibilités pour personnaliser les résultats de Snyk test.

Trier les vulnérabilités selon vos critères

Par défaut, snyk test signale les vulnérabilités dans l’ordre où elles sont détectées dans l’arbre de dépendances généré.

Il existe plusieurs outils pour traiter et réorganiser les résultats, mais nous utiliserons jq. jq est un processeur JSON en ligne de commande. Il vous permet de transmettre des données JSON par un pipe, de les filtrer, puis de renvoyer les données obtenues.

Avec jq, vous pouvez trier les résultats comme vous le souhaitez. Par exemple, vous pouvez trier les vulnérabilités par date de publication afin d’afficher les plus récentes en premier.

snyk test --json | jq '.vulnerabilities |= sort_by(.publicationTime) | .vulnerabilities |= reverse'

En ajoutant quelques lignes, vous pouvez aussi trier les vulnérabilités par niveau de gravité, afin d’afficher les plus critiques en premier.

snyk test --json | jq '.vulnerabilities|= map(. + {severity_numeric: (if(.severity) == "high" then 1 else (if(.severity) == "medium" then 2 else (if(.severity) == "low" then 3 else 4 end) end) end)}) |.vulnerabilities |= sort_by(.severity_numeric) | del(.vulnerabilities[].severity_numeric)'

Personnaliser la gravité des vulnérabilités

Vous pouvez également utiliser jq pour modifier le niveau de gravité d’une vulnérabilité si, pour une raison ou une autre, vous estimez qu’il devrait différer de celui indiqué par Snyk.

Par exemple, votre site utilise peut-être une version de Nokogiri qui présente une vulnérabilité d’exécution de code arbitraire de gravité élevée, mais votre équipe a conclu que l’utilisation de Nokogiri rend le problème moins grave. Vous pouvez alors utiliser jq pour modifier le niveau de gravité de la vulnérabilité dans vos rapports.

snyk test --json | jq '. | (.vulnerabilities[] | select(.id == "SNYK-RUBY-NOKOGIRI-20367").severity |= "low")

Générer un rapport HTML local

Le tableau de bord en ligne de votre projet détaille chaque vulnérabilité : son niveau de gravité, une description, les chemins vulnérables et bien plus encore. Pour obtenir une copie locale à partir des résultats de snyk test, vous pouvez utiliser notre outil open source Snyk JSON to HTML Mapper.

L’outil accepte les résultats de snyk test --json et génère un rapport HTML local, sans ressources externes. Pour l’utiliser, installez-le globalement avec npm install -g snyk-to-html. Ensuite, lorsque vous exécutez la commande test, vous pouvez transmettre directement les résultats au module, comme ceci :

snyk test --json | snyk-to-html -o results.html

La commande ci-dessus crée un rapport local à la mise en page soignée, sans dépendances externes.

Rapport Snyk test présentant une vulnérabilité XML External Entity de gravité élevée dans la dépendance Nokogiri, avec les chemins, les détails, les mesures correctives et les références.

Si vous personnalisez la sortie JSON avec jq, vous pouvez également transmettre les résultats modifiés. Par exemple, la commande suivante génère un rapport HTML local dans lequel les vulnérabilités sont triées par date de publication.

snyk test --json | jq '.vulnerabilities |= sort_by(.publicationTime) | .vulnerabilities |= reverse' | snyk-to-html -o results.html

Créer des rapports JSON sur mesure

La commande snyk test fournit déjà de nombreuses informations utiles. Si vous avez besoin de plus de flexibilité, snyk test --json répond à vos besoins. Avec quelques outils gratuits et un peu de créativité, vous pouvez adapter les résultats Snyk à vos besoins spécifiques.

Si vous utilisez la sortie JSON pour créer des rapports personnalisés ou ajouter des fonctionnalités, dites-le-nous. Nous serions ravis de découvrir ce que vous avez imaginé !

Lancez-vous dans les challenges Capture The Flag

Apprenez à résoudre des challenges Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.