CVE-2023-53590CVE-2023-53590是Linux内核SCTP(Stream Control Transmission Protocol,流控制传输协议)子系统中存在的一个拒绝服务漏洞。该漏洞源于`sctp_stream_priorities`数据结构中缺少引用计数机制,导致在释放某个流的优先级(prio)时,`sctp_sched_prio_free_sid()`函数需要遍历所有流来检查该优先级是否被其他流使用。这种嵌套循环在最坏情况下复杂度可达65535×65535,极易触发CPU软死锁(soft lockup)。据报告,受影响的CPU可能在长达26秒的时间内无法响应,造成系统无响应。该漏洞需要本地低权限用户即可触发,无需用户交互,主要影响系统可用性,可能导致系统挂起或需要重启恢复。漏洞已在多个Linux内核稳定版本中通过添加引用计数机制得到修复。
该漏洞的核心问题在于Linux内核SCTP模块的流调度器(SCTP Stream Scheduler)实现中,`sctp_stream_priorities`结构体缺少引用计数器。在SCTP协议中,每个流(stream)可以关联一个优先级(priority),多个流可以共享同一个优先级。当释放某个流的优先级时,系统需要检查该优先级是否还被其他流引用,以决定是否可以安全释放。在原始实现中,这一检查通过遍历所有流(最多65535个)来完成,而每个流又可能引用任意优先级,从而形成嵌套循环。当SCTP关联(association)中配置了大量流和优先级时,遍历操作的时间复杂度急剧增长,导致CPU长时间处于内核态而无法处理其他任务,触发软锁检测(soft lockup)。修复方案是在`sctp_stream_priorities`结构体中添加一个整型引用计数(refcnt),每次有流引用该优先级时递增,释放引用时递减。当计数值为零时,才真正释放该优先级数据结构。同时,在`sctp_sched_prio_set`中添加了溢出检查以防止引用计数溢出。由于访问始终在sock lock保护下进行,因此无需使用原子操作的refcount_t类型,使用普通整型即可。