CVE-2023-53549CVE-2023-53549是Linux内核中netfilter ipset子系统的一个拒绝服务漏洞。该漏洞源于ipset在单次添加或删除大量元素时,会执行长时间连续的任务,导致系统出现软锁死(soft lockup)错误。此前曾尝试通过限制单次操作的最大元素数量来修复此问题(补丁5f7b51bf09ba),但效果不佳,仍然可能出现挂起任务的情况。
该漏洞的根本原因是ipset在处理大批量元素添加或删除操作时,没有采用适当的分批处理机制,导致单个任务长时间持有nfnl互斥锁,阻塞其他ipset命令的执行,同时触发内核软锁死检测。由于nfnl互斥锁在整个操作期间被持有,用户无法并行发起其他ipset命令。
此漏洞的影响主要体现在系统可用性方面。虽然需要本地低权限访问才能触发,但攻击者可以通过精心构造的ipset命令使系统长时间无响应,触发软锁死错误,严重影响系统的稳定性和可用性。该漏洞的CVSS评分为5.5,属于中等严重程度。
该漏洞的技术原理如下:
1. **漏洞触发条件**:当用户通过ipset命令一次性添加或删除大量元素时,ipset内核模块会进入一个长时间运行的循环处理过程。
2. **软锁死机制**:Linux内核的软锁死检测器(soft lockup detector)会监控CPU上任务的执行时间。如果某个任务在CPU上连续执行超过一定时间(通常为20秒),系统会打印软锁死错误并可能导致系统不稳定。
3. **互斥锁竞争**:在处理大批量操作时,nfnl互斥锁在整个操作期间被持有,这不仅导致CPU占用过高,还阻止了其他ipset命令的并发执行。
4. **修复方案**:新的修复方案借鉴了ipset集合调整大小时使用的方法,通过设置较小的内部批处理限制,当达到限制时保存当前状态,释放锁后再从保存的状态继续处理。这样既避免了长时间连续任务的执行,又取消了对单次操作元素数量的限制。
5. **利用方式**:本地低权限用户可以通过ipset命令触发此漏洞,例如执行`ipset add <setname> <entry>`命令在包含大量条目的集合中循环添加元素,或者使用批量操作API一次性处理大量数据。