]> www.infradead.org Git - users/hch/xfs.git/commitdiff
binfmt_flat: Fix integer overflow bug on 32 bit systems
authorDan Carpenter <dan.carpenter@linaro.org>
Wed, 4 Dec 2024 12:07:15 +0000 (15:07 +0300)
committerKees Cook <kees@kernel.org>
Fri, 10 Jan 2025 16:49:05 +0000 (08:49 -0800)
Most of these sizes and counts are capped at 256MB so the math doesn't
result in an integer overflow.  The "relocs" count needs to be checked
as well.  Otherwise on 32bit systems the calculation of "full_data"
could be wrong.

full_data = data_len + relocs * sizeof(unsigned long);

Fixes: c995ee28d29d ("binfmt_flat: prevent kernel dammage from corrupted executable headers")
Cc: stable@vger.kernel.org
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Acked-by: Nicolas Pitre <npitre@baylibre.com>
Link: https://lore.kernel.org/r/5be17f6c-5338-43be-91ef-650153b975cb@stanley.mountain
Signed-off-by: Kees Cook <kees@kernel.org>
fs/binfmt_flat.c

index 390808ce935d50b94b73682bf0c5e7f6152697c4..b5b5ca1a44f70bdd08567d2d1587c8af0de26ac0 100644 (file)
@@ -478,7 +478,7 @@ static int load_flat_file(struct linux_binprm *bprm,
         * 28 bits (256 MB) is way more than reasonable in this case.
         * If some top bits are set we have probable binary corruption.
        */
-       if ((text_len | data_len | bss_len | stack_len | full_data) >> 28) {
+       if ((text_len | data_len | bss_len | stack_len | relocs | full_data) >> 28) {
                pr_err("bad header\n");
                ret = -ENOEXEC;
                goto err;