Bug#866964: libgcrypt20: mpi_set_secure leads to heap corruption
Mark Wooding
mdw at distorted.org.uk
Mon Jul 3 02:35:47 UTC 2017
Package: libgcrypt20
Version: 1.7.6-2+deb9u1
Severity: normal
Tags: patch
The function `mpi_set_secure' is used by `gcry_mpi_set_flag' to convert
an integer so as to use `secure' (i.e., locked, non-swappable) memory.
It's broken.
The code in 1.7.8 (sid) is the same, so that's broken too.
The code allocates enough secure memory for the active limbs, copies
them from the existing buffer, and stores a pointer to the new buffer --
all without reducing the separate count of the number of allocated
limbs. In particular, when the securified integer is freed,
`_gcry_mpi_free' calls `_gcry_mpi_free_limb_space' to release the limb
buffer, giving it the allocated size, and the latter attempts to zeroize
the storage, leading to a heap corruption.
The patch fixes the problem. I've not thought deeply about the
performance effects: maybe it'd be better to allocate the same total
limb buffer rather than just the active size, but this patch is simple
and obviously right.
diff --git a/mpi/mpiutil.c b/mpi/mpiutil.c
index 6dee0b9..2a32d26 100644
--- a/mpi/mpiutil.c
+++ b/mpi/mpiutil.c
@@ -260,6 +260,7 @@ mpi_set_secure( gcry_mpi_t a )
MPN_COPY( bp, ap, a->nlimbs );
a->d = bp;
_gcry_mpi_free_limb_space (ap, a->alloced);
+ a->alloced = a->nlimbs;
}
-- System Information:
Debian Release: 9.0
APT prefers stable
APT policy: (990, 'stable')
Architecture: i386 (i686)
Foreign Architectures: amd64
Kernel: Linux 4.9.0-3-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_GB.utf8, LC_CTYPE=en_GB.utf8 (charmap=UTF-8), LANGUAGE=en_GB.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: sysvinit (via /sbin/init)
Versions of packages libgcrypt20 depends on:
ii libc6 2.24-11+deb9u1
ii libgpg-error0 1.26-2
libgcrypt20 recommends no packages.
Versions of packages libgcrypt20 suggests:
pn rng-tools <none>
-- no debconf information
More information about the Pkg-gnutls-maint
mailing list