diff options
Diffstat (limited to 'etc')
-rwxr-xr-x | etc/committer.scm.in | 144 | ||||
-rw-r--r-- | etc/completion/fish/guix.fish | 7 | ||||
-rw-r--r-- | etc/completion/zsh/_guix | 2 | ||||
-rwxr-xr-x | etc/guix-install.sh | 4 | ||||
-rw-r--r-- | etc/news.scm | 512 |
5 files changed, 604 insertions, 65 deletions
diff --git a/etc/committer.scm.in b/etc/committer.scm.in index ebe6b96bcc..801b5d195e 100755 --- a/etc/committer.scm.in +++ b/etc/committer.scm.in @@ -3,7 +3,7 @@ !# ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2020 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -28,7 +28,10 @@ (import (sxml xpath) (srfi srfi-1) + (srfi srfi-2) (srfi srfi-9) + (srfi srfi-11) + (srfi srfi-26) (ice-9 format) (ice-9 popen) (ice-9 match) @@ -63,7 +66,8 @@ LINE-NO in PORT." (make-hunk file-name old-line-number new-line-number - diff) + diff-lines + definition?) hunk? (file-name hunk-file-name) ;; Line number before the change @@ -71,38 +75,46 @@ LINE-NO in PORT." ;; Line number after the change (new-line-number hunk-new-line-number) ;; The full diff to be used with "git apply --cached" - (diff hunk-diff)) + (diff-lines hunk-diff-lines) + ;; Does this hunk add a definition? + (definition? hunk-definition?)) (define* (hunk->patch hunk #:optional (port (current-output-port))) (let ((file-name (hunk-file-name hunk))) (format port "diff --git a/~a b/~a~%--- a/~a~%+++ b/~a~%~a" file-name file-name file-name file-name - (hunk-diff hunk)))) + (string-join (hunk-diff-lines hunk) "")))) (define (diff-info) "Read the diff and return a list of <hunk> values." (let ((port (open-pipe* OPEN_READ "git" "diff" + "--no-color" "--no-prefix" - ;; Do not include any context lines. This makes it - ;; easier to find the S-expression surrounding the - ;; change. - "--unified=0"))) + ;; Only include one context line to avoid lumping in + ;; new definitions with changes to existing + ;; definitions. + "--unified=1" + "gnu"))) (define (extract-line-number line-tag) (abs (string->number (car (string-split line-tag #\,))))) (define (read-hunk) - (reverse - (let loop ((lines '())) - (let ((line (read-line port 'concat))) - (cond - ((eof-object? line) lines) - ((or (string-prefix? "@@ " line) - (string-prefix? "diff --git" line)) - (unget-string port line) - lines) - (else (loop (cons line lines)))))))) + (let loop ((lines '()) + (definition? #false)) + (let ((line (read-line port 'concat))) + (cond + ((eof-object? line) + (values (reverse lines) definition?)) + ((or (string-prefix? "@@ " line) + (string-prefix? "diff --git" line)) + (unget-string port line) + (values (reverse lines) definition?)) + (else + (loop (cons line lines) + (or definition? + (string-prefix? "+(define" line)))))))) (define info (let loop ((acc '()) (file-name #f)) @@ -116,17 +128,27 @@ LINE-NO in PORT." ((string-prefix? "@@ " line) (match (string-split line #\space) ((_ old-start new-start . _) - (loop (cons (make-hunk file-name - (extract-line-number old-start) - (extract-line-number new-start) - (string-join (cons* line "\n" - (read-hunk)) "")) - acc) - file-name)))) + (let-values + (((diff-lines definition?) (read-hunk))) + (loop (cons (make-hunk file-name + (extract-line-number old-start) + (extract-line-number new-start) + (cons (string-append line "\n") + diff-lines) + definition?) acc) + file-name))))) (else (loop acc file-name)))))) (close-pipe port) info)) +(define (lines-to-first-change hunk) + "Return the number of diff lines until the first change." + (1- (count (lambda (line) + ((negate char-set-contains?) + (char-set #\+ #\-) + (string-ref line 0))) + (hunk-diff-lines hunk)))) + (define (old-sexp hunk) "Using the diff information in HUNK return the unmodified S-expression corresponding to the top-level definition containing the staged changes." @@ -138,7 +160,9 @@ corresponding to the top-level definition containing the staged changes." (close-pipe port) (call-with-input-string contents (lambda (port) - (surrounding-sexp port (hunk-old-line-number hunk)))))) + (surrounding-sexp port + (+ (lines-to-first-change hunk) + (hunk-old-line-number hunk))))))) (define (new-sexp hunk) "Using the diff information in HUNK return the modified S-expression @@ -146,9 +170,10 @@ corresponding to the top-level definition containing the staged changes." (call-with-input-file (hunk-file-name hunk) (lambda (port) (surrounding-sexp port - (hunk-new-line-number hunk))))) + (+ (lines-to-first-change hunk) + (hunk-new-line-number hunk)))))) -(define* (commit-message file-name old new #:optional (port (current-output-port))) +(define* (change-commit-message file-name old new #:optional (port (current-output-port))) "Print ChangeLog commit message for changes between OLD and NEW." (define (get-values expr field) (match ((sxpath `(// ,field quasiquote *)) expr) @@ -193,6 +218,12 @@ corresponding to the top-level definition containing the staged changes." (listify added))))))))) '(inputs propagated-inputs native-inputs))) +(define* (add-commit-message file-name variable-name #:optional (port (current-output-port))) + "Print ChangeLog commit message for a change to FILE-NAME adding a definition." + (format port + "gnu: Add ~a.~%~%* ~a (~a): New variable.~%" + variable-name file-name variable-name)) + (define (group-hunks-by-sexp hunks) "Return a list of pairs associating all hunks with the S-expression they are modifying." @@ -218,14 +249,45 @@ modifying." (cons* new (old-sexp (first hunks)) hunks))) (group-hunks-by-sexp hunks))) +(define %delay 1000) + (define (main . args) (match (diff-info) (() (display "Nothing to be done." (current-error-port))) (hunks - (for-each (match-lambda - ((new old . hunks) - (for-each (lambda (hunk) + (let-values + (((definitions changes) + (partition hunk-definition? hunks))) + + ;; Additions. + (for-each (lambda (hunk) + (and-let* + ((define-line (find (cut string-prefix? "+(define" <>) + (hunk-diff-lines hunk))) + (variable-name (and=> (string-tokenize define-line) second))) + (add-commit-message (hunk-file-name hunk) variable-name) + (let ((port (open-pipe* OPEN_WRITE + "git" "apply" + "--cached" + "--unidiff-zero"))) + (hunk->patch hunk port) + (unless (eqv? 0 (status:exit-val (close-pipe port))) + (error "Cannot apply"))) + + (let ((port (open-pipe* OPEN_WRITE "git" "commit" "-F" "-"))) + (add-commit-message (hunk-file-name hunk) + variable-name port) + (usleep %delay) + (unless (eqv? 0 (status:exit-val (close-pipe port))) + (error "Cannot commit")))) + (usleep %delay)) + definitions) + + ;; Changes. + (for-each (match-lambda + ((new old . hunks) + (for-each (lambda (hunk) (let ((port (open-pipe* OPEN_WRITE "git" "apply" "--cached" @@ -233,18 +295,20 @@ modifying." (hunk->patch hunk port) (unless (eqv? 0 (status:exit-val (close-pipe port))) (error "Cannot apply"))) - (sleep 1)) + (usleep %delay)) hunks) - (commit-message (hunk-file-name (first hunks)) - old new - (current-output-port)) + (change-commit-message (hunk-file-name (first hunks)) + old new + (current-output-port)) (let ((port (open-pipe* OPEN_WRITE "git" "commit" "-F" "-"))) - (commit-message (hunk-file-name (first hunks)) - old new - port) - (sleep 1) + (change-commit-message (hunk-file-name (first hunks)) + old new + port) + (usleep %delay) (unless (eqv? 0 (status:exit-val (close-pipe port))) (error "Cannot commit"))))) - (new+old+hunks hunks))))) + ;; XXX: we recompute the hunks here because previous + ;; insertions lead to offsets. + (new+old+hunks (diff-info))))))) (main) diff --git a/etc/completion/fish/guix.fish b/etc/completion/fish/guix.fish index 73bd176112..422baab4bb 100644 --- a/etc/completion/fish/guix.fish +++ b/etc/completion/fish/guix.fish @@ -133,7 +133,7 @@ complete -f -c guix -n '__fish_guix_using_command pull' -l url -d 'download the complete -f -c guix -n '__fish_guix_using_command pull' -l bootstrap -d 'use the bootstrap Guile to build the new Guix' #### system -set -l remotecommands reconfigure roll-back switch-generation list-generations build container vm vm-image disk-image init extension-graph shepherd-graph load-path keep-failed keep-going dry-run fallback no-substitutes substitutes-urls no-grafts no-offload max-silent-time timeout verbosity rounds cores max-jobs derivation on-error image-size no-grub share expose full-boot +set -l remotecommands reconfigure roll-back switch-generation list-generations build container vm image init extension-graph shepherd-graph load-path keep-failed keep-going dry-run fallback no-substitutes substitutes-urls no-grafts no-offload max-silent-time timeout verbosity rounds cores max-jobs derivation on-error image-size no-grub share expose full-boot complete -f -c guix -n '__fish_guix_needs_command' -a system -d 'Build the operating system declared in FILE according to ACTION.' complete -f -c guix -n '__fish_guix_using_command system' -l reconfigure -d 'switch to a new operating system configuration' complete -f -c guix -n '__fish_guix_using_command system' -l roll-back -d 'switch to the previous operating system configuration' @@ -142,8 +142,7 @@ complete -f -c guix -n '__fish_guix_using_command system' -l list-generations -d complete -f -c guix -n '__fish_guix_using_command system' -l build -d 'build the operating system without installing anything' complete -f -c guix -n '__fish_guix_using_command system' -l container -d 'build a container that shares the host\'s store' complete -f -c guix -n '__fish_guix_using_command system' -l vm -d 'build a virtual machine image that shares the host\'s store' -complete -f -c guix -n '__fish_guix_using_command system' -l vm-image -d 'build a freestanding virtual machine image' -complete -f -c guix -n '__fish_guix_using_command system' -l disk-image -d 'build a disk image, suitable for a USB stick' +complete -f -c guix -n '__fish_guix_using_command system' -l image -d 'build a disk image, suitable for a USB stick' complete -f -c guix -n '__fish_guix_using_command system' -l init -d 'initialize a root file system to run GNU' complete -f -c guix -n '__fish_guix_using_command system' -l extension-graph -d 'emit the service extension graph in Dot format' complete -f -c guix -n '__fish_guix_using_command system' -l shepherd-graph -d 'emit the graph of shepherd services in Dot format' @@ -167,7 +166,7 @@ complete -f -c guix -n '__fish_guix_using_command system' -s M -d 'allow at most complete -f -c guix -n '__fish_guix_using_command system' -a "--max-jobs=" -d 'allow at most N build jobs' complete -f -c guix -n '__fish_guix_using_command system' -s d -l derivation -d 'return the derivation of the given system' complete -f -c guix -n '__fish_guix_using_command system' -a "--on-error=" -d 'apply STRATEGY when an error occurs while reading FILE' -complete -f -c guix -n '__fish_guix_using_command system' -a "--image-size=" -d 'for \'vm-image\', produce an image of SIZE' +complete -f -c guix -n '__fish_guix_using_command system' -a "--image-size=" -d 'for \'image\', produce an image of SIZE' complete -f -c guix -n '__fish_guix_using_command system' -l no-grub -d 'for \'init\', do not install GRUB' complete -f -c guix -n '__fish_guix_using_command system' -a "--share=" -d 'for \'vm\', share host file system according to SPEC' complete -f -c guix -n '__fish_guix_using_command system' -a "--expose=" -d 'for \'vm\', expose host file system according to SPEC' diff --git a/etc/completion/zsh/_guix b/etc/completion/zsh/_guix index ae93b62b1d..aa1a859e0d 100644 --- a/etc/completion/zsh/_guix +++ b/etc/completion/zsh/_guix @@ -383,7 +383,7 @@ _guix_list_installed_packages() '--max-jobs=[allow at most N build jobs]:N' \ '--derivation[return the derivation of the given system]' \ '--on-error=[apply STRATEGY when an error occurs while reading FILE]:STRATEGY' \ - '--image-size=[for "vm-image", produce an image of SIZE]:SIZE' \ + '--image-size=[for "image", produce an image of SIZE]:SIZE' \ '--no-grub[for "init", do not install GRUB]' \ '--share=[for "vm", share host file system according to SPEC]:SPEC' \ '--expose=[for "vm", expose host file system according to SPEC]:SPEC' \ diff --git a/etc/guix-install.sh b/etc/guix-install.sh index 94c04aa646..c84e7b7577 100755 --- a/etc/guix-install.sh +++ b/etc/guix-install.sh @@ -8,6 +8,7 @@ # Copyright © 2020 Simon Tournier <zimon.toutoune@gmail.com> # Copyright © 2020 Daniel Brooks <db48x@db48x.net> # Copyright © 2021 Jakub Kądziołka <kuba@kadziolka.net> +# Copyright © 2021 Chris Marusich <cmmarusich@gmail.com> # # This file is part of GNU Guix. # @@ -187,6 +188,9 @@ chk_sys_arch() armv7l) local arch=armhf ;; + ppc64le | powerpc64le) + local arch=powerpc64le + ;; *) _err "${ERR}Unsupported CPU type: ${arch}" exit 1 diff --git a/etc/news.scm b/etc/news.scm index 1b92886dca..65d83061df 100644 --- a/etc/news.scm +++ b/etc/news.scm @@ -1,15 +1,19 @@ ;; GNU Guix news, for use by 'guix pull'. ;; ;; Copyright © 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org> -;; Copyright © 2019, 2020 Tobias Geerinckx-Rice <me@tobias.gr> +;; Copyright © 2019–2021 Tobias Geerinckx-Rice <me@tobias.gr> ;; Copyright © 2019, 2020 Miguel Ángel Arruga Vivas <rosen644835@gmail.com> ;; Copyright © 2019, 2020 Konrad Hinsen <konrad.hinsen@fastmail.net> -;; Copyright © 2019, 2020 Julien Lepiller <julien@lepiller.eu> +;; Copyright © 2019, 2020, 2021 Julien Lepiller <julien@lepiller.eu> ;; Copyright © 2019, 2020, 2021 Florian Pelz <pelzflorian@pelzflorian.de> ;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com> -;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com> +;; Copyright © 2020, 2021 Mathieu Othacehe <m.othacehe@gmail.com> ;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> -;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> +;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> +;; Copyright © 2021 Leo Famulari <leo@famulari.name> +;; Copyright © 2021 Zhu Zihao <all_but_last@163.com> +;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com> +;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be> ;; ;; Copying and distribution of this file, with or without modification, are ;; permitted in any medium without royalty provided the copyright notice and @@ -18,11 +22,397 @@ (channel-news (version 0) + (entry (commit "2161820ebbbab62a5ce76c9101ebaec54dc61586") + (title + (en "Risk of local privilege escalation during user account creation") + (de "Risiko lokaler Rechteausweitung während der Erstellung von Benutzerkonten")) + (body + (en "A security vulnerability that can lead to local privilege +escalation has been found in the code that creates user accounts on Guix +System---Guix on other distros is unaffected. The system is only vulnerable +during the activation of user accounts that do not already exist. + +This bug is fixed and Guix System users are advised to upgrade their system, +with a command along the lines of: + +@example +guix system reconfigure /run/current-system/configuration.scm +@end example + +The attack can happen when @command{guix system reconfigure} is running. +Running @command{guix system reconfigure} can trigger the creation of new user +accounts if the configuration specifies new accounts. If a user whose account +is being created manages to log in after the account has been created but +before ``skeleton files'' copied to its home directory have the right +ownership, they may, by creating an appropriately-named symbolic link in the +home directory pointing to a sensitive file, such as @file{/etc/shadow}, get +root privileges. + +See @uref{https://issues.guix.gnu.org/47584} for more information on this +bug.") + (de "Eine Sicherheitslücke, die eine lokale Rechteausweitung zur +Folge haben kann, wurde in dem Code gefunden, mit dem Benutzerkonten auf Guix +System angelegt werden — Guix auf anderen Distributionen ist nicht betroffen. +Das System kann nur während der Aktivierung noch nicht existierender +Benutzerkonten angegriffen werden. + +Der Fehler wurde behoben und wir empfehlen Nutzern von Guix System, ihre +Systeme zu aktualisieren, mit einem Befehl wie: + +@example +guix system reconfigure /run/current-system/configuration.scm +@end example + +Der Angriff kann erfolgen, während @command{guix system reconfigure} läuft. +Wenn @command{guix system reconfigure} ausgeführt wird, kann das die Erzeugung +neuer Benutzerkonten auslösen, wenn in der Konfiguration neue Konten angegeben +wurden. Wenn ein Benutzer, dessen Konto gerade angelegt wird, es +fertigbringt, sich anzumelden, bevor „Skeleton-Dateien“ in seinem Persönlichen +Verzeichnis den richtigen Besitzer haben, kann er durch Anlegen einer gezielt +benannten symbolischen Verknüpfung in seinem Persönlichen Verzeichnis auf eine +sensible Datei wie @file{/etc/shadow} Administratorrechte erlangen. + +Siehe @uref{https://issues.guix.gnu.org/47584} für mehr Informationen zu +diesem Fehler."))) + + (entry (commit "e52ec6c64a17a99ae4bb6ff02309067499915b06") + (title + (en "New supported platform: powerpc64le-linux") + (de "Neue Plattform wird unterstützt: powerpc64le-linux") + (fr "Nouvelle plate-forme prise en charge : powerpc64le-linux")) + (body + (en "A new platform, powerpc64le-linux, has been added for +little-endian 64-bit Power ISA processors using the Linux-Libre kernel. This +includes POWER9 systems such as the +@uref{https://www.fsf.org/news/talos-ii-mainboard-and-talos-ii-lite-mainboard-now-fsf-certified-to-respect-your-freedom, +RYF Talos II mainboard}. This platform is available as a \"technology +preview\": although it is supported, substitutes are not yet available from +the build farm, and some packages may fail to build. In addition, Guix System +is not yet available on this platform. That said, the Guix community is +actively working on improving this support, and now is a great time to try it +and get involved!") + (de "Eine neue Plattform, powerpc64le-linux, wurde hinzugefügt. Mit +ihr können Prozessoren mit 64-Bit-Power-Befehlssatz, little-endian, mit dem +Linux-Libre-Kernel betrieben werden. Dazu gehören POWER9-Systeme wie die +@uref{https://www.fsf.org/news/talos-ii-mainboard-and-talos-ii-lite-mainboard-now-fsf-certified-to-respect-your-freedom, +RYF-zertifizierte Talos-II-Hauptplatine}. Bei der Plattform handelt es sich +um eine „Technologievorschau“; obwohl sie unterstützt wird, gibt es noch keine +Substitute von der Erstellungsfarm und bei manchen Paketen könnte die +Erstellung fehlschlagen. Des Weiteren ist Guix System auf dieser Plattform +noch nicht verfügbar. Dennoch arbeitet die Guix-Gemeinde aktiv daran, diese +Unterstützung auszubauen, und jetzt ist eine gute Gelegenheit, sie +auszuprobieren und mitzumachen!") + (fr "Une nouvelle plate-forme, powerpc64le-linux, a été ajoutée pour +les processeurs POWER 64-bits utilisant le noyau Linux-libre. Ça inclut les +systèmes POWER9 tels que les +@uref{https://www.fsf.org/news/talos-ii-mainboard-and-talos-ii-lite-mainboard-now-fsf-certified-to-respect-your-freedom, +cartes Talos II RYF}. Il s'agit pour le moment d'un « avant-goût » de la +technologie : bien que la plate-forme soit prise en charge, la ferme de +compilation ne fournit pas encore de substituts et certains paquets risquent +de ne pas compiler. En outre, Guix System n'est pas encore disponible sur +cette plate-forme. Ceci dit, la communauté Guix travaille activement pour +améliorer cette prise en charge et c'est maintenant un bon moment pour +l'essayer et pour s'impliquer !"))) + + (entry (commit "9ade2b720af91acecf76278b4d9b99ace406781e") + (title + (en "Update on previous @command{guix-daemon} local privilege escalation") + (de "Nachtrag zur lokalen Rechteausweitung bei @command{guix-daemon}") + (nl "Aanvulling bij escalatie van bevoegdheden via @command{guix-daemon}")) + (body + (en "The previous news item described a potential local privilege +escalation in @command{guix-daemon}, and claimed that systems with the Linux +@uref{https://www.kernel.org/doc/Documentation/sysctl/fs.txt, +``protected hardlink''} feature enabled were unaffected by the vulnerability. + +This is not entirely correct. Exploiting the bug on such systems is harder, +but not impossible. To avoid unpleasant surprises, all users are advised to +upgrade @command{guix-daemon}. Run @command{info \"(guix) Upgrading Guix\"} +for info on how to do that. See +@uref{https://guix.gnu.org/en/blog/2021/risk-of-local-privilege-escalation-via-guix-daemon/} +for more information on this bug.") + (de "In der letzten Neuigkeit wurde eine mögliche lokale +Rechteausweitung im @command{guix-daemon} beschrieben und behauptet, dass +Systeme, auf denen Linux’ +@uref{https://www.kernel.org/doc/Documentation/sysctl/fs.txt, +„Geschützte-Hardlinks“-Funktionalität} aktiviert ist, von der Sicherheitslücke +nicht betroffen seien. + +Das stimmt nicht ganz. Die Lücke auf solchen Systemen auszunutzen, ist +schwerer, aber nicht unmöglich. Um unangenehme Überraschungen zu vermeiden, +empfehlen wir allen Nutzern, @command{guix-daemon} zu aktualisieren. Führen +Sie @command{info \"(guix.de) Aktualisieren von Guix\"} aus, um zu erfahren, +wie Sie ihn aktualisieren können. Siehe +@uref{https://guix.gnu.org/de/blog/2021/risk-of-local-privilege-escalation-via-guix-daemon/} +für mehr Informationen zu diesem Fehler.") + (nl "Het vorige nieuwsbericht beschreef een beveiligingsprobleem in +@command{guix-daemon} dat kan leiden tot de escalatie van lokale bevoegdheden. +Het bericht stelde dat machines waarop de +@uref{https://www.kernel.org/doc/Documentation/sysctl/fs.txt, +``protected hardlink''}-optie van Linux is inschakeld niet kwetsbaar zijn. + +Dit is niet volledig juist. De optie maakt het uitbuiten van de fout +moeilijker maar niet onmogelijk. Om onaangename verrassingen te voorkomen +is het voor iedereen aangeraden om @command{guix-daemon} op te waarderen. +Voer @command{info \"(guix) Upgrading Guix\"} uit voor meer informatie +daarover. Lees +@uref{https://guix.gnu.org/en/blog/2021/risk-of-local-privilege-escalation-via-guix-daemon/} +voor meer informatie over het probleem."))) + + (entry (commit "ec7fb669945bfb47c5e1fdf7de3a5d07f7002ccf") + (title + (en "Risk of local privilege escalation @i{via} @command{guix-daemon}") + (de "Risiko lokaler Rechteausweitung über @command{guix-daemon}") + (fr "Risque d'élévation locale de privilèges @i{via} @command{guix-daemon}") + (nl "Risico op escalatie van bevoegdheden via @command{guix-daemon}")) + (body + (en "A security vulnerability that can lead to local privilege +escalation has been found in @command{guix-daemon}. It affects multi-user +setups in which @command{guix-daemon} runs locally. + +It does @emph{not} affect multi-user setups where @command{guix-daemon} runs +on a separate machine and is accessed over the network, @i{via} +@env{GUIX_DAEMON_SOCKET}, as is customary on cluster setups. Machines where +the Linux @uref{https://www.kernel.org/doc/Documentation/sysctl/fs.txt, +``protected hardlink''} feature is enabled, which is common, are also +unaffected---this is the case when the contents of +@file{/proc/sys/fs/protected_hardlinks} are @code{1}. + +The attack consists in having an unprivileged user spawn a build process, for +instance with @command{guix build}, that makes its build directory +world-writable. The user then creates a hardlink within the build directory +to a root-owned file from outside of the build directory, such as +@file{/etc/shadow}. If the user passed the @option{--keep-failed} option and +the build eventually fails, the daemon changes ownership of the whole build +tree, including the hardlink, to the user. At that point, the user has write +access to the target file. + +You are advised to upgrade @command{guix-daemon}. Run @command{info \"(guix) +Upgrading Guix\"}, for info on how to do that. See +@uref{https://issues.guix.gnu.org/47229} for more information on this bug.") + (de "Eine Sicherheitslücke, die zu einer lokalen Rechteausweitung +führen kann, wurde in @command{guix-daemon} gefunden. Sie betrifft +Mehrbenutzersysteme, auf denen @command{guix-daemon} lokal läuft. + +@emph{Nicht} betroffen sind Mehrbenutzersysteme, auf denen +@command{guix-daemon} auf einer separaten Maschine läuft und darauf über das +Netzwerk mittels @env{GUIX_DAEMON_SOCKET} zugegriffen wird, was auf +Rechen-Clustern üblich ist. Auch Maschinen, auf denen Linux’ +@uref{https://www.kernel.org/doc/Documentation/sysctl/fs.txt, +„Geschützte-Hardlinks“-Funktionalität} aktiviert ist@tie{}– was häufig der +Fall ist@tie{}–, sind nicht betroffen; sie ist aktiviert, wenn +@file{/proc/sys/fs/protected_hardlinks} den Inhalt @code{1} hat. + +Der Angriff besteht darin, dass ein unprivilegierter Benutzer einen +Erstellungsprozess startet, etwa mit @command{guix build}, der allen +Schreibberechtigung auf sein Erstellungsverzeichnis erteilt. In diesem +Erstellungsverzeichnis erzeugt der Benutzer nun eine harte Verknüpfung auf +eine Datei außerhalb des Erstellungsverzeichnisses, die dem +Administratornutzer root gehört, etwa @file{/etc/shadow}. Wenn der Nutzer die +Befehlszeilenoption @option{--keep-failed} angegeben hat und die Erstellung +irgendwann fehlschlägt, trägt der Daemon als Besitzer des gesamten +Erstellungsverzeichnisses den Benutzer ein, Hardlink eingeschlossen. Jetzt +hat der Benutzer Schreibzugriff auf die Zieldatei bekommen. + +Wir empfehlen, dass Sie @command{guix-daemon} aktualisieren. Führen Sie +@command{info \"(guix.de) Aktualisieren von Guix\"} aus, um zu erfahren, wie +Sie ihn aktualisieren können. Siehe @uref{https://issues.guix.gnu.org/47229} +für mehr Informationen zu diesem Fehler.") + (fr "Une faille de sécurité pouvant mener à une élévation locale de +privilèges a été trouvée dans @command{guix-daemon}. Elle touche les +installations multi-utilisateur·ices dans lesquelles @command{guix-daemon} +tourne en local. + +Elle @emph{n'affecte pas} les installations où @command{guix-daemon} tourne +sur une machine séparée et qu'on y accède à travers le réseau, @i{via} +@env{GUIX_DAEMON_SOCKET}, comme c'est typiquement le cas sur les grappes de +calcul (@i{clusters}). Les machines où les +@uref{https://www.kernel.org/doc/Documentation/sysctl/fs.txt, ``liens +protégés''} de Linux sont activés, ce qui est courant, ne sont pas non plus +touchées ; cette fonctionnalité est activée si le contenu de +@file{/proc/sys/fs/protected_hardlinks} est @code{1}. + +Pour mener cette attaque, un·e utilisateur·rice démarre un processus de +compilation, par exemple avec @command{guix build}, qui rend le répertoire de +compilation inscriptible pour tout le monde. La personne créée ensuite un +lien dur (@i{hard link}) dans ce répertoire vers un fichier appartenant à +@code{root}, tel que @file{/etc/shadow}. Si on a passé l'option +@option{--keep-failed} et que la compilation finit par échouer, le démon met +l'utilisateur·rice appelant·e comme propriétaire de l'ensemble du répertoire +de compilation, y compris le lien. À ce stade, cette personne a accès en +écriture sur le fichier cible. + +Nous conseillons de mettre à jour @command{guix-daemon}. Lancer @command{info +\"(guix.fr) Mettre à niveau Guix\"} pour voir comment faire. Voir +@uref{https://issues.guix.gnu.org/47229} pour plus d'informations sur cette +faille.") + (nl "In @command{guix-daemon} werd een beveiligingsprobleem +gevonden dat kan leiden tot de escalatie van lokale bevoegdheden. Het +probleem doet zich voor bij installaties met meerdere gebruikers waarop een +lokale @command{guix-daemon} draait. + +Het heeft @emph{geen} invloed op systemen met meerdere gebruikers waarbij de +@command{guix-daemon} op een afzonderlijke machine draait en via +@env{GUIX_DAEMON_SOCKET} over het netwerk wordt aangesproken, zoals +gebruikelijk bij computerclusters. Ook machines waarop de +@uref{https://www.kernel.org/doc/Documentation/sysctl/fs.txt, +``protected hardlink''}-optie van Linux is inschakeld, wat vaak het geval is, +zijn niet kwetsbaar. + +De aanval bestaat erin dat een gebruiker zonder privileges een bouwproces +opstart, bijvoorbeeld met @command{guix build}, dat zijn werkmap beschrijfbaar +maakt voor alle gebruikers. Vervolgens maakt de gebruiker vanuit deze map een +harde link naar een bestand erbuiten met @code{root} als eigenaar, zoals +@file{/etc/shadow}. Als de gebruiker de @option{--keep-failed}-optie opgaf +en de bouw faalt, maakt @command{guix-daemon} de gebruiker eigenaar van de +volledige inhoud van de werkmap, met inbegrip van de harde link. Op dat +moment bezit de gebruiker schrijfrechten over het doelbestand. + +Het is aangeraden om @command{guix-daemon} op te waarderen. Voer +@command{info \"(guix) Upgrading Guix\"} uit voor meer informatie daarover. +Lees @uref{https://issues.guix.gnu.org/47229} voor meer informatie over het +probleem."))) + + (entry (commit "77c2f4e2068ebec3f384c826c5a99785125ff72c") + (title + (en "@code{qemu-binfmt-service-type} is usable for any container") + (de "@code{qemu-binfmt-service-type} funktioniert mit jedem Container") + (fr "@code{qemu-binfmt-service-type} fonctionne avec tous les conteneurs")) + (body + (en "The service now makes use of the statically built QEMU binaries +along with the fix binary (F) @code{binfmt_misc} flag, which allows the kernel +to fully pre-load it in memory. QEMU can thus now be used with any container +without extra configuration. The @code{guix-support?} field of the +@code{qemu-binfmt-configuration} record is removed, as it is no longer +necessary.") + (de "Der Dienst benutzt jetzt statisch gebundene QEMU-Binärdateien +zusammen mit der Fix-Binary-Flag (F) von @code{binfmt_misc}. Dadurch kann der +Kernel die QEMU-Binärdatei als Ganzes vorab in den Speicher laden. Dann kann +sie auch ohne weitere Konfiguration in jeder Art von isolierter Umgebung +benutzt werden. Darum wurde das Feld @code{guix-support?} des +@code{qemu-binfmt-configuration}-Verbundsobjekts entfernt; es wird nicht mehr +gebraucht.") + (fr "Le service utilise maintenant les binaire QEMU statiques avec +le drapeau « fixed » (F) de @code{binfmt_misc}, ce qui permet au noyau +de le charger entièrement en mémoire. On peut donc maintenant utiliser QEMU +avec n'importe quel conteneur sans configuration supplémentaire. Le champ +@code{guix-support?} de l'enregistrement @code{qemu-binfmt-configuration} a +été supprimé car il n'est pas nécessaire."))) + + (entry (commit "02e2e093e858e8a0ca7bd66c1f1f6fd0a1705edb") + (title + (en "New @command{guix import go} command") + (de "Neuer Befehl @command{guix import go}") + (fr "Nouvelle commande @command{guix import go}") + (nl "Nieuwe @command{guix import go}-opdracht")) + (body + (en "The new @command{guix import go} command allows packagers to +generate a package definition or a template thereof given the name of a Go +package available through @url{https://proxy.golang.org}, like so: + +@example +guix import go golang.org/x/sys +@end example + +Run @command{info \"(guix) Invoking guix import\"} for more info.") + (de "Mit dem neuen Befehl @command{guix import go} können +Paketautoren eine Paketdefinition oder eine Vorlage dafür anhand des Namens +eines auf @url{https://proxy.golang.org} verfügbaren Go-Pakets erzeugen, etwa +so: + +@example +guix import go golang.org/x/sys +@end example + +Führen Sie @command{info \"(guix.de) Aufruf von guix import\"} aus, um mehr +Informationen zu bekommen.") + (fr "La nouvelle commande @command{guix import go} permet aux +empaqueteur·ice·s de générer une définition de paquet ou un modèle de +définition à partir du nom d'un paquet Go disponible via +@url{https://proxy.golang.org}, comme ceci : + +@example +guix import go golang.org/x/sys +@end example + +Lancez @command{info \"(guix.fr) Invoquer guix import\"} pour en savoir plus.") + (nl "Met de nieuwe @command{guix import go}-opdracht kunnen +pakketschrijvers een pakketdefinitie of -sjabloon aanmaken, op basis van de +naam van een Go-pakket te vinden op @url{https://proxy.golang.org}: + +@example +guix import go golang.org/x/sys +@end example + +Voer @command{info \"(guix) Invoking guix import\"} uit voor meer +informatie."))) + + (entry (commit "1b5b882120daf7d111aa351a919a90e818324347") + (title + (en "The @code{linux-libre} kernel is updated to 5.11.2") + (de "Der Kernel @code{linux-libre} wird auf 5.11.2 aktualisiert") + (fr "Le noyau @code{linux-libre} est mis à jour vers la 5.11.2") + (nl "De @code{linux-libre}-kernel werd bijgewertk naar 5.11.2")) + (body + (en "The default @code{linux-libre} kernel is now based on the 5.11 +stable kernel series, beginning with version 5.11.2. Promiment features include +improved Wine performance, unprivileged Overlayfs mounts, support for Intel SGX, +support for new graphics hardware, and improved performance of the Btrfs +file system.") + (de "Der standardmäßig verwendete @code{linux-libre}-Kernel basiert +jetzt auf der 5.11-„stable“-Versionsreihe, angefangen mit Version 5.11.2. Zu +den markanten Neuerungen gehören bessere Wine-Unterstützung, Einbinden per +Overlayfs für Nutzer ohne erweiterte Rechte, Unterstützung für Intel SGX, für +neue Grafikhardware und bessere Leistung beim Btrfs-Dateisystem.") + (fr "Le noyau @code{linux-libre} par défaut est maintenant basé sur la +lignée stable 5.11 du noyau, à commencer par la version 5.11.2. Parmi les +fonctionnalités notables on trouve des performances améliorées pour Wine, le +montage Overlayfs non privilégié, la prise en charge d'Intel SGX, celle des +nouveaux périphériques graphiques et de meilleures performances du système de +fichiers Btrfs.") + (nl "De standaard @code{linux-libre}-kernel is nu geëent op de +stabiele 5.11-reeks, te beginnen met versie 5.11.2. Deze update biedt onder +andere verbeterde prestaties voor Wine en het Btfrs-bestandssysteem, laat +gewone gebruikers toe om met Overlayfs bestandssystemen te combineren, en +ondersteunt Intel SGX en nieuwe grafische apparatuur."))) + + (entry (commit "6e8cdf1d26092cb9654e179b04730fff7c15c94f") + (title + (en "The @command{guix system image} command can now operate on image records") + (de "Der Befehl @command{guix system image} kann jetzt auch mit @code{image}-Verbundsobjekten umgehen") + (fr "La commande @command{guix system image} peut désormais fonctionner sur des images")) + (body + (en "The @command{guix system image} command can now operate on +@code{image} records. This means that the file parameter or the expression +passed to this command can return @code{image} or @code{operating-system} +records. + +The @file{gnu/system/images} directory contains default images that can be +built by running @command{guix system image gnu/system/images/pine64.scm} for +instance.") + (de "Sie können den Befehl @command{guix system image} jetzt auch auf +Verbundsobjekte vom Typ @code{image} anwenden. Das heißt, wenn Sie eine Datei +oder einen Ausdruck als Parameter übergeben, darf dieser ein Verbundsobjekt +vom Typ @code{image} oder @code{operating-system} zurückliefern. + +Im Verzeichnis @file{gnu/system/images} finden Sie vorkonfigurierte Abbilder +als @code{image}-Verbundsobjekte. Sie können zum Beispiel @command{guix system +image gnu/system/images/pine64.scm} ausführen, um das Abbild zu erstellen.") + (fr "La commande @command{guix system image} peut désormais +fonctionner sur des images. Cela signifie que le fichier ou l'expression +passé en paramètre de cette commande peuvent retourner une structure de type +@code{image} ou @code{operating-system}. + +Le dossier @file{gnu/system/images} contient des images par défaut qui peuvent +être construites en lançant la commande @command{guix system image +gnu/system/images/pine64.scm} par exemple."))) + (entry (commit "aa8de806252e3835d57fab351b02d13db762deac") (title (en "Risk of local privilege escalation @i{via} setuid programs") (de "Risiko lokaler Rechteausweitung bei setuid-Programmen") - (fr "Risque de gain local de privilèges @i{via} les programmes setuid")) + (fr "Risque de gain local de privilèges @i{via} les programmes setuid") + (zh "存在通过 setuid 程序进行本地提权的风险")) (body (en "On Guix System, setuid programs were, until now, installed as setuid-root @emph{and} setgid-root (in the @file{/run/setuid-programs} @@ -70,7 +460,19 @@ guix system reconfigure /run/current-system/configuration.scm Les usagers de Guix sur une distrib externe ne sont pas touché·es. Plus d'informations sont disponibles à @url{https://issues.guix.gnu.org/46395} (en -anglais)."))) +anglais).") + (zh "到目前为止,Guix 系统上的 setuid 程序(位于 @file{/run/setuid-programs}) +同时具有 setuid-root @emph{和} setgid-root 权限。然而,此类程序大多被设计为在拥有 +setuid 权限而非 setgid 权限时运行。因此,这样的设置可能会使系统受到本地提权攻击。 + +此漏洞已经被修复,同时建议用户使用下列命令升级他们的系统: + +@example +guix system reconfigure /run/current-system/configuration.scm +@end example + +在 ``第三方宿主系统'' 上使用 Guix 的用户不受此漏洞影响,详情请参阅 +@url{https://issues.guix.gnu.org/46395}。"))) (entry (commit "aedbc5ff32a62f45aeed74c6833399a6cf2c22dc") (title @@ -299,7 +701,8 @@ l'instant grâce à la librairie Guile-Avahi."))) (entry (commit "a9a2fdaabcc78e7a54d9a6bcfa4ee3de308e9a90") (title (en "Logical Volume Manager (LVM) now supported on Guix System") (de "Logical Volume Manager (LVM) wird jetzt auf Guix System unterstützt") - (es "El sistema Guix ahora implementa también volúmenes lógicos LVM")) + (es "El sistema Guix ahora implementa también volúmenes lógicos LVM") + (fr "Le gestionnaire de volumes logiques (LVM) est maintenant pris en charge par le système Guix")) (body (en "On Guix System, the new @code{lvm-device-mapping} variable allows you to declare ``mapped devices'' for LVM, the Linux Logical Volume @@ -341,7 +744,20 @@ los volúmenes lógicos «alfa» y «beta» del grupo de volúmenes «vg0»: @end lisp Véase @command{info \"(guix.es) Dispositivos traducidos\"} para obtener más -información."))) +información.") + (fr "Sur le système Guix, la nouvelle variable @code{lvm-device-mapping} +vous permet de déclarer des « périphériques mappés » pour LVM, le gestionnaire +de volumes logiques. Par exemple, vous pouvez déclarer les volumes logiques +« alpha » et « beta » du groupe « vg0 » comme ceci : + +@lisp +(mapped-device + (source \"vg0\") + (target (list \"vg0-alpha\" \"vg0-beta\")) + (type lvm-device-mapping)) +@end lisp + +Voir @command{info \"(guix.fr) Périphériques mappés\"} pour en savoir plus."))) (entry (commit "3b6e4e5fd05e72b8a32ff1a2d5e21464260e21e6") (title (en "List of substitute keys is now declarative on Guix System") @@ -992,7 +1408,8 @@ engine") (es "@command{guix pack -RR} introduce un nuevo motor de ejecución") (de "@command{guix pack -RR} führt neuen Ausführungstreiber -ein")) +ein") + (fr "@command{guix pack -RR} introduit un nouveau moteur d'exécution")) (body (en "The @command{guix pack -RR} command allows you to create a tarball containing @dfn{relocatable binaries}. Until now, those would rely @@ -1051,12 +1468,30 @@ export GUIX_EXECUTION_ENGINE @end example Führen Sie @command{info \"(guix.de) Aufruf von guix pack\"} aus, wenn Sie -mehr wissen wollen."))) +mehr wissen wollen.") + (fr "La commande @command{guix pack -RR} vous permet de créer une +archive tar contenant des @dfn{binaires repositionnables}. Jusqu'ici, ils +s'appuyaient sur les « espaces de noms non privilégiés » de Linux ou sur +PRoot, quand les espaces de noms non privilégiés n'étaient pas disponibles. +Cependant, PRoot ralenti significativement certains profils d'exécution. + +Pour éviter cela, @command{guix pack -RR} introduit une troisième possibilité +basée sur une extension de l'éditeur des liens à l'exécution de GNU (ld.so) et +sur Fakechroot, qui ralenti très peu l'exécution. Vous pouvez choisir l'option +la plus rapide à l'exécution d'un binaire relocalisable de cette manière : + +@example +GUIX_EXECUTION_ENGINE=performance +export GUIX_EXECUTION_ENGINE +@end example + +Lancez @command{info \"(guix.fr) Invoquer guix pack\"} pour en savoir plus."))) (entry (commit "88a96c568c47c97d05d883ada5afbc4e1200b10f") (title (en "New @option{--path} option for @command{guix graph}") (es "Nueva opción @option{--path} para @command{guix graph}") - (de "Neue Option @option{--path} für @command{guix graph}")) + (de "Neue Option @option{--path} für @command{guix graph}") + (fr "Nouvelle option @option{--path} pour @command{guix graph}")) (body (en "The @command{guix graph} command has a new @option{--path} option that instructs it to display the shortest path between two packages, @@ -1091,7 +1526,18 @@ guix graph --path libreoffice libunistring @end example Führen Sie @code{info \"(guix.de) Aufruf von guix graph\"} aus, um mehr zu -erfahren."))) +erfahren.") + (fr "La commande @command{guix graph} a une nouvelle option +@option{--path} qui lui dit d'afficer le plus court chemin entre deux +paquets, dérivations ou éléments du dépôt. Par exemple, la commande ci-dessous +affiche le plus court chemin entre le paquet @code{libreoffice} et +@code{libunistring} : + +@example +guix graph --path libreoffice libunistring +@end example + +Lancez @code{info \"(guix.fr) Invoquer guix graph\"} pour en savoir plus."))) (entry (commit "a33eac038a811603c8b9ed106ae405a5f80a0e9d") (title (en "GNU C Library upgraded") @@ -1197,7 +1643,8 @@ Rezepte mit uns zu teilen!"))) (entry (commit "2ca7af43fe17d9acf082dce85d137a27a8ac4887") (title (en "Further reduced binary seed bootstrap") - (de "Bootstrapping jetzt mit noch kleinerem Seed")) + (de "Bootstrapping jetzt mit noch kleinerem Seed") + (fr "Le bootstrap binaire est encore plus réduit")) (body (en "The package graph on x86_64 and i686 is now rooted in a further @dfn{reduced set of binary seeds}. The initial set of binaries from which @@ -1209,11 +1656,18 @@ the talk at @uref{https://fosdem.org/2020/schedule/event/gnumes/}.") Menge an Binärdateien, aus denen heraus Pakete erstellt werden, machen nun ungefähr 60 MiB aus, ein Viertel der früheren Größe. Führen Sie @code{info \"(guix.de) Bootstrapping\"} aus, um mehr zu erfahren, oder schauen Sie sich -den Vortrag auf @uref{https://fosdem.org/2020/schedule/event/gnumes/} an."))) +den Vortrag auf @uref{https://fosdem.org/2020/schedule/event/gnumes/} an.") + (fr "Le graphe des paquets sur x86_64 et i686 prend maintenant racine +dans un @dfn{ensemble de graines binaires} plus réduit. L'ensemble initial +des binaires à partir desquels les paquets sont désormais construit pèse +environ 60 Mo, un quart de ce qu'il était. Lancez +@code{info \"(guix.fr) Bootstrapping\"} pour en savoir plus, ou regardez +la présentation sur @uref{https://fosdem.org/2020/schedule/event/gnumes/}."))) (entry (commit "0468455e7d279c89ea3ad1b51935efb2b785ec47") (title (en "Rottlog service added to @code{%base-services}") - (de "Rottlog-Dienst ist nun Teil der @code{%base-services}")) + (de "Rottlog-Dienst ist nun Teil der @code{%base-services}") + (fr "Le service rottlog a été ajouté à @code{%base-services}")) (body (en "An instance of @code{rottlog-service-type}, the system service responsible for log rotation, has been added to @code{%base-services}. If your operating system configuration for Guix System is explicitly adding @@ -1223,11 +1677,18 @@ the ``Log Rotation'' section of the manual for more information.") Log-Rotation wurde zu den @code{%base-services} hinzugefügt. Wenn der Systemdienst bereits in Ihrer Konfiguration für Guix System ausdrücklich genannt wurde, sollten Sie ihn jetzt daraus entfernen. Siehe den Abschnitt -„Log-Rotation“ im Handbuch für weitere Informationen."))) +„Log-Rotation“ im Handbuch für weitere Informationen.") + (fr "Une instance de @code{rottlog-service-type}, le service +système responsable de la rotation des journaux, a été ajoutée à +@code{%base-services}. Si votre configuration de système d'exploitation Guix +System ajoute @code{rottlog-service-type} explicitement, vous devriez maintenant +le supprimer. Voir la section « Rotation des journaux » dans le manuel +pour en savoir plus."))) (entry (commit "b6bee63bed4f013064c0d902e7c8b83ed7514ade") (title (en "@code{guile} package now refers to version 3.0") - (de "Das @code{guile}-Paket bezeichnet jetzt Version 3.0")) + (de "Das @code{guile}-Paket bezeichnet jetzt Version 3.0") + (fr "Le paquet @code{guile} se réfère maintenant à la version 3.0")) (body (en "The @code{guile} package has been upgraded to version 3.0 (instead of 2.2). The @code{guile3.0-} packages have been renamed to their original name, and @code{guile2.2-} variants of these packages have been @@ -1238,7 +1699,12 @@ system services also run on 3.0.") beginnen, wurden umbenannt, so dass sie nun den unveränderten Namen tragen, während ihre Varianten mit @code{guile2.2-} hinzugefügt wurden. Des Weiteren werden jetzt alle Ableitungen mit Guile 3.0 erstellt und die Systemdienste -laufen auch auf 3.0."))) +laufen auch auf 3.0.") + (fr "Le paquet @code{guile} a été mis à jour vers la version 3.0 +(au lieu de la 2.2). Les paquets @code{guile3.0-} ont été renommés en leur +nom d'origine et les variantes @code{guile2.2-} de ces paquets ont été définis. +En plus, les dérivation sont maintenant construites avec Guile 3.0, et les +services systèmes utilisent aussi la 3.0."))) (entry (commit "e3e1a7ba08af2d58c47264c543617e499c239444") (title (en "@command{guix pull} now supports SSH authenticated @@ -1344,7 +1810,9 @@ historique."))) (entry (commit "3e962e59d849e4300e447d94487684102d9d412e") (title (en "@command{guix graph} now supports package transformations") - (de "@command{guix graph} unterstützt nun Paketumwandlungen")) + (de "@command{guix graph} unterstützt nun Paketumwandlungen") + (fr "@command{guix graph} prend maintenant en charge les +transformations de paquets")) (body (en "The @command{guix graph} command now supports the common package transformation options (see @command{info \"(guix) Package Transformation @@ -1359,7 +1827,11 @@ Abhängigkeitsgraphen zu sehen.") comunes de transformación de paquetes (véase @command{info \"(guix.es) Opciones de transformación de paquetes\"}). Esto es particularmente útil para comprobar el efecto de la opción de reescritura del grafo -de dependencias @option{--with-input}."))) +de dependencias @option{--with-input}.") + (fr "La commande @command{guix graph} prend maintenant en charge les +transformations de paquets communes (voir @command{info \"(guix.fr) Options de +transformation de paquets\"}). C'est particulièrement utile pour voir l'effet +de l'option @option{--with-input} qui réécrit de graphe de dépendance."))) (entry (commit "49af34cfac89d384c46269bfd9388b2c73b1220a") (title (en "@command{guix pull} now honors |