- Prendre en compte la sécurité lors de l’écriture de code Go est une tâche complexe
- Quelques pratiques concrètes sont proposées afin d’aider à produire, si elles sont appliquées en continu, un code robuste, sûr et performant
Maintenir la version de Go à jour
- Il faut maintenir à jour la version de Go utilisée dans le projet
- Même sans utiliser les dernières fonctionnalités du langage, mettre à niveau Go permet de recevoir tous les correctifs de sécurité pour les vulnérabilités découvertes
- Les nouvelles versions de Go garantissent aussi la compatibilité avec les dépendances les plus récentes
- Le site de l’historique des versions de Go permet de vérifier quels problèmes de sécurité et quels CVE ont été corrigés dans chaque version, puis de mettre à jour le fichier
go.mod du projet vers la version la plus récente
- Après la mise à niveau de Go, il faut vérifier qu’aucun problème de compatibilité ou de dépendance n’est apparu
- Des analyseurs de code statique peuvent être utilisés pour évaluer la qualité et la sécurité du code
vet
- Le code Go peut être analysé avec la commande
go vet, fournie nativement par Go
- Exécutée sans argument, la commande
go vet s’exécute avec toutes les options autorisées par défaut
- Elle parcourt le code source et signale les problèmes potentiels
- Parmi les problèmes les plus courants, on trouve les erreurs liées aux goroutines, les variables inutilisées et les portions de code inaccessibles
staticcheck
- Staticcheck, un linter tiers, permet de trouver des bugs, de détecter des problèmes de performance et d’appliquer le style du langage Go
- Il explique les problèmes détectés et suggère des corrections avec des exemples
- En plus de son exécution dans un pipeline CI, il peut être installé en binaire autonome pour analyser le code en local
- Vérifier la version installée et s’assurer que tout est prêt pour lancer l’analyse
- Exécuté sans argument, il appelle par défaut tous les analyseurs de code
- Voir un exemple de ce qu’il peut trouver dans le dépôt GitHub NGINX Agent
- Les résultats de l’analyse peuvent être classés en trois catégories : paquets/méthodes/fonctions obsolètes, variables/champs inutilisés et problèmes liés à la qualité du code
golangci-lint
golangci-lint peut être installé avec la commande go install
- Vérifier la version pour confirmer que l’installation s’est bien passée
- Appelé sans argument, tous les linters sont exécutés
- Vérifier quels avertissements et suggestions il affiche dans le dépôt
agent cloné précédemment
- Le linter indique précisément le fichier et la ligne concernés
- Évaluer et modifier le code, puis relancer le linter et exécuter tous les tests unitaires
- Si les tests passent, committer le code mis à jour et le pousser vers le dépôt distant
Détection des conditions de course (race conditions)
- Une condition de course peut se produire lorsque plusieurs goroutines essaient d’accéder à une ressource en même temps
- Elle est détectée lorsqu’au moins une goroutine tente de modifier la ressource
- Go prend en charge nativement le test de ces situations via l’outil
test avec l’argument -race
- Le détecteur de race n’évalue que le code effectivement exécuté et ignore les chemins de code non exécutés, il faut donc d’abord lancer un analyseur de code statique pour vérifier l’absence de code mort
- L’exécution des tests en parallèle augmente les chances de détecter des problèmes de concurrence
Analyse du code source à la recherche de vulnérabilités
govulncheck
- Outil qui analyse une base de code à la recherche de vulnérabilités connues répertoriées dans la base de données CVEs
- Développé par l’équipe Go, il s’appuie sur une base de données dédiée aux vulnérabilités Go pour alimenter le scanner
- Installer la dernière version puis essayer les fonctionnalités de base
- Après avoir cloné le dépôt habit, exécuter l’outil depuis le répertoire racine
- Aucune vulnérabilité n’est détectée
- L’analyse d’un binaire peut révéler d’autres vulnérabilités
- Mettre à niveau Go vers la dernière version, récupérer les dépendances, puis vérifier que le logiciel et ses dépendances ne contiennent aucun CVE
gosec
- Analyseur de code statique qui aide à trouver des configurations de code non sûres
- Il peut être exécuté sur un système local ou dans un pipeline CI via GitHub Action
- Il propose une grande variété d’options et de règles pour configurer l’analyse
- Cloner un dépôt GitHub contenant du code Go à analyser puis lancer le scan depuis le répertoire racine
- Le rapport d’analyse permet de consulter une liste de problèmes potentiels triés par gravité et niveau de confiance
- Vérifier les CWE signalés et en apprendre davantage sur les faiblesses répertoriées
Fuzzing
- Dernière méthode pour vérifier la qualité du code et découvrir des vulnérabilités
- Il s’agit de tests automatisés spécialisés qui utilisent la couverture de test du code pour manipuler des données d’entrée générées aléatoirement
- Très utile pour trouver des failles de sécurité potentielles comme les buffer overflows, les injections SQL, les attaques DoS ou les attaques XSS
- Comme de nombreuses combinaisons d’entrées sont générées automatiquement, les développeurs n’ont pas besoin d’imaginer eux-mêmes des centaines ou des milliers de combinaisons de données d’entrée
1 commentaires
Avis Hacker News
govulncheckest un outil qui vérifie si du code vulnérable est réellement atteignable, ce qui le rend plus utile que le simple contrôle des dépendances d’un programmecapslockde Googlego vetetgo test -racegosecrécemment