All of lore.kernel.org
 help / color / mirror / Atom feed
From: Brooke Basile <brookebasile@gmail.com>
To: Bryan O'Donoghue <bryan.odonoghue@linaro.org>,
	balbi@kernel.org, gregkh@linuxfoundation.org,
	linux-usb@vger.kernel.org
Cc: Ilja Van Sprundel <ivansprundel@ioactive.com>,
	stable <stable@kernel.org>
Subject: Re: [PATCH] USB: gadget: f_ncm: Fix NDP16 datagram validation
Date: Sun, 20 Sep 2020 17:08:49 -0400	[thread overview]
Message-ID: <34126e7e-270b-fd9d-e08a-588feec758a5@gmail.com> (raw)
In-Reply-To: <20200920170158.1217068-1-bryan.odonoghue@linaro.org>

On 9/20/20 1:01 PM, Bryan O'Donoghue wrote:
> commit 2b74b0a04d3e ("USB: gadget: f_ncm: add bounds checks to ncm_unwrap_ntb()")
> adds important bounds checking however it unfortunately also introduces  a
> bug with respect to section 3.3.1 of the NCM specification.
> 
> wDatagramIndex[1] : "Byte index, in little endian, of the second datagram
> described by this NDP16. If zero, then this marks the end of the sequence
> of datagrams in this NDP16."
> 
> wDatagramLength[1]: "Byte length, in little endian, of the second datagram
> described by this NDP16. If zero, then this marks the end of the sequence
> of datagrams in this NDP16."
> 
> wDatagramIndex[1] and wDatagramLength[1] respectively then may be zero but
> that does not mean we should throw away the data referenced by
> wDatagramIndex[0] and wDatagramLength[0] as is currently the case.
> 
> Breaking the loop on (index2 == 0 || dg_len2 == 0) should come at the end
> as was previously the case and checks for index2 and dg_len2 should be
> removed since zero is valid.
> 
> I'm not sure how much testing the above patch received but for me right now
> after enumeration ping doesn't work. Reverting the commit restores ping,
> scp, etc.
> 
> The extra validation associated with wDatagramIndex[0] and
> wDatagramLength[0] appears to be valid so, this change removes the incorrect
> restriction on wDatagramIndex[1] and wDatagramLength[1] restoring data
> processing between host and device.
> 
> Fixes: 2b74b0a04d3e ("USB: gadget: f_ncm: add bounds checks to ncm_unwrap_ntb()")
> Cc: Ilja Van Sprundel <ivansprundel@ioactive.com>
> Cc: Brooke Basile <brookebasile@gmail.com>
> Cc: stable <stable@kernel.org>
> Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
> ---
>   drivers/usb/gadget/function/f_ncm.c | 30 ++---------------------------
>   1 file changed, 2 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c
> index b4206b0dede5..1f638759a953 100644
> --- a/drivers/usb/gadget/function/f_ncm.c
> +++ b/drivers/usb/gadget/function/f_ncm.c
> @@ -1189,7 +1189,6 @@ static int ncm_unwrap_ntb(struct gether *port,
>   	const struct ndp_parser_opts *opts = ncm->parser_opts;
>   	unsigned	crc_len = ncm->is_crc ? sizeof(uint32_t) : 0;
>   	int		dgram_counter;
> -	bool		ndp_after_header;
>   
>   	/* dwSignature */
>   	if (get_unaligned_le32(tmp) != opts->nth_sign) {
> @@ -1216,7 +1215,6 @@ static int ncm_unwrap_ntb(struct gether *port,
>   	}
>   
>   	ndp_index = get_ncm(&tmp, opts->ndp_index);
> -	ndp_after_header = false;
>   
>   	/* Run through all the NDP's in the NTB */
>   	do {
> @@ -1232,8 +1230,6 @@ static int ncm_unwrap_ntb(struct gether *port,
>   			     ndp_index);
>   			goto err;
>   		}
> -		if (ndp_index == opts->nth_size)
> -			ndp_after_header = true;
>   
>   		/*
>   		 * walk through NDP
> @@ -1312,37 +1308,13 @@ static int ncm_unwrap_ntb(struct gether *port,
>   			index2 = get_ncm(&tmp, opts->dgram_item_len);
>   			dg_len2 = get_ncm(&tmp, opts->dgram_item_len);
>   
> -			if (index2 == 0 || dg_len2 == 0)
> -				break;
> -
>   			/* wDatagramIndex[1] */
> -			if (ndp_after_header) {
> -				if (index2 < opts->nth_size + opts->ndp_size) {
> -					INFO(port->func.config->cdev,
> -					     "Bad index: %#X\n", index2);
> -					goto err;
> -				}
> -			} else {
> -				if (index2 < opts->nth_size + opts->dpe_size) {
> -					INFO(port->func.config->cdev,
> -					     "Bad index: %#X\n", index2);
> -					goto err;
> -				}
> -			}
>   			if (index2 > block_len - opts->dpe_size) {
>   				INFO(port->func.config->cdev,
>   				     "Bad index: %#X\n", index2);
>   				goto err;
>   			}
>   
> -			/* wDatagramLength[1] */
> -			if ((dg_len2 < 14 + crc_len) ||
> -					(dg_len2 > frame_max)) {
> -				INFO(port->func.config->cdev,
> -				     "Bad dgram length: %#X\n", dg_len);
> -				goto err;
> -			}
> -
>   			/*
>   			 * Copy the data into a new skb.
>   			 * This ensures the truesize is correct
> @@ -1359,6 +1331,8 @@ static int ncm_unwrap_ntb(struct gether *port,
>   			ndp_len -= 2 * (opts->dgram_item_len * 2);
>   
>   			dgram_counter++;
> +			if (index2 == 0 || dg_len2 == 0)
> +				break;
>   		} while (ndp_len > 2 * (opts->dgram_item_len * 2));
>   	} while (ndp_index);
>   
> 
Bryan,

Ah, I see my mistake.  I did test this, but I must have missed some test 
cases as I didn't encounter this error.
Thanks a lot for testing and fixing the issue, and for the thorough 
explanation.

Best,
Brooke Basile

  reply	other threads:[~2020-09-20 21:08 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-20 17:01 [PATCH] USB: gadget: f_ncm: Fix NDP16 datagram validation Bryan O'Donoghue
2020-09-20 21:08 ` Brooke Basile [this message]
2020-09-24 15:22 ` Harald Seiler
2020-10-06 18:29 ` Eugeniu Rosca
2020-10-06 20:18   ` Greg KH
2020-10-07 10:24     ` Eugeniu Rosca

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=34126e7e-270b-fd9d-e08a-588feec758a5@gmail.com \
    --to=brookebasile@gmail.com \
    --cc=balbi@kernel.org \
    --cc=bryan.odonoghue@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=ivansprundel@ioactive.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=stable@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.