CVE-2025-71111CVE-2025-71111是Linux kernel中hwmon子系统w83791d驱动的一个中等严重性安全漏洞。该漏洞源于FAN_FROM_REG宏对参数进行多次求值,当在无锁上下文中操作共享驱动数据时,会产生Time-of-Check to Time-of-Use(TOCTOU)竞态条件。这种竞态条件可能导致除零错误,进而引发系统不稳定或拒绝服务。该漏洞需要本地低权限访问即可触发,无需用户交互。修复方案是将宏转换为静态函数,确保参数只求值一次,同时将store_fan_div函数中的最小限制计算移至更新锁内部,以保证读-修改-写序列在一致的数据上操作。
在Linux kernel的w83791d硬件监控驱动中,FAN_FROM_REG宏定义存在设计缺陷。该宏定义为# define FAN_FROM_REG(val) ((val) && (val) != 255) ? (1350000U / (val)) : 0,当参数val是复杂表达式或包含副作用的操作时,会被多次求值。在多线程或中断上下文中,当代码以无锁方式访问共享的驱动数据时,会产生典型的TOCTOU问题:第一次求值检查val是否为非零和非255,第二次求值用于计算除法。如果在这两次求值之间val被其他执行流修改,可能导致val变为0,从而触发除零错误。攻击者可以通过精心设计的数据访问序列,在本地触发此竞态条件,造成系统崩溃或本地拒绝服务。修复措施包括:将FAN_FROM_REG宏转换为static inline函数以确保参数只求值一次;将store_fan_div中的最小限制计算移入锁保护区域,保证临界区内数据的一致性。