Mitre assigned CVE-2023-23559 for this. On Tue, 2023-01-10 at 18:30 +0100, Szymon Heidrich wrote: > Since resplen and respoffs are signed integers sufficiently > large values of unsigned int len and offset members of RNDIS > response will result in negative values of prior variables. > This may be utilized to bypass implemented security checks > to either extract memory contents by manipulating offset or > overflow the data buffer via memcpy by manipulating both > offset and len. > > Additionally assure that sum of resplen and respoffs does not > overflow so buffer boundaries are kept. > > Fixes: 80f8c5b434f9 ("rndis_wlan: copy only useful data from > rndis_command respond") > Signed-off-by: Szymon Heidrich <szymon.heidrich@xxxxxxxxx> > --- > drivers/net/wireless/rndis_wlan.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/rndis_wlan.c > b/drivers/net/wireless/rndis_wlan.c > index 82a7458e0..d7fc05328 100644 > --- a/drivers/net/wireless/rndis_wlan.c > +++ b/drivers/net/wireless/rndis_wlan.c > @@ -697,7 +697,7 @@ static int rndis_query_oid(struct usbnet *dev, > u32 oid, void *data, int *len) > struct rndis_query_c *get_c; > } u; > int ret, buflen; > - int resplen, respoffs, copylen; > + u32 resplen, respoffs, copylen; > > buflen = *len + sizeof(*u.get); > if (buflen < CONTROL_BUFFER_SIZE) > @@ -740,7 +740,7 @@ static int rndis_query_oid(struct usbnet *dev, > u32 oid, void *data, int *len) > goto exit_unlock; > } > > - if ((resplen + respoffs) > buflen) { > + if (resplen > (buflen - respoffs)) { > /* Device would have returned more data if > buffer would > * have been big enough. Copy just the bits > that we got. > */
Attachment:
signature.asc
Description: This is a digitally signed message part