linux/lib/mpi
Lukas Wunner 1abd50fc3c lib/crypto: mpi: Fix integer underflow in mpi_read_raw_from_sgl()
commit 8c2f128825 upstream.

Yiming reports an integer underflow in mpi_read_raw_from_sgl() when
subtracting "lzeros" from the unsigned "nbytes".

For this to happen, the scatterlist "sgl" needs to occupy more bytes
than the "nbytes" parameter and the first "nbytes + 1" bytes of the
scatterlist must be zero.  Under these conditions, the while loop
iterating over the scatterlist will count more zeroes than "nbytes",
subtract the number of zeroes from "nbytes" and cause the underflow.

When commit 2d4d1eea54 ("lib/mpi: Add mpi sgl helpers") originally
introduced the bug, it couldn't be triggered because all callers of
mpi_read_raw_from_sgl() passed a scatterlist whose length was equal to
"nbytes".

However since commit 63ba4d6759 ("KEYS: asymmetric: Use new crypto
interface without scatterlists"), the underflow can now actually be
triggered.  When invoking a KEYCTL_PKEY_ENCRYPT system call with a
larger "out_len" than "in_len" and filling the "in" buffer with zeroes,
crypto_akcipher_sync_prep() will create an all-zero scatterlist used for
both the "src" and "dst" member of struct akcipher_request and thereby
fulfil the conditions to trigger the bug:

  sys_keyctl()
    keyctl_pkey_e_d_s()
      asymmetric_key_eds_op()
        software_key_eds_op()
          crypto_akcipher_sync_encrypt()
            crypto_akcipher_sync_prep()
              crypto_akcipher_encrypt()
                rsa_enc()
                  mpi_read_raw_from_sgl()

To the user this will be visible as a DoS as the kernel spins forever,
causing soft lockup splats as a side effect.

Fix it.

Reported-by: Yiming Qian <yimingqian591@gmail.com> # off-list
Fixes: 2d4d1eea54 ("lib/mpi: Add mpi sgl helpers")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v4.4+
Reviewed-by: Ignat Korchagin <ignat@linux.win>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Link: https://lore.kernel.org/r/59eca92ff4f87e2081777f1423a0efaaadcfdb39.1776003111.git.lukas@wunner.de
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-06-19 13:33:39 +02:00
..
ec.c crypto: lib/mpi - Fix unexpected pointer access in mpi_ec_init 2024-02-23 08:55:11 +01:00
generic_mpih-add1.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
generic_mpih-lshift.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
generic_mpih-mul1.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
generic_mpih-mul2.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
generic_mpih-mul3.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
generic_mpih-rshift.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
generic_mpih-sub1.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
longlong.h lib/mpi: fix spelling mistakes 2021-07-01 11:06:05 -07:00
Makefile lib/mpi: Introduce ec implementation to MPI library 2020-09-25 17:48:54 +10:00
mpi-add.c lib/mpi: Extend the MPI library 2020-09-25 17:48:53 +10:00
mpi-bit.c lib/mpi/mpi-bit.c: fix spello of "functions" 2020-10-16 11:11:20 -07:00
mpi-cmp.c crypto: lib/mpi - avoid null pointer deref in mpi_cmp_ui() 2023-09-23 11:09:56 +02:00
mpi-div.c lib/mpi: Fix unused variable warnings 2020-10-02 18:02:13 +10:00
mpi-inline.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
mpi-internal.h lib/mpi: Fix unused variable warnings 2020-10-02 18:02:13 +10:00
mpi-inv.c lib/mpi: Extend the MPI library 2020-09-25 17:48:53 +10:00
mpi-mod.c lib/mpi: Add the return value check of kcalloc() 2022-01-27 11:03:58 +01:00
mpi-mul.c lib/mpi: Fix unused variable warnings 2020-10-02 18:02:13 +10:00
mpi-pow.c Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6 2019-07-05 13:31:19 +09:00
mpi-sub-ui.c lib/mpi: Add mpi_sub_ui() 2020-07-31 18:08:59 +10:00
mpicoder.c lib/crypto: mpi: Fix integer underflow in mpi_read_raw_from_sgl() 2026-06-19 13:33:39 +02:00
mpih-cmp.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 26 2019-05-24 17:27:10 +02:00
mpih-div.c lib/mpi: Fix unused variable warnings 2020-10-02 18:02:13 +10:00
mpih-mul.c lib/mpi: Extend the MPI library 2020-09-25 17:48:53 +10:00
mpiutil.c lib/mpi: use kcalloc in mpi_resize 2021-08-12 19:17:00 +08:00