CVE-2023-53658CVE-2023-53658是Linux内核中spi-bcm-qspi驱动存在的一个空指针解引用漏洞。该漏洞位于Linux内核的SPI(Serial Peripheral Interface)子系统中的Broadcom QSPI驱动部分。当系统中既不存在"hif_mspi"资源也不存在"mspi"资源时,驱动在probe阶段会提前退出但仍然返回成功(返回值为0)。这种不当的处理方式会导致两个严重后果:首先,驱动没有执行任何有意义的功能性操作;其次,在驱动卸载(unbind/remove)过程中,platform_get_drvdata()将返回NULL,而后续代码会尝试对这个NULL指针进行解引用以注销spi master,最终触发空指针解引用错误,导致系统崩溃。该漏洞的CVSS评分为5.5,属于中危级别。攻击者需要本地低权限访问即可触发此漏洞,无需用户交互,虽然不会泄露机密信息或破坏数据完整性,但会对系统可用性造成高影响,可能导致内核崩溃(kernel panic)或系统拒绝服务(DoS)。该漏洞已在多个Linux内核稳定版本中通过补丁修复,修复方式是将"return 0;"替换为无条件调用devm_ioremap_resource(),该函数可以处理NULL资源并返回有效的ERR_PTR指针,从而避免空指针解引用问题。
该漏洞的根本原因在于spi-bcm-qspi驱动的probe函数中存在不完整的错误处理逻辑。具体技术细节如下:
1. **资源检查缺陷**:在驱动的probe阶段,代码会检查系统中是否存在"hif_mspi"或"mspi"这两种SPI硬件资源。如果两者都不存在,原始代码逻辑是直接"return 0;",表示probe成功。
2. **错误传播问题**:这种处理方式忽略了驱动实际并未完成任何初始化的事实。虽然返回0表示成功,但驱动的内部状态并未正确设置,相关的spi master数据结构也未被正确初始化。
3. **空指针解引用触发**:当驱动被卸载时,remove回调函数会被调用。该函数会调用platform_get_drvdata()获取之前保存的设备数据,但由于probe阶段提前返回,该数据为NULL。后续代码尝试通过这个NULL指针访问spi master的成员(如调用spi_unregister_master()),从而触发空指针解引用。
4. **历史背景**:在commit 63c5395bb7a9("spi: bcm-qspi: Fix use-after-free on unbind")中,"goto qspi_resource_err;"被改写为"return 0;",虽然当时ret变量初始化为0使这种转换在表面上看起来是正确的,但实际上掩盖了原始的资源检查缺陷。
5. **修复方案**:补丁通过无条件调用devm_ioremap_resource()来解决此问题。该函数能够优雅地处理NULL资源输入,当传入NULL时会返回有效的ERR_PTR错误码,从而使probe函数正确地返回错误,触发驱动的错误处理路径。