Suivant: , Précédent: , Monter: GNU Guix   [Table des matières][Index]


19 Mises à jour de sécurité

Parfois, des vulnérabilités importantes sont découvertes dans les paquets logiciels et doivent être corrigées. Les développeur·euses de Guix essayent de suivre les vulnérabilités connues et d’appliquer des correctifs aussi vite que possible dans la branche master de Guix (nous n’avons pas encore de branche « stable » contenant seulement des mises à jour de sécurité). L’outil guix lint aide à trouver les versions vulnérables des paquets logiciels dans la distribution :

$ guix lint -c cve
gnu/packages/base.scm:652:2 : glibc@2.21 : probablement vulnérable à CVE-2015-1781, CVE-2015-7547
gnu/packages/gcc.scm:334:2 : gcc@4.9.3 : probablement vulnérable à CVE-2015-5276
gnu/packages/image.scm:312:2 : openjpeg@2.1.0 : probablement vulnérable à CVE-2016-1923, CVE-2016-1924
…

Voir Invoquer guix lint, pour plus d’informations.

Guix suit une discipline de gestion de paquets fonctionnelle (voir Introduction), ce qui implique que lorsqu’un paquet change, tous les paquets qui en dépendent doivent être reconstruits. Cela peut grandement ralentir le déploiement de corrections dans les paquets du cœur comme libc ou bash comme presque toute la distribution aurait besoin d’être reconstruite. Cela aide d’utiliser des binaires pré-construits (voir Substituts), mais le déploiement peut toujours prendre plus de temps de souhaité.

Pour corriger cela, Guix implémente les greffes, un mécanisme qui permet un déploiement rapide des mises à jour de sécurité critiques sans le coût associé à une reconstruction complète de la distribution. L’idée est de reconstruire uniquement le paquet qui doit être corrigé puis de le « greffer » sur les paquets qui sont explicitement installés par l’utilisateur et qui se référaient avant au paquet d’origine. Le coût d’une greffe est typiquement très bas, et plusieurs ordres de grandeurs moins élevé que de reconstruire tout la chaîne de dépendance.

Par exemple, supposons qu’une mise à jour de sécurité doive être appliquée à Bash. Les développeurs de Guix fourniront une définition de paquet pour le Bash « corrigé », disons bash-fixed, de la manière habituelle (voir Définition des paquets). Ensuite, la définition originale du paquet est augmentée avec un champ replacement qui pointe vers le paquet contenant la correction :

(define bash
  (package
    (name "bash")
    ;; …
    (replacement bash-fixed)))

À partir de maintenant, tout paquet dépendant directement ou indirectement de Bash — rapporté par guix gc --requisites (voir Invoquer guix gc) — installé est automatiquement « réécrit » pour se référer à bash-fixed au lieu de bash. Ce processus de greffe prend du temps en proportion de la taille du paquet, typiquement moins d’une minute pour un paquet de taille « moyenne » sur une machine récente. La greffe est récursive : lorsqu’une dépendance indirecte a besoin d’être greffée, la greffe se « propage » jusqu’au paquet que l’utilisateur installe.

Actuellement la longueur du nom et la version de la greffe et du paquet qu’il remplace (bash-fixed et bash dans l’exemple ci-dessus) doivent être identiques. Cette restriction vient surtout du fait que la greffe fonctionne en corrigeant les fichiers, dont des fichiers binaires, directement. D’autres restrictions peuvent apparaître : par exemple, si vous ajoutez une greffe à un paquet fournissant une bibliothèque partagée, la bibliothèque partagée originale et son remplacement doivent avoir le même SONAME et être compatibles au niveau binaire.

L’option en ligne de commande --no-grafts vous permet d’éviter les greffes (voir --no-grafts). Donc la commande :

guix build bash --no-grafts

renvoie le nom de fichier dans les dépôt du Bash original, alors que :

guix build bash

renvoie le nom de fichier du Bash « corrigé » de remplacement. Cela vous permet de distinguer les deux variantes de Bash.

Pour vérifier à quel Bash votre profil se réfère, vous pouvez lancer (voir Invoquer guix gc) :

guix gc -R $(readlink -f ~/.guix-profile) | grep bash

… et comparer les noms de fichiers que vous obtenez avec ceux du dessus. De la même manière pour une génération du système Guix :

guix gc -R $(guix system build my-config.scm) | grep bash

Enfin, pour vérifier quelles processus Bash lancés vous utilisez, vous pouvez utiliser la commande lsof :

lsof | grep /gnu/store/.*bash

Suivant: Bootstrapping, Précédent: Utiliser TeX et LaTeX, Monter: GNU Guix   [Table des matières][Index]