Aikido

Pourquoi les Lockfiles sont importants pour la sécurité de la Supply Chain

Mackenzie JacksonMackenzie Jackson
|
#

Les lockfiles jouent un rôle essentiel dans la sécurisation de la chaîne d'approvisionnement logicielle grâce à une gestion cohérente des dépendances. Ils spécifient les versions exactes des dépendances utilisées, assurant la reproductibilité et évitant les changements inattendus.

Dans un environnement de développement rapide, rempli de bibliothèques open source et de packages tiers, les fichiers de verrouillage (lockfiles) agissent comme une défense contre les attaques de la chaîne d'approvisionnement. En verrouillant les dépendances à des versions spécifiques, ils empêchent les mises à jour automatiques vers des versions potentiellement compromises.

De nombreuses équipes de développement négligent les lockfiles, ne parvenant pas à exploiter tout leur potentiel. Cet article souligne l'importance des lockfiles pour garantir l'intégrité et la sécurité des projets logiciels.

Comprendre les Lockfiles

Les lockfiles sont des fichiers qui enregistrent les versions exactes de chaque dépendance et de leurs sous-dépendances dans un projet. Ils garantissent l'uniformité des versions de dépendances dans toutes les instances d'un projet, prévenant le « dependency hell » et les risques de sécurité potentiels.

Les lockfiles sont différents pour chaque langage et peuvent varier selon les frameworks, mais suivent généralement des formats similaires.

Javascript - yarn.lock

lodash@^4.17.15:
  version "4.17.21"
  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#acfcd7438b5d260f06a1d052c2a3b32ddc91c6b8"
  integrity sha512-v2kDE6syb5rK+X8bykjh3W7n4P3NV8axFypa8DwO8DK+RVZk9vft6xEhjxzIlc6DCwCPkMKSk4eQF6QNHOu9pw==

react@^17.0.1:
  version "17.0.2"
  resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#cdc8d94b0d7091f440c51d1427ff2a3d6e14e664"
  integrity sha512-y8vQ43+qMOpbD/3k1Vw4E4i4UgFqxMwI0AZc5fxyIfZK4kHRZ5Klg5zh/5Nq1Nk3JZqf6byFAkyoGZkbSnYt9w==

Python - poetry.lock

[[package]]
name = "requests"
version = "2.25.1"
description = "Python HTTP for Humans."
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"

[package.dependencies]
certifi = ">=2017.4.17"
chardet = ">=3.0.2,<5"
idna = ">=2.5,<3"
urllib3 = ">=1.21.1,<1.27"

Cette entrée spécifie le nom du package (click), les hachages acceptés et la version exacte (8.0.3). Une telle spécificité garantit des installations cohérentes dans les environnements de développement, de test et de production.

Les gestionnaires de paquets génèrent des fichiers de verrouillage (lockfiles) lors de l'installation ou des mises à jour des dépendances. Il est essentiel de commiter ces fichiers dans le système de contrôle de version avec le code source du projet. Cette pratique garantit que tous les contributeurs du projet utilisent des dépendances identiques, réduisant ainsi les incohérences et rendant les builds plus prévisibles.

Différents langages et gestionnaires de paquets ont leurs propres formats de fichiers de verrouillage (lockfiles) : Node.js utilise package-lock.json pour npm, Python utilise Pipfile.lock pour Pipenv, et Ruby utilise Gemfile.lock pour Bundler. L'utilisation de ces lockfiles permet de maintenir une base de projet cohérente et sécurisée, réduisant ainsi les risques liés à la gestion des dépendances.

Défense contre les attaques de la chaîne d'approvisionnement

Les attaques de la chaîne d'approvisionnement sur les dépendances open source sont de plus en plus courantes. Les attaquants pourraient compromettre une bibliothèque populaire, en injectant du code malveillant qui se propage aux projets dépendants. Les fichiers de verrouillage (lockfiles) offrent une solide défense contre ces attaques.

En spécifiant des versions de dépendances exactes, les lockfiles empêchent les mises à jour automatiques vers des versions potentiellement compromises. Ceci est crucial lorsque des vulnérabilités sont identifiées dans les dépendances. Avec les lockfiles, les projets restent stables avec des versions sécurisées connues jusqu'à ce que l'équipe décide de les mettre à jour après des tests approfondis.

Vous trouverez ci-dessous un exemple de package-lock.json fichier utilisé dans les projets Node.js pour verrouiller des versions de dépendances spécifiques. Cela garantit que toutes les personnes travaillant sur le projet installent exactement les mêmes versions, favorisant ainsi la cohérence et la sécurité.

{
  "name": "my-project",
  "version": "1.0.0",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "name": "my-project",
      "version": "1.0.0",
      "dependencies": {
        "lodash": "4.17.21",
        "axios": "0.21.1"
      }
    },
    "node_modules/lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDE6syb5rK+X8bykjh3W7n4P3NV8axFypa8DwO8DK+RVZk9vft6xEhjxzIlc6DCwCPkMKSk4eQF6QNHOu9pw=="
    },
    "node_modules/axios": {
      "version": "0.21.1",
      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
      "integrity": "sha512-pbkHfFgC6F4ltGeoyTeHRtUkZo/FZ9EoElV3MzDLeO2uYxLqGm6Qcbx93jUOJISyYSC/tzjK4NHH3MAYsDKUTA==",
      "dependencies": {
        "follow-redirects": "^1.10.0"
      }
    },
    "node_modules/follow-redirects": {
      "version": "1.14.1",
      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz",
      "integrity": "sha512-0gh4nEbdUdDra9mJKpAB+Y4gG61sQiKsbiqS8c5LEnFOh8fbov3/xp0FnWE2+IxKTozhJSdEV8ujvQjU+Ub3dg=="
    }
  },
  "dependencies": {
    "lodash": {
      "version": "4.17.21",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDE6syb5rK+X8bykjh3W7n4P3NV8axFypa8DwO8DK+RVZk9vft6xEhjxzIlc6DCwCPkMKSk4eQF6QNHOu9pw=="
    },
    "axios": {
      "version": "0.21.1",
      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
      "integrity": "sha512-pbkHfFgC6F4ltGeoyTeHRtUkZo/FZ9EoElV3MzDLeO2uYxLqGm6Qcbx93jUOJISyYSC/tzjK4NHH3MAYsDKUTA==",
      "requires": {
        "follow-redirects": "^1.10.0"
      }
    },
    "follow-redirects": {
      "version": "1.14.1",
      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz",
      "integrity": "sha512-0gh4nEbdUdDra9mJKpAB+Y4gG61sQiKsbiqS8c5LEnFOh8fbov3/xp0FnWE2+IxKTozhJSdEV8ujvQjU+Ub3dg=="
    }
  }
}

Ce que fait ce fichier

  • Verrouille les Versions Spécifiques:
    Il verrouille lodash à la version 4.17.21 et axios à 0.21.1. Peu importe quand ou où vous installez ce projet, ces versions exactes seront utilisées—empêchant les mises à jour accidentelles vers des versions susceptibles de contenir des changements majeurs ou des problèmes de sécurité.
  • Capture l'arborescence des dépendances:
    Il inclut des dépendances imbriquées, telles que follow-redirects, qui est utilisé en interne par axios.
  • Prend en charge les outils de sécurité:
    Des outils comme Aikido utiliser ce lockfile pour rechercher les vulnérabilités connues. Étant donné que le fichier contient des URL résolues et des hachages de version, les scanners peuvent :
    • Identifier précisément les packages à risque.
    • Recommander des alternatives corrigées ou sûres.
    • Suivre les modifications des dépendances au fil du temps.

Risques d'ignorer les lockfiles

Négliger les lockfiles peut déstabiliser et compromettre les projets logiciels. Sans lockfiles, les versions des dépendances peuvent varier d'un environnement à l'autre, entraînant des incohérences qui compliquent le débogage. Ces variations peuvent provoquer des bugs insaisissables, retardant les projets et augmentant les charges de maintenance.

Sans fichier de verrouillage (lockfile), le suivi des dépendances devient complexe. L'absence d'un enregistrement clair rend difficile la détermination des versions utilisées, ce qui complique la gestion de la chaîne d'approvisionnement. En cas de vulnérabilité, les développeurs peinent à identifier rapidement les dépendances à risque, ce qui retarde les temps de réponse.

Les mises à jour automatiques présentent des risques importants en l'absence de lockfiles. Des mises à jour non contrôlées peuvent introduire des packages compromis, exposant les projets à des failles de sécurité. Même les bibliothèques réputées peuvent receler des menaces cachées, rendant la surveillance des lockfiles essentielle pour maintenir une base de code sécurisée.

Bonnes pratiques pour l'utilisation des lockfiles

Intégrez les fichiers de verrouillage (lockfiles) dans votre flux de développement pour en tirer pleinement parti. L'inclusion des lockfiles dans le contrôle de version établit une source unique de vérité pour les dépendances, favorisant un environnement de développement cohérent. Cette approche réduit les variations indésirables et améliore la fiabilité de la production.

La mise à jour et la révision régulières des fichiers de verrouillage (lockfiles) sont vitales pour une détection précoce des menaces. Cette stratégie proactive aide les équipes à traiter rapidement les vulnérabilités, maintenant une posture de sécurité solide. Utilisez des outils pour l'évaluation continue des dépendances afin d'automatiser la détection des risques au sein de la chaîne d'approvisionnement logicielle.

Ancrer les dépendances à des versions spécifiques dans les fichiers manifestes renforce la sécurité. Cette pratique complète les lockfiles et sert de filet de sécurité en cas de divergences. Éduquer les équipes de développement sur l'importance des lockfiles renforce une gestion diligente des dépendances, améliorant ainsi la sécurité globale.

Maintenir les dépendances à jour avec les lockfiles

Maintenir les dépendances à jour nécessite de combiner l'automatisation avec un examen approfondi. Les mises à jour régulières des lockfiles devraient faire partie des cycles de développement, intégrant les dernières améliorations et correctifs de sécurité tout en préservant la cohérence. Des mises à jour régulières minimisent les interruptions inattendues et renforcent la sécurité.

Des outils automatisés comme Dependabot aident à gérer les mises à jour en générant des pull requests pour les nouvelles versions de dépendances. Ces outils assurent une surveillance continue, permettant des mises à jour opportunes et permettant aux équipes de se concentrer sur d'autres tâches. Cependant, il est crucial de revoir les changements pour s'assurer qu'ils répondent aux besoins du projet et éviter les problèmes.

Il est également essentiel de développer un processus manuel de mise à jour des lockfiles. Déployez les dépendances mises à jour dans un environnement de test pour évaluer l'impact et la compatibilité. Cette approche prévient les perturbations et maintient la cohérence, minimisant les risques liés aux changements fréquents de version.

L'intégration de fichiers de verrouillage (lockfiles) dans votre processus de développement renforce la sécurité de votre chaîne d'approvisionnement logicielle face aux menaces évolutives. L'adoption des meilleures pratiques et la sensibilisation de votre équipe aux dépendances sont essentielles pour maintenir une base de code robuste. Prêt à renforcer la sécurité de votre chaîne d'approvisionnement ? Démarrez gratuitement avec Aikido et simplifiez votre parcours de sécurité.

4.7/5

Sécurisez votre logiciel dès maintenant.

Essai gratuit
Sans CB
Planifiez une démo
Vos données ne seront pas partagées - Accès en lecture seule - Pas de CB nécessaire

Sécurisez-vous maintenant.

Sécuriser votre code, votre cloud et votre runtime dans un système centralisé unique.
Détectez et corrigez les vulnérabilités rapidement et automatiquement.

Pas de carte de crédit requise | Résultats du scan en 32 secondes.