Suivant: Bootstrapping, Précédent: Utiliser TeX et LaTeX, Monter: GNU Guix [Table des matières][Index]
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]