CVE-2022-50555CVE-2022-50555是Linux内核TIPC(Transparent Inter-Process Communication,透明进程间通信)子系统中存在的一个空指针解引用漏洞。该漏洞位于net/tipc/topsrv.c文件的tipc_topsrv_accept函数中,由syzbot模糊测试工具发现。当TIPC服务器在网络命名空间退出过程中,tipc_topsrv_stop()函数会将srv->listener设置为NULL,但此时tipc_topsrv_accept()工作线程可能仍在运行并访问该指针,从而导致内核空指针解引用崩溃。
该漏洞的根本原因在于并发控制不当:srv->listener虽然受到srv->idr_lock的保护,但在tipc_topsrv_accept函数中并未在锁内检查其有效性。此外,sock_release()的调用时机也不正确,可能在tipc_topsrv_accept工作线程仍在使用监听套接字时将其释放。攻击者可通过本地触发TIPC子系统停止流程来利用此漏洞,导致系统内核崩溃(内核panic),造成拒绝服务(DoS)攻击。
该漏洞的CVSS评分为5.5,属于中等严重等级。攻击者需要本地低权限访问即可触发,无需用户交互。漏洞主要影响系统的可用性,对机密性和完整性无影响。由于Linux内核广泛应用于各类服务器和嵌入式系统,此漏洞可能对生产环境造成稳定性威胁。
该漏洞的技术原理涉及Linux内核TIPC子系统的并发安全问题。具体分析如下:
1. **漏洞触发路径**:当TIPC服务器(topsrv)启动时,会创建一个监听套接字(listener socket)并将其赋值给srv->listener。当网络命名空间退出时,tipc_topsrv_stop()函数会被调用,它在持有srv->idr_lock的情况下将srv->listener设置为NULL,随后调用sock_release()释放监听套接字。
2. **竞态条件**:tipc_topsrv_accept()作为工作队列(workqueue)中的回调函数,在接收到连接请求时被调度执行。该函数在执行过程中会访问srv->listener指针,但并未在srv->idr_lock保护下检查其是否已被设置为NULL。如果accept操作与stop操作并发执行,就会发生空指针解引用。
3. **崩溃堆栈分析**:根据KASAN报告,崩溃发生在kernel_accept()函数中(net/socket.c:3487),RIP地址为kernel_accept+0x22d/0x350。调用链为:worker_thread → process_one_work → tipc_topsrv_accept → kernel_accept,在访问NULL指针偏移0x8-0x0f范围时触发崩溃。
4. **修复方案**:内核补丁通过以下方式修复该漏洞:
- 在tipc_topsrv_accept()中,在srv->idr_lock保护下检查srv->listener是否为NULL;
- 将sock_release()调用移至tipc_topsrv_work_stop()之后,确保等待accept工作线程完成后再释放套接字;
- 使用sk_callback_lock保护sk->sk_user_data,并在tipc_topsrv_listener_data_ready()中检查srv有效性。
5. **利用方式**:攻击者可通过加载TIPC模块并触发特定的网络命名空间操作(如删除网络命名空间),使tipc_topsrv_stop()与tipc_topsrv_accept()并发执行,从而触发空指针解引用导致内核崩溃。