mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Alan Stern <stern@rowland.harvard.edu>
To: Kees Cook <keescook@chromium.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-usb@vger.kernel.org, usb-storage@lists.one-eyed-alien.net,
	linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org
Subject: Re: [PATCH] USB: ene_usb6250: Allocate enough memory for full object
Date: Sat, 4 Feb 2023 14:43:47 -0500	[thread overview]
Message-ID: <Y961c1/JIkDUqMbC@rowland.harvard.edu> (raw)
In-Reply-To: <20230204183546.never.849-kees@kernel.org>

On Sat, Feb 04, 2023 at 10:35:46AM -0800, Kees Cook wrote:
> The allocation of PageBuffer is 512 bytes in size, but the dereferencing
> of struct ms_bootblock_idi (also size 512) happens at a calculated offset
> within the allocation, which means the object could potentially extend
> beyond the end of the allocation. Avoid this case by just allocating
> enough space to catch any accesses beyond the end. Seen with GCC 13:

In principle, it would be better to add a runtime check for overflow.  
Doing it this way means that the code could read an invalid value.

In fact, I get the impression that this code tries to load a data 
structure which might straddle a page boundary by reading in just the 
first page.  Either that, or else EntryOffset is always a multiple of 
512 so the error cannot arise.

In any event, it's doubtful that there are very many devices of this 
sort still in use, so it probably doesn't matter.

Alan Stern

> 
> ../drivers/usb/storage/ene_ub6250.c: In function 'ms_lib_process_bootblock':
> ../drivers/usb/storage/ene_ub6250.c:1050:44: warning: array subscript 'struct ms_bootblock_idi[0]' is partly outside array bounds of 'unsigned char[512]' [-Warray-bounds=]
>  1050 |                         if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
>       |                                            ^~
> ../include/uapi/linux/byteorder/little_endian.h:37:51: note: in definition of macro '__le16_to_cpu'
>    37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
>       |                                                   ^
> ../drivers/usb/storage/ene_ub6250.c:1050:29: note: in expansion of macro 'le16_to_cpu'
>  1050 |                         if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
>       |                             ^~~~~~~~~~~
> In file included from ../drivers/usb/storage/ene_ub6250.c:5:
> In function 'kmalloc',
>     inlined from 'ms_lib_process_bootblock' at ../drivers/usb/storage/ene_ub6250.c:942:15:
> ../include/linux/slab.h:580:24: note: at offset [256, 512] into object of size 512 allocated by 'kmalloc_trace'
>   580 |                 return kmalloc_trace(
>       |                        ^~~~~~~~~~~~~~
>   581 |                                 kmalloc_caches[kmalloc_type(flags)][index],
>       |                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>   582 |                                 flags, size);
>       |                                 ~~~~~~~~~~~~
> 
> Cc: Alan Stern <stern@rowland.harvard.edu>
> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Cc: linux-usb@vger.kernel.org
> Cc: usb-storage@lists.one-eyed-alien.net
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---
>  drivers/usb/storage/ene_ub6250.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/storage/ene_ub6250.c b/drivers/usb/storage/ene_ub6250.c
> index 6012603f3630..97c66c0d91f4 100644
> --- a/drivers/usb/storage/ene_ub6250.c
> +++ b/drivers/usb/storage/ene_ub6250.c
> @@ -939,7 +939,7 @@ static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageDa
>  	struct ms_lib_type_extdat ExtraData;
>  	struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
>  
> -	PageBuffer = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
> +	PageBuffer = kzalloc(MS_BYTES_PER_PAGE * 2, GFP_KERNEL);
>  	if (PageBuffer == NULL)
>  		return (u32)-1;
>  
> -- 
> 2.34.1
> 

  reply	other threads:[~2023-02-04 19:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-04 18:35 Kees Cook
2023-02-04 19:43 ` Alan Stern [this message]
2023-02-06 18:33   ` Kees Cook
2023-02-06 19:00     ` Alan Stern

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y961c1/JIkDUqMbC@rowland.harvard.edu \
    --to=stern@rowland.harvard.edu \
    --cc=gregkh@linuxfoundation.org \
    --cc=keescook@chromium.org \
    --cc=linux-hardening@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=usb-storage@lists.one-eyed-alien.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®