ErdemOzgen/copy-fail-cve-2026-31431
GitHub: ErdemOzgen/copy-fail-cve-2026-31431
针对 CVE-2026-31431 Linux 内核漏洞的 Go 语言 PoC,演示 authencesn 模块中通过 AF_ALG 和 splice() 实现的确定性页缓存写入缺陷,帮助验证内核补丁状态。
Stars: 3 | Forks: 0
# 复制失败 - CVE-2026-31431
本仓库提供了公开的 Copy Fail PoC 的 Go 语言移植版本,以及用于多架构 Linux 二进制文件的可重现构建流水线。
Copy Fail (CVE-2026-31431) 是 `authencesn` 中的一个 Linux 内核逻辑缺陷,允许通过 `AF_ALG` + `splice()` 向页缓存数据进行确定性的 4 字节写入。
## 负责任的使用
仅在您获得明确授权测试的环境中使用本项目。请勿对您不拥有或未获得书面许可评估的系统运行此 PoC。
## 快速测试(无需构建)
如果您想立即进行测试而无需从源代码构建,请下载 release 二进制文件并运行:
```
wget https://github.com/ErdemOzgen/copy-fail-cve-2026-31431/releases/download/v1.0.1/copy-fail-cve-2026-31431_linux_amd64
chmod +x copy-fail-cve-2026-31431_linux_amd64
./copy-fail-cve-2026-31431_linux_amd64
```
对于其他架构,请从 GitHub Releases 页面下载匹配的资产:
https://github.com/ErdemOzgen/copy-fail-cve-2026-31431/releases
## 目录
- [快速测试(无需构建)](#quick-test-no-build)
- [构建前置条件](#build-prerequisites)
- [本地构建](#local-build)
- [用法](#usage)
- [故障排除](#troubleshooting)
- [概述](#overview)
- [为何重要](#why-it-matters)
- [根本原因](#root-cause)
- [authencesn 中的触发路径](#trigger-path-in-authencesn)
- [该漏洞如何变得可达](#how-the-bug-became-reachable)
- [高层利用流程](#high-level-exploit-flow)
- [修复摘要](#fix-summary)
- [补救措施](#remediation)
- [披露时间线](#disclosure-timeline)
- [发现过程](#how-it-was-found)
- [仓库结构](#repository-layout)
- [GitHub Actions](#github-actions)
- [已测试的发行版](#tested-distributions)
- [参考](#references)
## 构建前置条件
- Go 1.23+
- GNU Make
## 本地构建
构建所有 Linux 目标:
```
make clean build-linux
```
构建并生成校验和:
```
make clean checksums
```
`dist/` 中的输出二进制文件:
- `copy-fail-cve-2026-31431_linux_amd64`
- `copy-fail-cve-2026-31431_linux_arm64`
- `copy-fail-cve-2026-31431_linux_386`
- `copy-fail-cve-2026-31431_linux_armv7`
- `SHA256SUMS`
## 用法
默认运行:
```
./copy-fail-cve-2026-31431_linux_amd64
```
使用自定义目标路径:
```
./copy-fail-cve-2026-31431_linux_amd64 -target /path/to/binary
```
禁用运行后 `su` 执行:
```
./copy-fail-cve-2026-31431_linux_amd64 -spawn-su=false
```
打印构建元数据:
```
./copy-fail-cve-2026-31431_linux_amd64 -version
```
## 故障排除
如果在偏移量 0 处执行失败并出现类似以下的错误:
```
error: copy chunk at offset 0: splice(pipe->AF_ALG): software caused connection abort
```
内核很可能拒绝了易受攻击的 AEAD 原地路径(例如,因为主机已针对 CVE-2026-31431 打了补丁或 `algif_aead` 已被缓解/禁用)。
快速检查:
```
uname -r
grep -E "algif_aead|authencesn" /proc/modules
```
在已修复的系统上,此 PoC 预期会失败。
## 概述
根据公开披露,易受攻击的路径允许未授权的本地用户在特定条件下,将 4 字节写入原语影响到可读文件的页缓存内容中。
重要的操作特性是,内存中的页缓存副本在运行期间可能与磁盘上的字节产生分歧,这使得对于仅依赖磁盘级别完整性检查的团队来说,影响分析并非微不足道。
## 为何重要
Copy Fail 值得关注,因为它被报告为:
- 确定性的(在描述的触发路径中没有竞争要求)。
- 在测试中可跨主要 Linux 发行版移植。
- 实现紧凑,没有外部 payload 构建器依赖。
- 由于共享页缓存行为,其相关性超出了单进程范围。
## 根本原因
从高层次来看,该问题位于三个机制的交汇处:
1. `AF_ALG` AEAD 请求处理。
2. `splice()` 页缓存支持的数据移动。
3. `authencesn` 解密临时行为。
在存在漏洞的设计中,页缓存支持的段可以被链接到稍后在算法处理期间接收写入的请求结构中,这违反了仅修改预期目标区域的关键假设。
## authencesn 中的触发路径
在记录的路径中,`authencesn` 围绕 ESN 布局处理使用目标端临时操作,并在超出预期解密输出契约的偏移量处执行写入。
当与原地 AEAD 设置和链式 scatterlist 引用结合使用时,此写入可以落入攻击者选定区域的页缓存支持的内存中。
## 该漏洞如何变得可达
披露描述了一个多次提交的演变过程:
- `authencesn` 行为起源于早期的集成历史。
- `AF_ALG` AEAD 支持引入了用户空间可达性与 `splice()` 交互。
- 稍后在 `algif_aead` 中的原地优化以使此交汇点可被利用的方式结合了源和目标流。
关键教训是组合风险:单独合理的更改在组合时可能变得不安全。
## 高层利用流程
公开的详细说明和 PoC 描述了以下序列:
1. 打开并配置一个 `AF_ALG` AEAD socket,用于 `authencesn(hmac(sha256),cbc(aes))`。
2. 提供精心制作的元数据和分块数据。
3. 使用 `splice()` 通过请求路径路由页缓存支持的文件数据。
4. 触发解密处理并以受控的 4 字节步长重复。
本仓库的 Go 实现反映了该公开 PoC 逻辑,用于在授权环境中进行研究和验证。
## 修复摘要
报告的修复将 `algif_aead` 中易受攻击的原地 AEAD 操作恢复为非原地行为。
概念上:
- 修复前:在此路径中,源和目标可以折叠为一个可写链。
- 修复后:源和目标保持分离,防止页缓存支持的源段在此流程中用作可写的目标区域。
## 补救措施
- 将内核修补到包含上游修复的版本。
- 在整个集群和镜像中推出供应商内核包更新。
- 考虑临时的强化控制(例如,在操作可行的情况下对 `AF_ALG` 使用实施策略限制)。
- 通过运行时检查验证补救措施,而不仅仅是磁盘校验和工作流。
## 披露时间线
基于公开的详细说明:
| 日期 | 事件 |
|------------|------------------------------------------------|
| 2026-03-23 | 向 Linux 内核安全团队提交报告 |
| 2026-03-24 | 初次确认 |
| 2026-03-25 | 补丁讨论/审查 |
| 2026-04-01 | 修复提交至主线 |
| 2026-04-22 | 分配 CVE-2026-31431 |
| 2026-04-29 | 公开披露 |
## 发现过程
发表的研究归功于人工引导的、AI 辅助的子系统分析,重点关注用户空间可达的加密代码路径以及 `splice()` 下的 scatterlist/页来源。
## 仓库结构
- `main.go`:Go PoC 移植。
- `Makefile`:确定性的多架构 Linux 构建目标。
- `.github/workflows/build.yml`:CI 构建和发布产物工作流。
## GitHub Actions
工作流文件:`.github/workflows/build.yml`
触发器:
- Pull 请求
- 推送到 `main`
- 推送匹配 `v*` 的标签
- 手动 `workflow_dispatch`
行为:
1. 通过 `make clean checksums` 构建所有带有校验和的 Linux 二进制文件。
2. 上传以 ref + commit SHA 命名的 CI 产物。
3. 为匹配 `v*` 的标签自动发布 release 资产。
建议的发布流程:
```
git tag v1.0.0
git push origin v1.0.0
```
## 已测试的发行版
| 发行版 | 内核版本 |
|-------------------|--------------------------|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
## 参考
- 原始公开文章:https://xint.io/blog/copy-fail-linux-distributions
- CVE 条目:CVE-2026-31431
标签:AF_ALG, CISA项目, CVE-2026-31431, EVTX分析, Golang, Hakrawler, Linux内核, PoC, Web报告查看器, 内存破坏, 内核漏洞, 子域名枚举, 安全渗透, 安全编程, 日志审计, 暴力破解, 本地提权, 系统安全, 网络安全, 跨平台编译, 隐私保护, 页缓存