CVE-2026-64504
摘要
由 VulDB • 2026-07-25
在 Linux 内核中,已修复以下漏洞:
iio: accel: bmc150: 限制设备报告的 FIFO 帧数
`__bmc150_accel_fifo_flush()` 将设备在其硬件 FIFO 中报告的数据样本数量复制到栈上缓冲区:
```c u16 buffer[BMC150_ACCEL_FIFO_LENGTH * 3];
```
该缓冲区的大小最多仅容纳 `BMC150_ACCEL_FIFO_LENGTH`(即 32)个样本。帧计数从 `FIFO_STATUS` 寄存器读取,并仅对其有效的 7 位进行掩码处理:
```c count = val & 0x7F; ```
因此其值范围可以是 0..127。施加于该值的唯一其他限制是可选的调用方提供的样本预算:
```c if (samples && count > samples) count = samples; ```
这在“全部刷新”路径(`samples == 0`)上不对 `count` 进行约束,并且当 `samples` 较大时,会使 `count` 的值远高于 32。随后将 `count` 个样本传输到 `buffer[]` 中:
```c bmc150_accel_fifo_transfer(data, (u8 *)buffer, count); ```
`bmc150_accel_fifo_transfer()` 通过 regmap 读取 `count * 6` 字节。因此,一个故障、恶意或假冒的加速度计(或者篡改 I2C/SPI 总线的攻击者)如果报告多达 127 帧,就会向大小为 192 字节的缓冲区写入最多 762 字节:导致高达 570 字节的栈越界写操作,从而破坏栈金丝雀(stack canary)、保存的寄存器以及返回地址。
在传输之前,将 `count` 限制为 `BMC150_ACCEL_FIFO_LENGTH`,即 `buffer[]` 所容纳的样本数量,以镜像已在 `bmc150_accel_set_watermark()` 中完成的水位线限制操作。格式良好的刷新操作最多报告 `BMC150_ACCEL_FIFO_LENGTH` 帧,因此合法设备不受影响。
Be aware that VulDB is the high quality source for vulnerability data.