Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Linux-Kernel-Copy-Fail-CVE-2026-31431- — Linux内核Copy Fail(CVE-2026-31431)漏洞的分析与缓解,该漏洞利用AF_ALG/splice页面缓存突变,包含PoC检查器、auditd检测规则以及内核更新验证。 | Kitploit
工具/GitHubGitHub/jihwan77/linux-kernel-copy-fail-cve-2026-31431-
漏洞分析漏洞利用二进制分析学习与教育事件响应
GitHubjihwan77/linux-kernel-copy-fail-cve-2026-31431-

Linux-Kernel-Copy-Fail-CVE-2026-31431-

Linux内核Copy Fail(CVE-2026-31431)漏洞的分析与缓解,该漏洞利用AF_ALG/splice页面缓存突变,包含PoC检查器、auditd检测规则以及内核更新验证。

查看仓库

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
102个月前尚未审核
分享

Copy Fail(CVE-2026-31431) 漏洞分析与应对实践

本项目分析了 Linux Kernel Copy Fail(CVE-2026-31431) 漏洞的工作原理,并利用公开 PoC 仓库的非破坏性 checker 对比了补丁前后的状态,是一个微型项目。
实际并未执行 setuid 二进制文件篡改或 /etc/passwd 篡改漏洞利用,而是专注于基于临时 testfile 的安全漏洞检测,以及从检测/缓解角度进行的分析。


1. 项目目标

本项目的目的并非单纯执行漏洞利用,而是理解 Linux 内核漏洞是如何通过内部结构的组合产生的,并从运维角度总结如何确认和应对。

研究范围如下:

漏洞原理分析
    ↓
PoC 代码结构分析
    ↓
基于非破坏性 checker 的实践
    ↓
补丁前后对比
    ↓
检测/缓解方案整理

本实践中仅执行了 copy-fail-c 仓库中的 vulnerable.c。


2. 实验环境

分类补丁前补丁后
OSUbuntu 24.04.2 LTSUbuntu 24.04.4 LTS
Kernel6.8.0-53-generic6.8.0-134-generic
账户普通用户 client普通用户 client
checkervulnerablevulnerable
测试方式基于临时 testfile 的非破坏性检查同一 checker 重新执行

补丁前内核信息:

Linux ubuntu-server 6.8.0-53-generic #55-Ubuntu SMP PREEMPT_DYNAMIC Fri Jan 17 15:37:52 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

补丁后内核信息:

Linux ubuntu-server 6.8.0-134-generic #134-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 26 18:43:11 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux

内核包变更摘要:

- linux-image-6.8.0-53-generic  6.8.0-53.55
- linux-image-generic           6.8.0-53.55+1

+ linux-image-6.8.0-134-generic 6.8.0-134.134
+ linux-image-generic           6.8.0-134.134
+ linux-generic                 6.8.0-134.134
+ linux-headers-generic         6.8.0-134.134

3. 漏洞概念摘要

Copy Fail 漏洞是 Linux 内核的 AF_ALG AEAD 处理路径与 splice() 零拷贝操作结合,导致只读文件的 page cache 可能被错误用作写入目标。

核心组件如下:

元素作用
Linux page cache将磁盘文件内容缓存到 RAM 的内核机制
splice()不将数据复制到用户空间,而是在内核内部通过引用连接的零拷贝系统调用
AF_ALG允许用户空间像使用 socket 一样使用 Linux 内核 crypto API 的接口
AEAD in-place 处理不将输入缓冲区和输出缓冲区分开,而是在同一缓冲区中处理的优化
authencesn在 AEAD 处理过程中产生 4 字节 scratch write 的 crypto template

漏洞的核心流程如下:

可读取的文件
    ↓
加载到 Linux page cache
    ↓
通过 splice() 将 page cache 引用传递给 AF_ALG crypto 路径
    ↓
AEAD in-place 处理使输入与输出 scatterlist 交织
    ↓
authencesn 处理过程中产生 4 字节 scratch write
    ↓
写入点并非独立的输出缓冲区,而是 page cache
    ↓
发生 page cache 突变

即,splice() 传递 page cache 引用,AEAD in-place 处理将输入与输出绑定在相同路径,authencesn 实际产生 4 字节写入。


4. PoC 代码结构分析

实践所用仓库的结构如下:

copy-fail-c/
├── exploit.c
├── exploit-passwd.c
├── vulnerable.c
├── payload.c
├── utils.c
├── utils.h
├── Makefile
└── nolibc/
文件作用本实践中是否使用
utils.c, utils.h基于 AF_ALG/splice 的 page cache 突变原语实现用于分析及执行 vulnerable
vulnerable.c基于临时 testfile 的非破坏性漏洞检测工具已执行
exploit.csetuid root 二进制文件 page cache 篡改变体未执行
exploit-passwd.c/etc/passwd page cache 篡改变体未执行
payload.c以 root 权限执行的 payload未执行
Makefile构建自动化仅使用 vulnerable 目标
nolibc/用于构建小型静态 ELF payload 的轻量级 libc 替代代码仅分析

4.1 utils.c

utils.c 的核心是 patch_chunk() 系列的 page cache 突变原语。该函数利用 AF_ALG 和 splice() 将目标文件的 page cache 连接到 crypto 处理路径,并在易受攻击的内核中检查 AEAD 处理过程中部分 page cache 是否被覆盖。

4.2 vulnerable.c

vulnerable.c 不会触碰实际系统文件。它在当前目录创建临时 testfile,并检查该文件的 page cache 是否被篡改。

本项目中仅执行了此文件。


5. 实践步骤

5.1 记录补丁前状态

在内核更新前,记录了 OS、内核及包状态。

mkdir -p ~/copyfail-mini/{before,after,logs}
cd ~/copyfail-mini

uname -a | tee before/uname.txt
cat /etc/os-release | tee before/os-release.txt
dpkg -l | grep -E 'linux-image|linux-headers|linux-generic|linux-virtual' | tee before/kernel-package.txt

5.2 克隆 PoC 仓库并构建 checker

git clone https://github.com/jihwan77/copy-fail-c.git
cd copy-fail-c

make clean
make vulnerable

本实践未通过默认 make 一并构建漏洞利用二进制文件,仅使用了 vulnerable 目标。

5.3 补丁前运行 checker

./vulnerable > ../before/vulnerable-output.txt 2>&1
echo $? >> ../before/vulnerable-output.txt
cat ../before/vulnerable-output.txt

补丁前执行结果:

alt text

判断:

exit code 100
→ 确认 page cache 突变
→ 补丁前内核中 Copy Fail 原语生效

6. 补丁前后对比

6.1 内核更新

保存补丁前结果后,执行 Ubuntu 包更新。

sudo apt update
sudo apt full-upgrade -y
sudo reboot

重启后内核变更如下:

Before: 6.8.0-53-generic
After : 6.8.0-134-generic

6.2 补丁后重新运行 checker

cd ~/copyfail-mini/copy-fail-c
make clean
make vulnerable

./vulnerable > ../after/vulnerable-output.txt 2>&1
echo "exit_code=$?" >> ../after/vulnerable-output.txt
cat ../after/vulnerable-output.txt

补丁后执行结果:

alt text

结果对比:

项目补丁前补丁后
Kernel6.8.0-53-generic6.8.0-134-generic
Checker 结果VULNERABLEauthencesn template not registered
Exit Code1002
Page cache 突变已确认checker 未进入突变阶段
解读Copy Fail 原语生效PoC 所需的 AEAD/authencesn 路径进入失败

7. 补丁后结果解读

补丁后 exit_code=2 并不表示“不受影响”。准确来说如下:

AF_ALG 的 authencesn(hmac(sha256),cbc(aes)) template 未注册,
因此 checker 无法直接判定是否受影响

进一步确认,Ubuntu 更新后 algif_aead 模块加载已被阻止。

lsmod | grep -E 'af_alg|algif_aead'

结果:

af_alg 32768 0

algif_aead 未加载。

sudo modprobe algif_aead

结果:

modprobe: ERROR: ../libkmod/libkmod-module.c:1084 command_do() Error running install command '/bin/false' for module algif_aead: retcode 1
modprobe: ERROR: could not insert 'algif_aead': Invalid argument

确认阻止设置:

grep -R "algif_aead" /etc/modprobe.d /lib/modprobe.d 2>/dev/null

结果:

/etc/modprobe.d/disable-algif_aead.conf:# Disable algif_aead module due to CVE-2026-31431 (AKA copy.fail)
/etc/modprobe.d/disable-algif_aead.conf:install algif_aead /bin/false

因此,将补丁后结果解释为以下几点更为准确:

Ubuntu 安全更新后,内核升级至 6.8.0-134-generic,
并应用了基于 kmod 的 algif_aead 模块阻止缓解措施。

因此 copy-fail-c 的 vulnerable checker
无法绑定 PoC 所需的 authencesn(hmac(sha256),cbc(aes)) AF_ALG template,
未进入 page cache 突变阶段。

也就是说,本实践确认的并非“仅内核代码补丁的效果”,而是 Ubuntu 安全更新后,内核升级与 algif_aead 模块阻止缓解措施共同作用,导致同一 PoC 路径无法继续执行。


8. 基于 Auditd 的检测实践

Copy Fail 能够篡改 page cache 而不直接修改磁盘文件,因此基于文件哈希的检测存在局限。基于系统调用行为的检测至关重要。

本实践使用 auditd 监测以下系统调用:

sudo auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k copyfail_afalg
sudo auditctl -a always,exit -F arch=b64 -S bind -k copyfail_bind
sudo auditctl -a always,exit -F arch=b64 -S splice -k copyfail_splice
sudo auditctl -a always,exit -F arch=b64 -S sendmsg -k copyfail_sendmsg

8.1 检测 socket(AF_ALG)

日志中确认了 vulnerable 进程创建 AF_ALG socket。

comm=vulnerable
syscall=socket
success=yes
a0=alg
key=copyfail_afalg

8.2 检测 bind() 失败

在补丁后/缓解后的环境中,vulnerable 进程尝试绑定 authencesn template 但失败。

comm=vulnerable
syscall=bind
success=no
exit=ENOENT(No such file or directory)
saddr_fam=alg
key=copyfail_bind

这表明在补丁后环境中,PoC 成功执行了 AF_ALG socket 创建,但在 authencesn(hmac(sha256),cbc(aes)) template 绑定阶段失败。

8.3 splice() / sendmsg() 日志解读

补丁后由于 bind() 阶段已失败,checker 未能进行到 splice() 和 sendmsg() 阶段。因此,在这些系统调用的日志中未观察到 vulnerable 执行流的有效信息。


9. 检测点整理

在生产环境中观察 Copy Fail 类漏洞时,可关注以下行为组合:

检测目标含义
socket(AF_ALG, ...)尝试使用内核 crypto API
bind() with authencesn尝试使用 AEAD/authencesn crypto template
splice()将文件 page cache 引用传递到内核内部路径
sendmsg() / recvmsg()执行 AF_ALG crypto 请求
setuid 二进制文件执行权限提升兑现可能性

本实践通过 auditd 确认了 socket(AF_ALG) 和 bind() 失败事件。


10. 缓解措施整理

10.1 更新内核及安全包

最基本的是应用发行版安全更新。

sudo apt update
sudo apt full-upgrade -y
sudo reboot

本实践更新后,环境变为 Ubuntu 24.04.4 / kernel 6.8.0-134-generic。

10.2 阻断 algif_aead 模块

Ubuntu 更新后,以下设置已被确认:

/etc/modprobe.d/disable-algif_aead.conf
install algif_aead /bin/false

该设置阻止了 algif_aead 模块加载,从而阻止 PoC 所需的 AF_ALG AEAD 路径进入。

10.3 监控 AF_ALG 使用

一般服务器应用程序直接使用 AF_ALG 的情况可能不多,因此 socket(AF_ALG) 调用可作为检测点使用。


11. 最终判断

本实践的结果总结如下:

下载工具