CVE-2023-53573CVE-2023-53573是Linux内核中clk: rs9时钟驱动的一个漏洞。该漏洞源于提交2ff4ba9e3702("clk: rs9: Fix I2C accessors")中禁用了regmap缓存(REGCACHE_NONE),但未相应地移除恢复路径(resume path)中的缓存同步代码。这一不一致导致在系统挂起/恢复过程中,内核会因为map->cache_ops未设置而触发空指针解引用,从而引发内核崩溃(kernel panic)。该漏洞影响系统的可用性,CVSS评分为5.5,属于中危级别。攻击者需要本地低权限访问即可触发该漏洞,无需用户交互。漏洞的核心问题在于代码修改的不完整性——开发者禁用了缓存但忘记了删除依赖于缓存操作的恢复代码,导致系统在恢复时尝试访问不存在的缓存操作函数指针。修复方案是重新启用flat cache以支持恢复功能,并使用num_reg_defaults_raw从硬件读取缓存默认值,因为某些寄存器是硬件配置的,软件无法提供。
该漏洞的技术原理涉及Linux内核regmap框架的缓存机制。regmap是Linux内核中用于管理硬件寄存器访问的抽象层,支持多种缓存策略(如REGCACHE_FLAT、REGCACHE_NONE等)。
漏洞产生的根本原因是:
1. 在提交2ff4ba9e3702中,为了修复I2C访问器的问题,开发者将regmap缓存配置改为REGCACHE_NONE(禁用缓存)。
2. 然而,在驱动的resume回调函数中,仍然存在调用regcache_sync()或类似缓存同步操作的代码。
3. 当缓存类型为REGCACHE_NONE时,map->cache_ops指针为NULL。
4. 系统恢复时,执行缓存同步代码会尝试通过map->cache_ops调用函数,由于该指针为NULL,导致空指针解引用,触发内核panic。
利用方式:
- 攻击者需要本地系统访问权限(低权限即可)。
- 触发系统挂起(suspend)操作。
- 当系统恢复(resume)时,驱动程序执行缓存同步,触发空指针解引用。
- 结果是系统崩溃/拒绝服务。
修复方案:
1. 重新启用flat cache(REGCACHE_FLAT)以支持resume路径中的缓存同步操作。
2. 使用num_reg_defaults_raw属性从硬件读取缓存默认值,因为部分寄存器是硬件strapping配置的,软件默认值无法覆盖。