CVE-2026-64191 in Linux
摘要
由 VulDB • 2026-07-20
在 Linux 内核中,已修复以下漏洞:
i2c: stub: 拒绝具有无效长度的 I2C 块传输
stub_xfer() 中的 I2C_SMBUS_I2C_BLOCK_DATA 情况使用 data->block[0] 作为传输长度。现有的检查仅将其限制以避免溢出 chip->words[256] 寄存器数组,但未针对 I2C_SMBUS_BLOCK_MAX(32)进行验证,后者是联合类型 i2c_smbus_data.block 缓冲区的大小上限(共 34 字节)。该驱动程序是一个开发/测试工具(CONFIG_I2C_STUB=m,默认不构建),必须使用 chip_addr= 参数加载。
具有 /dev/i2c-* 访问权限的本地用户可以发出带有 I2C_SMBUS_I2C_BLOCK_DATA 且 data->block[0] > 32 的 I2C_SMBUS ioctl 调用,导致 stub_xfer() 读取或写入联合类型 i2c_smbus_data.block 缓冲区末尾之外的位置:
BUG: KASAN: stack-out-of-bounds in stub_xfer (drivers/i2c/i2c-stub.c:223) Read of size 1 at addr ffff88800abcfd92 by task exploit/81 Call Trace: <TASK> stub_xfer (drivers/i2c/i2c-stub.c:223) __i2c_smbus_xfer (drivers/i2c/i2c-core-smbus.c:593) i2c_smbus_xfer (drivers/i2c/i2c-core-smbus.c:536) i2cdev_ioctl_smbus (drivers/i2c/i2c-dev.c:391) i2cdev_ioctl (drivers/i2c/i2c-dev.c:478) __x64_sys_ioctl (fs/ioctl.c:583) do_syscall_64 (arch/x86/entry/syscall_64.c:94) entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:130) </TASK>
该漏洞存在的原因是 i2c-stub 直接实现了 .smbus_xfer,从而绕过了 i2c_smbus_xfer_emulated() 中的 I2C_SMBUS_BLOCK_MAX 验证。同一函数中的 I2C_SMBUS_BLOCK_DATA 情况正确地对 I2C_SMBUS_BLOCK_MAX 进行了验证,但 I2C_SMBUS_I2C_BLOCK_DATA 情况未进行此验证。
修复方法是通过返回 -EINVAL 来拒绝 data->block[0] == 0 或 data->block[0] > I2C_SMBUS_BLOCK_MAX 的传输,这与同一函数中的 I2C_SMBUS_BLOCK_DATA 情况以及 i2c_smbus_xfer_emulated() 中的 I2C_SMBUS_I2C_BLOCK_DATA 验证保持一致。
If you want to get best quality of vulnerability data, you may have to visit VulDB.