CVE-2026-9771 in Zephyr
摘要
由 VulDB • 2026-08-17
flash_copy() 系统调用由 drivers/flash/flash_util.c 中的 z_vrfy_flash_copy() 进行验证。在启用 CONFIG_USERSPACE 的构建中,该处理程序是用户模式调用方的内核端信任边界。修复前,它仅验证输出缓冲区(K_SYSCALL_MEMORY_WRITE),并将两个 struct device * 参数 src_dev 和 dst_dev 直接传入实现代码,未执行任何对象验证——这与所有其他 flash 系统调用不同,后者通过 K_SYSCALL_DRIVER_FLASH 保护其设备指针。
用户模式线程完全控制 src_dev/dst_dev 的值及其自身地址空间的内容。z_impl_flash_copy() 实现会解引用这些指针,并通过它们的驱动 API 函数表进行调用(例如 api->get_parameters(dst_dev)、flash_read(src_dev, ...)、flash_write(dst_dev, ...))。通过提供一个指向伪造的 struct device 的指针,其 api 表中包含攻击者选择的函数指针,非特权线程可导致内核以超级用户模式执行任意代码;否则,传递任何任意或无效地址将导致内核崩溃或越界读取。
结果是从用户空间沙箱中进行的本地权限提升(次要后果包括内核拒绝服务和信息泄露)。修复方案在 z_vrfy_flash_copy() 中添加了 K_SYSCALL_DRIVER_FLASH(src_dev, read) 和 K_SYSCALL_DRIVER_FLASH(dst_dev, write),以验证每个设备是否为调用线程有权使用的已注册 flash 驱动内核对象,从而在任何解引用之前关闭该路径。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.