CVE-2023-53566CVE-2023-53566是Linux内核netfilter子系统中nft_set_rbtree模块的一个空指针解引用漏洞。该漏洞位于`nft_rbtree_gc_elem()`函数中,在红黑树元素插入过程中,`rb_prev()`函数可能返回NULL指针,导致内核发生通用保护错误(general protection fault)。具体表现为KASAN检测到空指针解引用,地址范围在0x0000000000000018到0x000000000000001f之间。该漏洞的触发路径为`nft_add_set_elem` → `nf_tables_newsetelem`,属于nftables规则集元素添加操作。除空指针解引用问题外,在迭代过程中还存在潜在的释放后重用(use-after-free)风险,因为迭代过程中`node`节点可能被释放,需要缓存下一个节点的值以避免问题。该漏洞需要本地低权限用户即可触发,无需用户交互,但会导致系统可用性受到严重影响,可能引发内核崩溃(kernel panic)或系统不稳定。CVSS 3.1评分为5.5分,属于中等严重级别,攻击向量为本地攻击(AV:L),需要低权限(PR:L),用户交互为无需(UI:N),对机密性和完整性无影响,但可用性影响为高(A:H)。
该漏洞的技术原理如下:
1. **漏洞位置**:Linux内核netfilter子系统的`nft_set_rbtree`模块,具体在`nft_rbtree_gc_elem()`函数中。
2. **根本原因**:在nftables红黑树集合的元素垃圾回收(GC)过程中,代码调用`rb_prev()`来获取当前节点的前驱节点,但`rb_prev()`函数在某些边界条件下可能返回NULL(例如当前节点是树的最左节点时)。代码未对返回值进行NULL检查就直接解引用,导致空指针解引用错误。
3. **触发条件**:当用户尝试向nftables红黑树类型的集合中添加元素(通过`nft_add_set_elem`系统调用),且集合处于特定状态(如元素即将过期被GC)时,可能触发该漏洞。
4. **利用方式**:
- 攻击者需要本地系统访问权限(普通用户权限即可)
- 创建nftables红黑树类型的集合
- 向集合中添加元素,触发垃圾回收机制
- 在GC过程中,`rb_prev()`返回NULL,导致空指针解引用
5. **附加风险**:除了空指针解引用外,在迭代过程中存在use-after-free风险。迭代器指向的`node`可能在迭代过程中被释放,因此需要先缓存`rb_prev()`的返回值再使用。
6. **内核崩溃信息**:KASAN报告 `null-ptr-deref in range [0x0000000000000018-0x000000000000001f]`,发生在`nft_add_set_elem+0x14b0/0x2990`调用栈中。