用golang重写该漏洞exp,直接编译成二进制文件,方便在各种生产环境进行直接测试。Copy Fail - CVE-2026-31431
Linux 内核 AF_ALG 加密 Socket 子系统漏洞的概念验证利用代码。
技术分析
受影响的发行版
| 发行版 | 内核版本 |
|---|
| 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 |
漏洞原理
该漏洞位于 Linux 内核加密子系统的 AF_ALG(Algorithm)Socket 接口中。当使用 AEAD(带认证的数据加密)算法时,通过 sendmsg(2) 发送控制消息配合 splice(2) 进行数据传输,内核会错误处理内部加密请求状态,导致越界读/写或使用后释放(UAF)条件。
核心机制
创建 AF_ALG Socket 并绑定到 authencesn(hmac(sha256),cbc(aes)) 算法
通过 setsockopt 设置构造的密钥结构和认证标签大小
使用 sendmsg(2) 发送包含三条控制消息(IV、关联数据、认证大小)的数据包
通过 splice(2) 将目标文件数据经管道传入 Socket,触发内核状态混乱
分块迭代完成利用后执行提权操作
项目结构
├── copy_fail_exp.go # Go 语言实现(主文件)
├── pybak/
│ ├── copy_fail_exp.py # 原始 Python 实现(10 行压缩版)
│ └── README.md # 原始项目说明
├── build/ # 编译产物
│ ├── CVE-2026-31431_linux_amd64
│ └── CVE-2026-31431_linux_arm64
├── Makefile # 构建脚本
├── go.mod # Go 模块定义
└── README.md # 本文件
构建
环境要求
编译命令
# 编译当前平台
go build -o CVE-2026-31431 .
# 交叉编译所有 Linux 平台(amd64, arm64, 386)
make build-linux
# 直接运行
make run
# 或
go run .
# 清理
make clean
构建产物输出到 build/ 目录,二进制文件经过 strip 裁剪。
技术参考
关键常量
| 常量 | 值 | 说明 |
|---|
AF_ALG | 38 | 算法 Socket 族 |
SOL_ALG | 279 | ALG Socket 选项级别 |
ALG_SET_KEY | 1 | 设置密钥 |
ALG_SET_AEAD_AUTHSIZE | 5 | 设置 AEAD 认证大小 |
MSG_MORE | 32768 | 发送标志:后续还有数据 |
控制消息
每次 sendmsg 发送三条 cmsghdr 控制消息(level 279):
| 类型 | 数据 | 用途 |
|---|
| 3 | 4 字节零 | IV |
| 2 | 0x10 + 19 字节零 | 关联数据 (AAD) |
| 4 | 0x08 + 3 字节零 | 认证标签大小 |
缓解措施
免责声明
本代码及程序仅供安全研究和教育目的使用,仅应在授权的安全测试环境中运行。作者不对任何滥用行为负责。
关注本公众号回复 CVE-2026-31431 即可下载