CVE-2023-53551CVE-2023-53551是Linux内核USB Gadget串口驱动(u_serial)中的一个空指针解引用漏洞。该漏洞位于gserial_resume函数中,在特定的竞态条件下可被触发。具体而言,当gserial_disconnect函数已经将gser->ioport指针清空后,如果此时系统接收到唤醒中断(wakeup interrupt),gserial_resume函数将被调用。在该函数执行过程中,会直接访问已经被清空的gser->ioport指针,导致内核空指针解引用错误,从而引发系统崩溃或内核panic。
该漏洞的CVSS评分为5.5,属于中危级别。其攻击向量为本地攻击(AV:L),攻击者需要具备低权限(PR:L),无需用户交互(UI:N)。在影响方面,该漏洞对机密性影响较低(C:L),对完整性无影响(I:N),但对系统可用性影响较高(A:H),因为空指针解引用通常会导致内核崩溃或系统重启,造成拒绝服务攻击。
该漏洞影响Linux内核多个稳定版本,官方已通过多个commit修复了该问题,包括在gserial_resume函数中添加空指针检查,并引入了一个静态自旋锁(static spinlock)来防止在检查gser->ioport之后到使用之前该指针被设置为NULL的竞态条件。
该漏洞的核心问题在于u_serial驱动中gserial_resume函数与gserial_disconnect函数之间的竞态条件。
漏洞原理:
1. 在gserial_disconnect函数执行过程中,会将gser->ioport指针设置为NULL,释放相关资源。
2. 当系统处于挂起状态时,USB唤醒中断可以触发gserial_resume函数的调用。
3. 如果唤醒中断发生在gserial_disconnect清空gser->ioport之后,gserial_resume函数将访问已被清空的指针。
4. gserial_resume函数中未对gser->ioport进行空指针检查就直接解引用,导致内核空指针解引用错误。
利用方式:
攻击者需要本地低权限访问系统,通过以下步骤触发该漏洞:
1. 连接一个支持USB唤醒功能的设备到系统。
2. 使系统进入挂起状态(如通过systemctl suspend)。
3. 在系统挂起期间,触发USB设备的断开操作(如物理断开USB连接)。
4. gserial_disconnect函数将gser->ioport置为NULL。
5. 此时触发USB唤醒中断,调用gserial_resume函数。
6. gserial_resume访问NULL指针,触发内核panic。
修复方案:
1. 在gserial_resume函数中添加对gser->ioport的空指针检查。
2. 引入静态自旋锁保护gser->ioport的访问,确保在检查和使用之间不会被并发清空。
该漏洞的利用难度较低,但需要本地访问权限和特定的时序条件,因此被评定为中危级别。