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报告查看器, 协议分析, 子域名枚举, 安全渗透, 客户端加密, 密码子系统, 本地提权, 权限提升, 漏洞修复, 漏洞防御, 特权升级防护, 系统安全, 缓解措施, 网络安全培训, 补丁替代