[pacman-dev] [PATCH v3] libmakepkg/integrity: check for invalid tags

Allan McRae allan at archlinux.org
Wed Sep 13 01:48:48 UTC 2017


On 28/07/17 13:59, Eli Schwartz wrote:
> As per https://lists.archlinux.org/pipermail/arch-general/2017-July/043876.html
> git doesn't check that the tag name matches what an annotated tag object
> *thinks* it should be called. This is a bit of a theoretical attack and
> some would argue that we should always use commits since upstream can
> legitimately change a tag, but nevertheless this can result in a
> downgrade attack if the git download transport was manipulated or the
> upstream repository hacked.
> 
> So, check the tag blob to make sure the tag actually matches the name we
> used for `git checkout`.
> 
> This really should be fixed in git itself, rather than forcing all
> downstream users of git verify-tag to implement their own checks, but
> the git developers disagree, see the discussion surrounding
> https://public-inbox.org/git/xmqqk2hzldx8.fsf@gitster.mtv.corp.google.com/
> 
> Signed-off-by: Eli Schwartz <eschwartz at archlinux.org>
> ---
> 
> v3: Reference a discussion with the git developers. @sangy says that
> thread is where the initial decision to follow their current approach
> happened.
> 
> Use a better FAILED message.
> 
>  scripts/libmakepkg/integrity/verify_signature.sh.in | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/scripts/libmakepkg/integrity/verify_signature.sh.in b/scripts/libmakepkg/integrity/verify_signature.sh.in
> index 24519dbe..4f9f97ca 100644
> --- a/scripts/libmakepkg/integrity/verify_signature.sh.in
> +++ b/scripts/libmakepkg/integrity/verify_signature.sh.in
> @@ -187,6 +187,13 @@ verify_git_signature() {
>  
>  	printf "    %s git repo ... " "${dir##*/}" >&2
>  
> +	tagname="$(git -C "$dir" tag -l --format='%(tag)' "$fragval")"
> +	if [[ $fragtype = tag && -n $tagname && $tagname != $fragval ]]; then
> +		printf "%s (%s)" "$(gettext "FAILED")" "$(gettext "the git tag has been forged")" >&2
> +		errors=1
> +		return 1
> +	fi
> +

Why is this in verify_signature?  As far as I can tell, it has nothing
to do with signatures and should just be down in the extract_git()
function when we are dealing with a tag.

>  	git -C "$dir" verify-$fragtype --raw "$fragval" > "$statusfile" 2>&1
>  	if ! grep -qs NEWSIG "$statusfile"; then
>  		printf '%s\n' "$(gettext "SIGNATURE NOT FOUND")" >&2
> 


More information about the pacman-dev mailing list