diff mbox series

binfmt_flat: Fix integer overflow bug on 32 bit systems

Message ID 5be17f6c-5338-43be-91ef-650153b975cb@stanley.mountain (mailing list archive)
State New
Headers show
Series binfmt_flat: Fix integer overflow bug on 32 bit systems | expand

Commit Message

Dan Carpenter Dec. 4, 2024, 12:07 p.m. UTC
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>
---
 fs/binfmt_flat.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Dan Carpenter Jan. 10, 2025, 11:51 a.m. UTC | #1
Ping.

regards,
dan carpenter

On Wed, Dec 04, 2024 at 03:07:15PM +0300, Dan Carpenter wrote:
> 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>
> ---
>  fs/binfmt_flat.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> index 390808ce935d..b5b5ca1a44f7 100644
> --- a/fs/binfmt_flat.c
> +++ b/fs/binfmt_flat.c
> @@ -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;
> -- 
> 2.45.2
Nicolas Pitre Jan. 10, 2025, 3:55 p.m. UTC | #2
On Fri, 10 Jan 2025, Dan Carpenter wrote:

> Ping.
> 
> regards,
> dan carpenter
> 
> On Wed, Dec 04, 2024 at 03:07:15PM +0300, Dan Carpenter wrote:
> > 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>


> > ---
> >  fs/binfmt_flat.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
> > index 390808ce935d..b5b5ca1a44f7 100644
> > --- a/fs/binfmt_flat.c
> > +++ b/fs/binfmt_flat.c
> > @@ -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;
> > -- 
> > 2.45.2
>
Kees Cook Jan. 10, 2025, 4:49 p.m. UTC | #3
On Wed, 04 Dec 2024 15:07:15 +0300, Dan Carpenter wrote:
> 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);
> 
> [...]

Applied to for-next/topic/execve/core, thanks!

[1/1] binfmt_flat: Fix integer overflow bug on 32 bit systems
      https://git.kernel.org/kees/c/55cf2f4b945f

Take care,
diff mbox series

Patch

diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 390808ce935d..b5b5ca1a44f7 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -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;