[pacman-dev] [PATCH] pacman-key: Do not reinterpret keys from revoked keyrings

Allan McRae allan at archlinux.org
Tue Jun 4 00:01:31 EDT 2013


On 04/06/13 04:13, Dave Reisner wrote:
> Given a revoked keyring containing only:
> 
>   BC1FBE4D2826A0B51E47ED62E2539214C6C11350
> 
> We should only disable this specific keyid. This change enforces that the
> contents of the -revoked keyring file are full fingerprints which can uniquely
> identify a key.
> 
> Before:
> 
>   # pacman-key --populate archlinux
>   ==> Appending keys from archlinux.gpg...
>   ==> Locally signing trusted keys in keyring...
>     -> Locally signing key 0E8B644079F599DFC1DDC3973348882F6AC6A4C2...
>     -> Locally signing key 684148BB25B49E986A4944C55184252D824B18E8...
>     -> Locally signing key 44D4A033AC140143927397D47EFD567D4C7EA887...
>     -> Locally signing key 27FFC4769E19F096D41D9265A04F9397CDFD6BB0...
>     -> Locally signing key AB19265E5D7D20687D303246BA1DFB64FFF979E7...
>   ==> Importing owner trust values...
>   ==> Disabling revoked keys in keyring...
>     -> Disabling key 1390420191...
>     -> Disabling key E2539214C6C11350...
>     -> Disabling key 8544EA82113502DE...
>   ==> Updating trust database...
>   gpg: next trustdb check due at 2014-01-22
> 
> After:
> 
>   # pacman-key --populate archlinux
>   ==> Appending keys from archlinux.gpg...
>   ==> Locally signing trusted keys in keyring...
>     -> Locally signing key 0E8B644079F599DFC1DDC3973348882F6AC6A4C2...
>     -> Locally signing key 684148BB25B49E986A4944C55184252D824B18E8...
>     -> Locally signing key 44D4A033AC140143927397D47EFD567D4C7EA887...
>     -> Locally signing key 27FFC4769E19F096D41D9265A04F9397CDFD6BB0...
>     -> Locally signing key AB19265E5D7D20687D303246BA1DFB64FFF979E7...
>   ==> Importing owner trust values...
>   ==> Disabling revoked keys in keyring...
>     -> Disabling key BC1FBE4D2826A0B51E47ED62E2539214C6C11350...
>   ==> Updating trust database...
>   gpg: next trustdb check due at 2014-01-22
> 
> Partially addresses FS#35478. This does nothing to confirm whether or not the
> key was successfully disabled -- a ridiculously simple request which appears to
> be far too difficult for gpg to manage.
> 
> Signed-off-by: Dave Reisner <dreisner at archlinux.org>

Signed-off-by: Me
-> maint

> ---
> Seriously, wtf gpg. The only indication that the key was successfully disabled
> appears to come from the output that we dump to /dev/null:
> 
>   gpg: WARNING: unsafe permissions on homedir `/etc/pacman.d/gnupg'
> 
>   pub  2048R/C6C11350  created: 2012-11-30  expires: never       usage: SC
>                        trust: unknown       validity: marginal
>   *** This key has been disabled
>   sub  2048R/113502DE  created: 2012-11-30  expires: never       usage: E
>   [marginal] (1). Federico Cinelli <cinelli.federico at gmail.com>
> 
> You can try to use the key as a recipient for an encrypted message, but this
> seems to only fail with INV_RECP, e.g.:
> 
> $ gpg --homedir /etc/pacman.d/gnupg --batch -aer BC1FBE4D2826A0B51E47ED62E2539214C6C11350 --status-fd=1 <<<'' 2>/dev/null
> [GNUPG:] INV_RECP 0 BC1FBE4D2826A0B51E47ED62E2539214C6C11350
> 
> BUT... INV_RECP doesn't say anything about the reason the recipient is invalid.
> It might be invalid because it's disabled, and it might be invalid because it
> can't be found. So... blah. Suggestions welcome.
> 
> Also, just a point of clarification -- I assume that we disable keys rather
> than revoke signatures out of concern that the key could be trustworthy
> based on signatures other than those of the master key owners?

Partly.  Also it is often quicker for a distro to release an updated
keyring with a key disabled than it is to get the required master key
holders to revoke it.

>  scripts/pacman-key.sh.in | 15 ++++-----------
>  1 file changed, 4 insertions(+), 11 deletions(-)
> 
> diff --git a/scripts/pacman-key.sh.in b/scripts/pacman-key.sh.in
> index 92875ef..30fba10 100644
> --- a/scripts/pacman-key.sh.in
> +++ b/scripts/pacman-key.sh.in
> @@ -310,19 +310,12 @@ populate_keyring() {
>  		done
>  	fi
>  
> -	# Read the revoked key IDs to an array. The conversion from whatever is
> -	# inside the file to key ids is important, because key ids are the only
> -	# guarantee of identification for the keys.
>  	local -A revoked_ids
>  	for keyring in "${KEYRINGIDS[@]}"; do
> -		if [[ -s "${KEYRING_IMPORT_DIR}/${keyring}-revoked" ]]; then
> -			mapfile -t keys < "${KEYRING_IMPORT_DIR}/${keyring}-revoked"
> -			while IFS=: read _ _ _ _ key_id _; do
> -				if [[ -n $key_id ]]; then
> -					# Mark this key to be disabled
> -					revoked_ids[$key_id]="${keyring}"
> -				fi
> -			done < <("${GPG_PACMAN[@]}" --quiet --with-colons --list-keys "${keys[@]}" 2>/dev/null)
> +		if [[ -s $KEYRING_IMPORT_DIR/$keyring-revoked ]]; then
> +			while read -r key_id; do
> +				revoked_ids["$key_id"]=1
> +			done <"$KEYRING_IMPORT_DIR/$keyring-revoked"
>  		fi
>  	done
>  
> 



More information about the pacman-dev mailing list