Scanner les Vulnérabilités (CVE) avec Trivy

Scanner les Vulnérabilités (CVE) avec Trivy

Trivy est un outil Open Source permettant de scanner les vulnérabilités (CVE) d'un conteneur ou d'un serveur en analysant les paquets installés, et en se référant à des bases de données de CVE distantes.
Regardons comment utiliser Trivy pour scanner les vulnérabilités d'une machine.

Présentation

Le code source de Trivy est consultable ici :

GitHub - aquasecurity/trivy: Find vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more
Find vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more - GitHub - aquasecurity/trivy: Find vulnerabilities, misconfigurations, secrets,...

C'est un projet maintenu, avec des mises à jour régulières et une forte communauté derrière. Il est notamment utilisé dans la registry Harbor en tant que scanner de vulnérabilités (CVE) des images Docker ainsi que des Charts Helm !

Il est possible avec Trivy de scanner :

  • Les CVE contenus dans un Repository Github/Gitlab
  • Les CVE d'un serveur
  • Les CVE d'une image Docker ou d'un Chart Helm
  • Les CVE d'un cluster Kubernetes
  • Les secrets (fichiers contenant des données sensibles comme des clés privées etc...) d'un filesystem

Et bien d'autres ! C'est ce que nous allons voir dans cet article.

L'intérêt principal de Trivy est son intégration dans une chaîne de CI/CD. Mais regardons comment l'utiliser autrement.

Scanner les CVE d'un serveur

Il existe plusieurs outils permettant de scanner les CVE d'un serveur comme Wazuh ou encore Greenbone OpenVAS mais ces logiciels sont assez lourds et disposent d'une interface web. Trivy a l'avantage d'être très léger, de s'installer très facilement, d'où son intégration dans les chaînes de CI/CD.

Pour scanner le filesystem d'une machine et analyser les paquets installés, il suffit d'exécuter la commande suivante :

trivy rootfs /
Exemple de retour :

<NOM DE LA VM> (debian 11.6)
===========================
Total: 1070 (UNKNOWN: 0, LOW: 802, MEDIUM: 78, HIGH: 182, CRITICAL: 8)

┌─────────────────────────────┬──────────────────┬──────────┬────────────────────────────┬───────────────┬──────────────────────────────────────────────────────────────┐
│           Library           │  Vulnerability   │ Severity │     Installed Version      │ Fixed Version │                            Title                             │
├─────────────────────────────┼──────────────────┼──────────┼────────────────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ apparmor                    │ CVE-2016-1585    │ LOW      │ 2.13.6-10                  │               │ In all versions of AppArmor mount rules are accidentally     │
│                             │                  │          │                            │               │ widened when ...                                             │
│                             │                  │          │                            │               │ https://avd.aquasec.com/nvd/cve-2016-1585                    │
├─────────────────────────────┼──────────────────┤          ├────────────────────────────┼───────────────┼──────────────────────────────────────────────────────────────┤
│ apt                         │ CVE-2011-3374    │          │ 2.2.4                      │               │ It was found that apt-key in apt, all versions, do not       │
│                             │                  │          │                            │               │ correctly...                                                 │
│                             │                  │          │                            │               │ https://avd.aquasec.com/nvd/cve-2011-3374                    │
├─────────────────────────────┤                  │          │                            ├───────────────┤                                                              │

La sortie de la commande vous affiche un tableau avec le nom du paquet ou de la lib, la CVE, sa criticité, la version contenant le correctif ainsi qu'une description.

Cette commande va également analyser si des secrets sont présents sur la machine. Cela concerne des fichiers sensibles comme des clés privées etc...

Il est possible de changer le format de sortie avec l'argument -f pour avoir un JSON par exemple !

Scanner les CVE d'une image Docker

Le scan de CVE d'une image Docker peut s'avérer très intéressant, d'autant plus si cela est intégré dans une pipeline CI/CD pour le build d'une image Docker par exemple.

Pour ce faire, il faut lancer la commande suivante :

trivy image NOM DE L'IMAGE:TAG 
Exemple :
trivy image python:latest 

Le retour de la commande est le même que pour la commande trivy rootfs.

Trivy prend en charge les images Docker au format tar. Pour ce faire, il faut d'abord exporter l'image Docker avec la commande docker save comme ceci :

docker save python:latest -o python-latest.tar

Et préciser le chemin du tar à Trivy comme ceci :

trivy image --input ruby-3.1.tar

Il est possible d'avoir le retour dans un fichier avec l'argument -o, combiné avec l'argument -f avoir un JSON et le récupérer en artifacts dans Gitlab CI par exemple !

Scanner les CVE d'un Repository Github/Gitlab

On ajoute parfois des dépendances à notre projet sans se poser la question de la sécurité. En effet, chaque dépendance (lib, module ou autre) comporte son lot de fonctionnalités, mais ouvre également des failles de sécurités et peut compromettre votre code.

C'est pour cela qu'analyser les CVE de votre Repository git peut s'avérer très intéressant.

Pour ce faire, il faut exécuter la commande suivante :

trivy repo URL DU REPO
Exemple :
trivy repo github.com/ansible/awx
🖐️
Il faut noter que si le repository n'est pas cloné sur la machine, git clone sera effectué

Conclusion

Trivy est un excellent outil, qui pourrait être une très bonne alternative à Wazuh ou encore Greenbone OpenVAS si l'on souhaite conserver uniquement le scan de CVE. Il est également possible de le coupler avec Grafana (Loki + Promtail), en voici un exemple de dashboard que j'ai pu créer :