CVE-2023-53664CVE-2023-53664是Linux内核中Operating Performance Points(OPP)子系统的一个空指针解引用漏洞。该漏洞存在于`dev_pm_opp_get_required_pstate()`函数中,在调用`IS_ERR_OR_NULL()`检查之前就对"opp"指针进行了解引用操作。这种不当的指针操作顺序可能导致内核在特定条件下触发空指针解引用,从而引发系统崩溃或拒绝服务(DoS)攻击。该漏洞由smatch静态分析工具检测发现,CVSS评分为5.5,属于中危级别。攻击者需要具有本地低权限访问能力,无需用户交互即可触发该漏洞。虽然该漏洞不会直接泄露机密信息或破坏数据完整性,但可能导致系统可用性受到严重影响,造成内核崩溃或系统不稳定。该漏洞影响Linux内核的OPP(Operating Performance Points)核心模块,该模块负责管理设备的运行性能点(频率和电压组合),是Linux内核电源管理子系统的关键组成部分。
该漏洞的根本原因在于`dev_pm_opp_get_required_pstate()`函数中存在不当的指针操作顺序。具体来说,在`drivers/opp/core.c`的232行附近,代码在执行`IS_ERR_OR_NULL()`检查之前就已经对`opp`指针进行了解引用操作。这种代码模式存在严重缺陷,因为如果`opp`指针为NULL或错误指针,解引用操作将导致内核空指针解引用错误。
漏洞的技术原理如下:
1. OPP子系统通过`dev_pm_opp_get_required_pstate()`函数获取设备所需的性能状态(performance state)
2. 该函数内部通过查找操作获取`opp`指针
3. 原始代码在获取指针后立即进行解引用(如访问`opp->something`),然后才检查指针是否为错误或NULL
4. 如果查找操作失败返回NULL或错误指针,解引用将触发内核oops或panic
修复方案是移除`opp`指针的提前解引用,改为缓存`opp_table`指针,并在使用`opp_table`的地方直接进行解引用操作。这种修改确保了在使用指针之前先进行有效性检查,避免了空指针解引用的风险。
利用方式:攻击者需要本地低权限访问系统,通过触发特定的设备电源管理操作路径,使`dev_pm_opp_get_required_pstate()`函数在`opp`指针无效的情况下被调用,从而触发空指针解引用导致系统崩溃。