CVE-2026-52912详细技术分析LinuxKernelNetfilter/BridgeUse-After-Free漏洞完整解析

admin 2026-08-25 04:35:59 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详析Linux内核CVE-2026-52912漏洞,因桥接改写skb->dev后NFQUEUE未增加引用计数引发Use-After-Free。结合公开Exploit演示了通过命名空间配置、堆喷绕过KASLR及构建ROP链实现本地提权的完整流程,并总结了漏洞成因与缓解措施,对内核防护具重要参考价值。 综合评分: 88 文章分类: 漏洞分析,二进制安全,漏洞POC,渗透测试


CVE-2026-52912 详细技术分析 Linux Kernel Netfilter / Bridge Use-After-Free 漏洞完整解析

Ots安全

2026年8月24日 14:26 广东

在小说阅读器读本章

去阅读

威胁简报

恶意软件

漏洞攻击

  1. 漏洞概述

CVE编号:CVE-2026-52912

漏洞类型:Use-After-Free(CWE-416)

影响组件:net/netfilter/nf_queue.c + net/bridge/br_input.c

CVSS v3.1:7.8(High)

攻击向量:本地(Local),需要一定权限(能创建用户命名空间 + 操作网络设备 + 配置 netfilter)

公开时间:2026年6月24日左右

上游修复时间:2026年5月(commit e196115ec330a18de415bdb9f5071aa9f08e53ce 等)

引入时间:相关桥接路径可追溯到约2016年(commit ac28634456867b23b95faccba7997a62ec430603)漏洞本质是:桥接设备在将数据包送入 NFQUEUE 时,改写了 skb->dev,但 NFQUEUE 没有对这个新的设备指针持有引用。当桥接主设    备被删除后,排队中的数据包仍然持有已释放的设备指针,后续 reinject 时就会触发 UAF。

  1. 相关内核代码路径详解

2.1 桥接数据包本地接收路

径当数据包到达桥接端口并需要送给本地协议栈时,会走以下路径:

// net/bridge/br_input.c

staticintbr_pass_frame_up(struct sk_buff *skb, bool promisc)
{
    structnet_device *indev, *brdev = BR_INPUT_SKB_CB(skb)->brdev;
    // ...

    indev = skb->dev; // 保存原始入口端口
    skb->dev = brdev; // ★ 关键:把 skb->dev 改成桥接主设备

    // 进入 Netfilter Bridge LOCAL_IN 钩子
    return NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN,
                   dev_net(indev), NULL, skb, indev, NULL,
                   br_netif_receive_skb);
}

这里 skb->dev 从物理端口被改写为桥接主设备(bridge master,例如 br0)。这是为了让后续协议栈(以及 netfilter)认为数据包是从桥设备收到的。

2.2 NFQUEUE 入队时的引用处理(漏洞点)

当 NF_HOOK 中某个钩子返回 NF_QUEUE 时,会调用 nf_queue():

// net/netfilter/nf_queue.c(修复前简化逻辑)

boolnf_queue_entry_get_refs(struct nf_queue_entry *entry)
{
    struct nf_hook_state *state = &entry->state;

    // 持有 state.in / state.out
    if (state->in)
        dev_hold(state->in);
    if (state->out)
        dev_hold(state->out);

#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
    // 只持有 physin / physout(桥接物理设备)
    if (entry->physin)
        dev_hold(entry->physin);
    if (entry->physout)
        dev_hold(entry->physout);
    // ★ 问题:没有对 skb->dev(此时已经是 bridge master)做 dev_hold!
#endif

    returntrue;
}

在 br_pass_frame_up() 执行之后,skb->dev 已经变成了 bridge master,但 nf_queue_entry 只保护了:

  • 原始的 state.in(物理端口)
  • physin / physout
  • 没有保护当前的 skb->dev(bridge master)

2.3 设备删除与 UAF 触发

  1. 用户空间通过 netlink 删除桥接设备(RTM_DELLINK 或 ip link del br0)。
  2. 桥接主设备被释放(dev->refcnt 降到0后进入析构)。
  3. 排队中的 nf_queue_entry 里的 skb->dev 变成悬空指针。
  4. 用户空间对这个队列包发送 verdict(ACCEPT / 其他)。
  5. 内核执行 reinject:
// 简化后的 reinject 路径
br_netif_receive_skb(...)
    → 使用 skb->dev(已释放的 bridge master)
    → 访问已释放内存 → Use-After-Free

修复后的代码增加了:

// 修复后
structnf_queue_entry {
    ...
    structnet_device *skb_dev;   // 新增字段,保存入队时的 skb->dev
    ...
};

// get_refs 时
dev_hold(entry->skb_dev);

// release_refs 时
dev_put(entry->skb_dev);

并在 NETDEV_DOWN 处理时使用保存的设备指针进行清理。

  1. 完整利用过程(以 NebuSec 公开 Exploit 为例)

NebuSec 在 2026年8月针对 Fedora 44(kernel 6.19.10-300) 发布了完整的本地提权 exploit(仓库:NebuSec/CyberMeowfia 下的 Linux-CVE-2026-52912-Fedora-6.19.10-300)。

3.1 利用前置条件

  • 内核开启了 CONFIG_USER_NS、CONFIG_NET_NS、CONFIG_NF_TABLES、桥接支持。
  • 攻击者能创建用户命名空间(普通用户通常可以)。
  • 目标内核未打补丁。

3.2 Exploit 整体流程

阶段一:环境准备与权限提升到 namespace root

// 进入 user + net + mount 命名空间
unshare(CLONE_NEWUSER);
write_text("/proc/self/setgroups", "deny");
// 写 uid_map / gid_map,把自己映射为 namespace 内的 root
unshare(CLONE_NEWNET | CLONE_NEWNS);

此时在命名空间内已经是 root,可以随意创建网络设备和配置 netfilter。阶段二:搭建触发环境

使用 raw rtnetlink 创建:

  1. 一个 bridge 设备(例如 br0)
  2. 一对 veth(veth0 / veth1)
  3. 把 veth0 加入 br0
  4. 开启桥接的 netfilter 调用(IFLA_BR_NF_CALL_IPTABLES = 1)
  5. 配置 nftables / iptables 规则,把 NF_BR_LOCAL_IN 流量导向指定 NFQUEUE(queue number 例如 4242)

阶段三:触发 UAF

  1. 从 veth 发送数据包,使其进入桥接 LOCAL_IN 路径。
  2. 数据包在 br_pass_frame_up() 中被改写 skb->dev = br0,然后进入 NFQUEUE。
  3. 立即删除桥接设备 br0(此时排队的 skb 持有已释放的 br0 指针)。
  4. 对排队的数据包发送 verdict,触发 reinject → UAF 发生。

阶段四:UAF 利用与信息泄漏

  • 通过控制释放后的内存布局(堆喷),把 UAF 转化为有用的原语。

  • 常见手段包括:

  • 使用 unix domain socket、packet socket、msg_msg 等进行堆喷。

  • 利用 kernelsnitch 或已知页面泄漏技术获取内核基址(绕过 KASLR)。

  • 实现任意读 / 任意写或函数指针劫持。

阶段五:提权

典型 ROP 链(Fedora 偏移示例):

#define OFF_COMMIT_CREDS 0x425660
#define OFF_INIT_CRED 0x2a15840
#define OFF_KPTI_RETURN 0x1894
// 其他 gadget:pop rdi; ret / stack pivot 等

最终调用 commit_creds(init_cred),然后返回用户态,获得真正的 root 权限。

  1. 漏洞为什么存在这么久?

  2. 桥接 + NFQUEUE 的组合在普通服务器上使用频率相对较低(更多出现在容器网络、复杂防火墙、虚拟化场景)。

  3. 引用计数逻辑分散在多个地方(state.in/out、physdev、skb->dev),容易遗漏。

  4. 设备删除与队列生命周期之间的时间窗口需要精确控制,普通 fuzz 较难稳定触发。

  5. 影响范围与缓解措施

  • 受影响版本(大致):
  • 从较老的 4.x / 5.x 一直到 6.19 左右未打补丁的内核
  • 具体以发行版补丁为准(Ubuntu、Fedora、RHEL、Debian 等已陆续推送)
  1. 总结

CVE-2026-52912 是一个经典的“引用计数遗漏”导致的 UAF。核心问题在于:br_pass_frame_up() 修改了 skb->dev,但 nf_queue 入队时没有对这个新设备持有引用,导致设备被释放后仍被使用。

NebuSec 的公开 exploit 证明了该漏洞在现代内核(带 RANDOM_KMALLOC_CACHES 和 SELinux)上仍可被稳定利用为本地提权。

END

公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址

公众号 | AnQuan7 (Ots安全)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Ots安全 《CVE-2026-52912 详细技术分析 Linux Kernel Netfilter / Bridge Use-After-Free 漏洞完整解析》

评论:0   参与:  0