Linux-zs/cve-2026-31431-mitigation
GitHub: Linux-zs/cve-2026-31431-mitigation
针对 Linux 内核 CVE-2026-31431 本地提权漏洞的 seccomp-BPF 缓解方案,通过 PAM 模块或独立封装器精准阻断 AF_ALG 套接字调用,在不修补内核的前提下阻止提权利用。
Stars: 0 | Forks: 0
# CVE-2026-31431 seccomp 缓解措施
一种针对 CVE-2026-31431 的轻量级、可逆 seccomp 缓解方案。该漏洞是 Linux 内核 `algif_aead` / `authencesn` 加密子系统中的一个本地提权漏洞。
[中文文档](README_CN.md)
## 漏洞概述
**类型:** 本地提权 (LPE)
**受影响组件:** Linux 内核 `crypto/algif_aead.c` - 原地 AEAD 操作
**攻击原语:** 通过 `authencesn` AEAD 算法的 scratch-write 路径,对任何可读文件的页缓存进行 4 字节的任意可控写入。通过针对 `/etc/passwd`,攻击者可以将其 UID 修改为 0 (root),并通过 `su` 获取 root shell。
**受影响内核:** 已在内核 6.12+、6.17+、6.18+ 上确认,并在 RHEL/CentOS 4.18/5.14 内核上复现。
**验证环境:** Rocky Linux 8 (内核 4.18) 和 Rocky Linux 9 (内核 5.14) - 漏洞利用被完全阻止,确认可安全卸载。
**根本原因:** 引入原地 AEAD 操作的提交 `72548b093ee3`。当拼接的页缓存页被用作目标散列表时,AAD `seqno_lo` 字段在 AEAD 解密期间被错误地写回页缓存中。
**上游修复:** 恢复为非原地 AEAD 操作。
## 缓解措施的工作原理
本解决方案包含**两个部分**:
1. **PAM 模块 (`pam_block_afalg.so`)** - 主要防御手段。在打开会话期间由 PAM 加载 (`pam_sm_open_session`),它会在任何用户代码运行之前应用一个 seccomp BPF 过滤器来阻止 `socket(AF_ALG, ...)`。这涵盖了所有通过 PAM 认证的会话:`su -c`、`su -`、SSH、TTY 登录等。
2. **独立二进制文件 (`block_afalg`)** - 可选。可以为非 PAM 场景(例如 cron 任务、systemd 服务、手动调用)封装特定的程序。
seccomp 过滤器:
- 仅阻止 `socket(AF_ALG, ...)` (返回 EACCES)
- 对所有其他系统调用(包括 `setuid`、`su`、`sudo`)零影响
- 会被所有子进程继承 (fork + exec)
- 自动检测已打补丁的内核并自动失效
## 架构
```
PAM session open (su, ssh, login, etc.)
|
v
pam_block_afalg.so (pam_sm_open_session)
|
+-- Check: is kernel vulnerable? (try socket(AF_ALG))
| |
| +-- No --> return PAM_SUCCESS (no-op)
| |
| +-- Yes --> prctl(PR_SET_SECCOMP, BPF filter)
| |
| +-- seccomp filter active on sshd child process
| +-- inherited by user's shell and ALL child processes
| +-- socket(AF_ALG, ...) returns EACCES
v
User's shell / command runs with seccomp protection
|
+-- su, sudo, and all other syscalls work normally
+-- Only AF_ALG socket is blocked
```
## 文件
| 文件 | 用途 |
|------|---------|
| `pam_block_afalg.c` | PAM 模块源代码。在打开会话时应用 seccomp 过滤器。 |
| `pam_minimal.h` | 最小化的 PAM 类型定义(无需 pam-devel 即可编译)。 |
| `block_afalg.c` | 独立的 seccomp 封装二进制文件。用于非 PAM 场景。 |
| `deploy.sh` | 部署脚本。负责编译、安装和管理 PAM 模块。 |
## 环境要求
- 支持 seccomp 的 Linux 内核(大多数现代内核)
- `gcc`(用于编译)
- `libpam`(运行时,通常已预装)
- root/sudo 权限(用于安装)
- x86_64 架构(BPF 过滤器使用 x86_64 系统调用号)
## 快速开始
```
# 编译 PAM 模块
gcc -Wall -O2 -fPIC -shared -o pam_block_afalg.so pam_block_afalg.c \
/usr/lib64/libpam.so.0
# 安装(自动将 PAM 配置添加到 su、sshd、login)
sudo ./deploy.sh install
# 验证(必须是新会话)
cat /proc/self/status | grep Seccomp
# 应显示:Seccomp: 2
python3 -c "
import socket
try:
s = socket.socket(38,2,0); s.close()
print('VULNERABLE')
except OSError:
print('BLOCKED')
"
# 应显示:BLOCKED
# 卸载
sudo ./deploy.sh remove
```
## 命令参考
| 命令 | 描述 |
|---------|-------------|
| `deploy.sh install` | 编译 PAM 模块,安装到 `/lib64/security/`,并自动添加 PAM 配置 |
| `deploy.sh remove` | 完全卸载:移除模块,清理 PAM 配置,删除相关文件 |
| `deploy.sh status` | 显示安装状态、PAM 配置和内核状态 |
## 独立使用
对于非 PAM 场景,请直接使用 `block_afalg`:
```
# 编译
gcc -Wall -O2 -o block_afalg block_afalg.c
# 运行被阻断 AF_ALG 的命令
./block_afalg python3 your_script.py
./block_afalg bash
```
## 验证
### 检查内核是否存在漏洞
```
python3 -c "
import socket
try:
s = socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.close()
print('VULNERABLE: AF_ALG socket available')
except:
print('SAFE: AF_ALG socket blocked or unavailable')
"
```
### 验证 PAM 模块是否激活
```
# 检查 seccomp 状态
cat /proc/self/status | grep Seccomp
# Seccomp: 0 = 未受保护
# Seccomp: 2 = 受保护
# 测试 AF_ALG socket
python3 -c "
import socket
try:
s = socket.socket(38,2,0)
s.close()
print('AF_ALG available - NOT protected')
except OSError:
print('AF_ALG blocked - PROTECTED')
"
# 检查 PAM 日志
grep pam_block_afalg /var/log/secure
# 应显示:seccomp filter applied, AF_ALG blocked
```
## 限制
- **仅限 x86_64:** BPF 过滤器硬编码了系统调用号 41(即 x86_64 上的 `__NR_socket`)。其他架构需要更新相应的系统调用号。
- **依赖 PAM:** 仅保护通过 PAM 的会话。不涵盖未使用 PAM 的直接 `exec()` 调用(请为此类情况使用 `block_afalg`)。
- **无法在运行时禁用:** seccomp 过滤器一旦应用于进程,便无法移除。内核检查机制确保其仅在需要时应用。
- **仅限新会话:** 模块安装之前启动的现有会话不会受到保护。
## 何时移除
1. **已应用官方内核补丁** - PAM 模块会自动检测此情况,但您仍可以使用 `remove` 进行清理。
2. **RHEL/CentOS 发布了修补后的内核** - 执行 `yum update kernel` 然后移除该模块。
## 许可证
本工具仅供授权的安全测试和防御目的使用。请仅在您拥有或获得明确授权评估的系统上使用。
标签:AF_ALG, algif_aead, CentOS, Cutter, CVE-2026-31431, EACCES, Linux内核安全, LPE, PAM模块, Rocky Linux, seccomp, Web报告查看器, 协议分析, 子域名枚举, 安全渗透, 客户端加密, 密码子系统, 本地提权, 权限提升, 漏洞修复, 漏洞防御, 特权升级防护, 系统安全, 缓解措施, 网络安全培训, 补丁替代