Nicolas Iooss 8f8c04bf1e i2c: fix stack buffer overflow vulnerability in i2c md command
When running "i2c md 0 0 80000100", the function do_i2c_md parses the
length into an unsigned int variable named length. The value is then
moved to a signed variable:

    int nbytes = length;
    #define DISP_LINE_LEN 16
    int linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
    ret = dm_i2c_read(dev, addr, linebuf, linebytes);

On systems where integers are 32 bits wide, 0x80000100 is a negative
value to "nbytes > DISP_LINE_LEN" is false and linebytes gets assigned
0x80000100 instead of 16.

The consequence is that the function which reads from the i2c device
(dm_i2c_read or i2c_read) is called with a 16-byte stack buffer to fill
but with a size parameter which is too large. In some cases, this could
trigger a crash. But with some i2c drivers, such as drivers/i2c/nx_i2c.c
(used with "nexell,s5pxx18-i2c" bus), the size is actually truncated to
a 16-bit integer. This is because function i2c_transfer expects an
unsigned short length. In such a case, an attacker who can control the
response of an i2c device can overwrite the return address of a function
and execute arbitrary code through Return-Oriented Programming.

Fix this issue by using unsigned integers types in do_i2c_md. While at
it, make also alen unsigned, as signed sizes can cause vulnerabilities
when people forgot to check that they can be negative.

Signed-off-by: Nicolas Iooss <nicolas.iooss+uboot@ledger.fr>
Reviewed-by: Heiko Schocher <hs@denx.de>
2022-06-28 15:51:56 -04:00
..
2017-02-08 15:56:28 -05:00
2022-05-05 15:06:02 -04:00
2022-02-05 15:49:00 +01:00
2021-08-26 08:08:11 +02:00
2022-04-25 10:00:04 -04:00
2022-05-28 10:59:27 +02:00
2022-04-25 10:00:04 -04:00
2022-03-31 14:12:23 -04:00
2022-05-31 07:57:02 +02:00
2022-04-25 10:00:04 -04:00
2020-05-18 18:36:55 -04:00
2020-05-18 18:36:55 -04:00
2022-02-25 01:41:04 -05:00
2022-03-28 20:14:24 +02:00
2020-05-18 18:36:55 -04:00
2020-12-18 20:32:21 -07:00
2022-01-19 18:11:34 +01:00
2022-01-19 18:11:34 +01:00
2020-05-18 18:36:55 -04:00
2022-01-15 10:57:22 +01:00
2021-11-16 14:35:09 -05:00
2022-03-15 16:19:29 -04:00
2020-05-18 18:36:55 -04:00
2022-03-10 08:28:36 -05:00
2020-05-18 18:36:55 -04:00
2020-05-18 18:36:55 -04:00
2020-10-23 13:33:07 -04:00
2022-05-05 15:06:02 -04:00
2022-01-21 14:01:35 -05:00
2022-04-20 11:14:39 -04:00
2022-05-06 14:39:15 -04:00
2020-05-18 18:36:55 -04:00
2020-05-18 18:36:55 -04:00
2021-12-05 09:23:15 -07:00
2020-05-18 18:36:55 -04:00
2020-05-18 18:36:55 -04:00
2022-01-19 18:11:34 +01:00
2020-05-18 18:36:55 -04:00
2022-04-25 10:00:04 -04:00
2021-11-28 16:51:51 -07:00
2022-05-05 15:06:02 -04:00
2022-01-19 18:11:34 +01:00
2020-10-28 11:49:31 -04:00
2020-05-18 18:36:55 -04:00
2022-05-05 15:06:02 -04:00
2020-07-08 17:21:46 -04:00
2022-01-15 10:57:22 +01:00
2022-01-19 18:11:34 +01:00
2020-05-18 18:36:55 -04:00
2020-12-18 20:32:21 -07:00
2020-05-18 18:36:55 -04:00
2022-01-19 18:11:34 +01:00
2021-09-24 14:30:46 -04:00
2020-08-07 22:31:32 -04:00
2020-05-18 21:19:18 -04:00
2020-05-18 18:36:55 -04:00
2021-10-21 07:39:05 +02:00
2022-01-19 18:11:34 +01:00
2021-10-09 13:09:56 -04:00
2020-05-18 18:36:55 -04:00
2020-05-18 18:36:55 -04:00