xn0kkx/CVE-2026-31431_CopyFail_LinuxKernel_LPE

GitHub: xn0kkx/CVE-2026-31431_CopyFail_LinuxKernel_LPE

Linux内核本地权限提升漏洞CVE-2026-31431的PoC代码,利用algif_aead加密接口的原地优化通过页面缓存修改setuid二进制实现无密码root提权。

Stars: 1 | Forks: 0

# CVE-2026-31431 — Copy Fail(Linux 内核本地提权) Theori/Xint 概念验证漏洞的教育性重写版本, 这是 Linux 内核 `algif_aead` 加密套接字接口中的一个本地权限提升漏洞。影响从 4.14(2017年7月) 到 6.18.21 的所有主线内核,以及 6.19 稳定版分支到 6.19.11。 ## 免责声明 **仅供教育和授权的安全研究使用。** 请勿在您不拥有或未获得明确书面测试许可的系统上运行。在有漏洞的主机上运行此漏洞可使任何无特权的本地用户立即获得 root 权限。作者对滥用不承担任何责任。 ## 漏洞概述 自内核 3.2 以来,Linux 内核已通过 `AF_ALG` 套接字家族(``)向用户空间暴露了内核加密 API。用户空间打开一个 `SOCK_SEQPACKET` 套接字,将其绑定到算法模板(例如 `"aead"` 或 `"authencesn(hmac(sha256),cbc(aes))"`),然后发送数据进行加密或解密。 2017 年,一个性能优化被合并,允许 AEAD 算法在内核检测到源和目标共享相同的底层页面时*原地*加密或解密数据。这避免了每次操作的冗余内存复制。 `authencesn` 模板(为认证加密添加了扩展序列号支持)在解密过程中包含一个临时写入操作:它在认证检查运行之前,将 ESN 字节写入操作数据缓冲区的特定偏移位置。当操作的源页面是通过 `splice()` 从常规文件的*页面缓存*获取的,并且原地优化处于活动状态时,这个临时写入会直接写回那些缓存页面。 因为内核的页面缓存是一个共享映射——任何打开同一文件的进程都会看到相同的物理页面——无特权用户可以: 1. 以 `O_RDONLY` 方式打开任何可读文件(例如 `/usr/bin/su`)。 2. 将其页面通过 `splice()` 传入 `AF_ALG` 操作套接字。 3. 触发 `authencesn` 解密;ESN 临时写入会用攻击者控制的字节在受控偏移位置损坏页面。 4. *磁盘*从未被修改;只有内存中的页面缓存被修补。 离线完整性扫描器(AIDE、Tripwire、IMA/EVM)比较磁盘上文件的校验和,完全无法检测到这种攻击。写入在页面缓存清除或重启后消失,磁盘上不会留下任何取证痕迹。 通过瞄准 `/usr/bin/su`(一个 `setuid root` 二进制文件)并覆盖保护 PAM 认证检查的分支,攻击者获得无密码的 root shell。 ## 受影响的内核 | 分支 | 首个受影响版本 | 最后受影响版本 | 修复版本 | |--------------|-----------------|-----------------|-----------| | mainline | 4.14 | 6.18.21 | 6.18.22 | | 6.19 stable | 6.19.0 | 6.19.11 | 6.19.12 | | 7.0-rc | 7.0-rc1 | 7.0-rc6 | 7.0-rc7 | 引入该漏洞的优化提交发生在 4.14 开发周期(2017年7月)。在上述范围内,任何使用 `CONFIG_CRYPTO_USER_API_AEAD=y` 和 `CONFIG_CRYPTO_AUTHENC=y`(两者都是常见默认值)编译的内核都存在漏洞。 ## 受影响的发行版(非详尽) | 发行版 | 随附内核(近似) | 已修补? | |--------------------|-----------------------------|----------| | Debian 12 (Bookworm) | 6.1.x | 是(反向移植) | | Debian 13 (Trixie) | 6.12.x / 6.14.x | 是(反向移植) | | Ubuntu 24.04 LTS | 6.8.x | 是(USN-7xxx) | | Ubuntu 24.10 | 6.11.x | 是 | | RHEL 9.x | 5.14.x(重新移植) | 是(RHSA) | | Alpine 3.20 | 6.6.x | 是(反向移植) | | Arch Linux | rolling(≥ 6.18.22 现在) | 是 | | Kali Linux 2026.1 | 6.18.12 | 受影响 | | Kali Linux 2026.2+ | 6.18.22+ | 已修复 | | Linux Mint 22 | 6.8.x(Ubuntu 基础) | 是(Ubuntu USN)| *请检查您的发行版的安全跟踪器以获取准确的安全公告状态。* ## 需求 - 处于受影响范围内的 Linux 内核(见上表) - Python 3.10+(`os.splice` 在 Python 3.10 中添加) - 对目标二进制文件的读取访问权限(默认:`/usr/bin/su`,因为是 setuid 所以全局可读) - 无需特殊权限——这是一个**本地**权限提升漏洞 ## 使用方法 ``` # 显示在不接触内核的情况下会写入的内容(安全): python3 copy_fail_exploit.py --dry-run # 修补 /usr/bin/su 页面缓存(需要存在漏洞的内核): # 警告:需要存在漏洞的内核 — 仅在您拥有的系统上使用 python3 copy_fail_exploit.py # 修补并立即提权至 root: python3 copy_fail_exploit.py --spawn-shell # 使用自定义目标二进制文件和 payload: python3 copy_fail_exploit.py --target /usr/bin/sudo --payload-file ./custom_patch.bin # 详细输出(打印每次 4 字节写入): python3 copy_fail_exploit.py --verbose --dry-run ``` 默认情况下 `--spawn-shell` 是**关闭**的。修补后,脚本会打印: ``` [+] Patch applied to page cache of '/usr/bin/su' (disk unchanged). Run `su` to escalate, or re-run with --spawn-shell. To restore: echo 3 | sudo tee /proc/sys/vm/drop_caches ``` 您必须使用 `--spawn-shell` 选择加入 shell 生成。这是故意的:它迫使您在执行结果之前了解漏洞利用的作用。 ## 工作原理 **设置原语。** 漏洞利用打开一个 `AF_ALG` 套接字并将其绑定到带有全零虚拟密钥的 `authencesn(hmac(sha256),cbc(aes))` 模板。然后通过 `ALG_SET_AEAD_AEADTHSIZE` 将认证标签大小配置为 4 字节。在控制套接字上调用 `accept()` 会产生一个*操作套接字*,可以提交单个解密请求。 **触发页面缓存写入。** 对于每个 4 字节的修补有效载荷块,漏洞利用在操作套接字上调用 `sendmsg()` 并设置 `MSG_MORE`,传递 8 字节的关联数据(AAD):4 字节填充后跟 4 字节有效载荷。`MSG_MORE` 告诉内核等待更多数据到达。然后它创建一个管道并发出两个 `splice()` 调用——`file_fd → pipe → op_sock`——将文件自己的页面缓存页面作为解密操作的输入。当最终调用 `recv()` 时,内核运行 `authencesn` 解密。原地优化触发(源和目标是相同的页面),ESN 临时写入将我们的有效载荷字节复制到目标偏移位置的缓存页面中。`recv()` 返回 `EBADMSG` 因为认证标签无法验证——这是预期且无害的。写入已经发生。 **修补二进制文件。** 嵌入的有效载荷(直接从 Theori PoC 获取)覆盖了 `/usr/bin/su` 中来自标准 `util-linux` 构建的分支指令,将强制执行 PAM 认证的条件跳转转换为无条件 fall-through。修补后,无密码运行 `su` 会成功并产生一个 root shell。磁盘上的二进制文件未被修改;清除页面缓存条目(`echo 3 > /proc/sys/vm/drop_caches`)会立即恢复更改。 更深入的技术分析请参见下面的参考资料,特别是 Xint 博客文章和 Theori PoC 仓库。 ## 检测 ### Falco 规则 ``` - rule: AF_ALG socket opened by unprivileged process desc: > CVE-2026-31431 — an unprivileged process opened an AF_ALG (family 38) socket, which is the first step of the Copy Fail exploit. condition: > evt.type = socket and evt.arg.domain = 38 and not user.uid = 0 output: > AF_ALG socket opened (user=%user.name uid=%user.uid pid=%proc.pid comm=%proc.name) priority: WARNING tags: [host, network, privilege_escalation, CVE-2026-31431] ``` ### YARA(内存扫描漏洞利用脚本) ``` rule CopyFail_CVE_2026_31431 { meta: description = "Detects Copy Fail exploit script in memory or on disk" cve = "CVE-2026-31431" strings: $template = "authencesn(hmac(sha256),cbc(aes))" ascii $splice = "os.splice" ascii $aflag = "AF_ALG" ascii condition: all of them } ``` ### auditd — 检测 AF_ALG 套接字创建 添加到 `/etc/audit/rules.d/cve-2026-31431.rules`: ``` -a always,exit -F arch=b64 -S socket -F a0=38 -k cve_2026_31431_afalg ``` 然后使用以下命令查看日志: ``` ausearch -k cve_2026_31431_afalg --interpret ``` ## 缓解措施 **1. 应用内核补丁**(推荐) 升级到内核 6.18.22、6.19.12、7.0-rc7 或更高版本,或应用您的发行版的安全更新。 **2. 在构建时禁用 CONFIG_CRYPTO_USER_API_AEAD** 如果您构建自己的内核,请设置: ``` # CONFIG_CRYPTO_USER_API_AEAD 未设置 ``` 这将移除整个 `AF_ALG` AEAD 接口并消除攻击面。大多数嵌入式/强化部署不需要它。 **3. seccomp — 拒绝 AF_ALG 套接字家族** 为敏感进程添加 seccomp 过滤器(或通过 LSM 策略在系统范围内)拒绝 `socket(AF_AL, ...)`: ``` // Deny socket() when domain == AF_ALG (38) BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 38, 0, 1), BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | EACCES), ``` **4. 通过内核强化降低页面缓存权限** `vm.unprivileged_userfaultfd=0` 和类似的可调参数减少了用户可访问的内核内存接口的攻击面,尽管它们不能直接阻止此 CVE。 ## 测试后清理 漏洞利用仅修改内存中的页面缓存;磁盘上的二进制文件从未被触及。要恢复内存中的原始文件内容,请清除内核的页面缓存: ``` echo 3 | sudo tee /proc/sys/vm/drop_caches ``` 这会从缓存中清除所有干净页面。下次读取 `/usr/bin/su`(或任何被修补的二进制文件)将从磁盘重新加载原始字节。 **重启**也会完全清除页面缓存。 ## 参考资料 - [原始 PoC — Theori](https://github.com/theori-io/copy-fail-CVE-2026-31431) - [技术分析 — Xint](https://xint.io/blog/copy-fail-linux-distributions) - [Sysdig 威胁分析](https://www.sysdig.com/blog/cve-2026-31431-copy-fail-linux-kernel-flaw-lets-local-users-gain-root-in-seconds) - [Microsoft 安全博客](https://www.microsoft.com/en-us/security/blog/2026/05/01/cve-2026-31431-copy-fail-vulnerability-enables-linux-root-privilege-escalation/) - [NVD 条目](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) - [Debian 安全跟踪器](https://security-tracker.debian.org/tracker/CVE-2026-31431) ## 致谢 - **原始发现和披露**:Theori(theori.io)和 Xint(xint.io) - **教育性重写**:n0kk ## 许可证 MIT — 见 [LICENSE](LICENSE)。 选择 MIT 而不是自定义的"仅供教育使用"许可证,是因为不存在作为公认 OSI/SPDX 标识符的此类许可证。MIT 是宽松的、法律上易于理解的,并且与负责任的披露仓库兼容。教育意图在模块文档字符串、本 README 的免责声明部分和 `--help` 输出中表达——而不是在法律上可疑的自定义许可证条款中。
标签:0day挖掘, AF_ALG, algif_aead, CVE-2026-31431, Linux内核, Linux内核漏洞, PoC, splice, Web报告查看器, 内存损坏, 内核利用, 内核安全, 内核提权, 协议分析, 安全渗透, 密码学漏洞, 暴力破解, 本地提权, 权限提升, 漏洞复现, 竞态条件, 网络安全, 隐私保护, 页面缓存