10 points par GN⁺ 2024-11-05 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2024-11-05
Avis Hacker News
  • govulncheck est 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 programme
  • Il ne faut pas oublier de consulter le projet capslock de Google
  • Contient des conseils utiles sur go vet et go test -race
  • Go n’est pas sûr du point de vue mémoire, mais il est plus facile d’y écrire du code sûr que dans d’autres langages
    • Grâce à la syntaxe explicite de Go, il est facile de comprendre le comportement des fonctions et les structures de données
    • Les outils d’IA fonctionnent bien avec Go parce que le contexte à l’intérieur des fonctions est clair
  • Semgrep est un excellent outil qui effectue des vérifications sur les langages et les frameworks courants via l’analyse statique
    • Les règles open source de Semgrep peuvent être consultées sur GitHub
  • Des doutes sont soulevés sur la réputation de Go en matière de sécurité
    • Go est généralement perçu comme sûr et stable, à un niveau comparable à d’autres outils comme .NET
  • J’ai découvert gosec récemment
  • En maintenant des applications Go pendant 9 ans, il a été possible de mettre à jour facilement les versions de Go et les modules
    • GitHub signale automatiquement les vulnérabilités et, dans 99 % des cas, tout fonctionne sans modification
  • Go n’est en réalité pas sûr du point de vue mémoire
    • L’atomicité n’est garantie que pour les valeurs de taille d’un mot ; les valeurs sur deux mots comme les pointeurs d’interface ou les slices peuvent compromettre la sûreté mémoire en contexte concurrent
  • Go est bien, mais l’usage croissant des génériques nuit récemment à la lisibilité du code
    • Le code Go actuel devient plus difficile à lire que l’ancien code Go qui utilisait très peu les génériques