CVE-2026-31431
结构
.
├── container
│ ├── container.md # 容器逃逸的思路
│ ├── expenv # 容器环境
│ │ ├── bin
│ │ │ ├── gscontainer
│ │ │ └── share
│ │ ├── Dockerfile
│ │ ├── run.sh
│ │ └── src
│ │ ├── gscontainer.c
│ │ └── share.c
│ ├── images
│ │ ├── container.png
│ │ ├── getshell.png
│ │ ├── host.png
│ │ ├── payload.png
│ │ └── share.png
│ ├── recode.bin # 单阶段的 shellcode
│ └── stager
│ ├── shell.elf # 内嵌在exp当中的分阶段 shellcode
│ ├── stager1.bin
│ ├── stager2.bin
│ ├── stager3.bin
│ └── stager4.bin
├── doc
│ ├── cve-2026-31431.md # xint.io 分析总结
│ └── shellcode.md # 介绍什么是 shellcode
├── exp.py # curl http://copy.fail/exp -o exp.py
├── README.md
├── success
│ ├── code.py # exp.py 提取的 shellcode
│ └── exploit.c # C 语言精简的 exp,当中有原生的 msf 提权的 shellcode,需要自己免杀
└── test
├── exptest.c # 清除注释
└── test.c # 正确且带注释,便于理解
三条提交链的意外交集
三个单独无害的提交,组合后产生了漏洞:
exp 的利用流程
splice(文件 → pipe → AF_ALG)
↓
af_alg_sendmsg: 文件页缓存页 → TX SGL (零拷贝)
↓
_aead_recvmsg: in-place 优化
├─ memcpy_sglist: AAD+密文拷贝到 RX SGL
├─ sg_chain: tag 页(仍指向文件页缓存)链入 RX SGL
└─ req->src = req->dst (= 含文件页缓存页的 scatterlist)
↓
crypto_authenc_esn_decrypt: ESN 重排列
└─ scatterwalk_map_and_copy(tmp+1, dst, assoclen+cryptlen, 4, 1)
↓ 在 dst scatterlist 中遍历到 tag 位置
↓ kmap_local_page() 映射文件页缓存页
↓ memcpy: 将 seqno_lo 写入文件页缓存页
↓
HMAC 验证失败 → 返回 -EBADMSG
↓
文件页缓存页已被修改,内核未标记脏页,磁盘文件不变
CVE-2026-31431 影响范围
论文声称自 2017 年以来"几乎所有 Linux 发行版"均受影响。页缓存跨容器共享,因此该漏洞既是本地提权 (LPE) 也是容器逃逸向量。
CVE-2026-31431 修复方案
内核主线的修复提交 a664bf3d603d 将 AF_ALG AEAD 操作回退到 out-of-place(分离 src 和 dst):
Before: aead_request_set_crypt(..., rsgl_src,
areq->first_rsgl.sgl.sgt.sgl, ...)
^ src == dst ^
After: aead_request_set_crypt(..., tsgl_src,
areq->first_rsgl.sgl.sgt.sgl, ...)
^ src ≠ dst ^ (TX SGL for src, RX SGL for dst)
提交消息:"There is no benefit in operating in-place in algif_aead since the source and destination come from different mappings。"
应急缓解措施:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead
或通过 seccomp 策略禁止 AF_ALG 套接字创建 (socket(AF_ALG, ...))。
总结
参考
https://xint.io/blog/copy-fail-linux-distributions
https://github.com/0xShe/CVE-2026-31431