[pacman-dev] [PATCH] ensure matching database and package version

Andrew Gregory andrew.gregory.8 at gmail.com
Sat Jul 18 15:41:46 UTC 2015


On 07/18/15 at 04:55pm, Levente Polyak wrote:
> While loading each package ensure that the internal version matches the
> expected database version to avoid the possibility to circumvent the
> version check.
> This issue can be used by an attacker to trick the software into
> installing an older version. The behavior can be  exploited by a
> man-in-the-middle attack through specially crafted  database tarball
> containing a higher version, yet actually delivering an  older and
> vulnerable version, which was previously shipped.
> 
> Signed-off-by: Levente Polyak <anthraxx at archlinux.org>
> Signed-off-by: Remi Gacogne <rgacogne at archlinux.org>
> ---
>  lib/libalpm/sync.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
> index 888ae15..8504e02 100644
> --- a/lib/libalpm/sync.c
> +++ b/lib/libalpm/sync.c
> @@ -1212,6 +1212,7 @@ static int load_packages(alpm_handle_t *handle, alpm_list_t **data,
>  	EVENT(handle, &event);
> 
>  	for(i = handle->trans->add; i; i = i->next, current++) {
> +		int error = 0;
>  		alpm_pkg_t *spkg = i->data;
>  		char *filepath;
>  		int percent = (int)(((double)current_bytes / total_bytes) * 100);
> @@ -1232,6 +1233,21 @@ static int load_packages(alpm_handle_t *handle, alpm_list_t **data,
>  				spkg->name);
>  		alpm_pkg_t *pkgfile =_alpm_pkg_load_internal(handle, filepath, 1);
>  		if(!pkgfile) {
> +			_alpm_log(handle, ALPM_LOG_DEBUG, "failed to load pkgfile internal\n");
> +			error = 1;
> +		} else {
> +			if(strcmp(spkg->name, pkgfile->name) != 0) {
> +				_alpm_log(handle, ALPM_LOG_DEBUG, "internal package name missmatch, expected: '%s', actual: '%s'\n",

s/missmatch/mismatch/.  Also, we try to stay close to 80 columns,
please wrap these long lines.

> +						spkg->name, pkgfile->name);
> +				error = 1;
> +			}
> +			if(alpm_pkg_vercmp(spkg->version, pkgfile->version) != 0) {

I don't think there's any reason to support different version strings
even if they are equivalent, an ordinary strcmp should suffice.

> +				_alpm_log(handle, ALPM_LOG_DEBUG, "internal package version mismatch, expected: '%s', actual: '%s'\n",
> +						spkg->version, pkgfile->version);

Same as above.

> +				error = 1;
> +			}
> +		}
> +		if(error != 0) {
>  			errors++;
>  			*data = alpm_list_add(*data, strdup(spkg->filename));
>  			free(filepath);
> -- 
> 2.4.6


More information about the pacman-dev mailing list