professional-slacker/alg_check
GitHub: professional-slacker/alg_check
针对 CVE-2026-31431 本地提权漏洞的 Linux AF_ALG 攻击面诊断与临时加固工具包,提供审计、阻断、恢复的完整工作流。
Stars: 0 | Forks: 0
## ⚠️ 重要免责声明:结构性加固风险
此工具通过物理重命名内核模块并从内存中清除它们,实施**结构性阻断**以缓解 **CVE-2026-31431**。在使用前,请注意以下架构风险:
* **内核更新的易变性**:加固效果是**暂时的**。内核更新会在新的 `/lib/modules/` 目录下部署全新的、带有漏洞的模块,从而使之前的阻断失效。
* **功能的副作用**:禁用 `AF_ALG` (Kernel Crypto API) 可能会破坏依赖于内核级硬件加速的特定应用程序或服务(例如,专用 VPN、磁盘加密实用程序或自定义安全工具)。[cite: 3]
* **缓解与补丁**:这是一个**权宜之计**,而不是永久的补丁。它的目的是在发行版提供修补好的内核之前,起到过渡的作用。
**使用风险自负。** 运行 `solution.sh` 后,请务必验证系统的关键功能。[cite: 3]
# SSIA - 系统结构完整性审计
一个用于通过 Linux Kernel Crypto API (`AF_ALG`) 发现、诊断和抑制 LPE (本地提权) 向量的工具包。
## ⚠️ 重要免责声明:结构性加固风险
该工具使用**结构性阻断**,通过重命名内核模块并从内存中清除它们来应对 CVE-2026-31431。主要的架构风险包括:
- **内核更新的易变性**:效果是暂时的。内核更新会在新的 `/lib/modules/` 目录下部署全新的易受攻击模块,从而使之前的阻断失效。
- **功能的副作用**:禁用 AF_ALG 可能会中断依赖内核级硬件加速的服务,例如专用 VPN、磁盘加密实用程序或自定义安全工具。
- **缓解与补丁**:这是一个**权宜之计,而不是永久性补丁**,旨在作为提供修补内核之前的过渡方案。
使用风险自负。
## 概述
本仓库提供了两个脚本,它们构成了针对通过 `AF_ALG` (`socket(38, 5, 0)`) 进行提权攻击的 **诊断 → 抑制 → 验证** 工作流程:
- **`check.sh`** — 多层安全态势审计(以非特权身份运行)
- **`solution.sh`** — 强制从内存中驱逐 AF_ALG 模块 + 检查物理模块文件(需要 root 权限)
- **`restore.sh`** — 重新加载 AF_ALG 模块并将系统恢复到执行 solution.sh 之前的状态(需要 root 权限)
## 检查项
| 检查项 | 检查内容 | 严重程度 |
|-------|------------------|----------|
| **Process Context** | 当前的 UID/GID 和有效 capabilities | 低 |
| **AF_ALG Crypto Socket** | 通过 `socket(AF_ALG, ...)` 访问 Kernel Crypto API 的能力 | 高 |
| **kptr_restrict** | 内核指针对用户空间的可见性 | 中 |
| **dmesg_restrict** | 内核环形缓冲区的访问限制 | 中 |
| **SELinux** | Enforcing / Permissive / Disabled 状态 | 中 |
| **/proc hidepid** | `/proc` 是否隐藏其他进程的信息 | 低 |
## 用法
### 审计(无需特权)
```
./check.sh
```
### 抑制(需要 root 权限)
```
sudo ./solution.sh
```
### 恢复(需要 root 权限)
```
sudo ./restore.sh
```
## 恢复
`restore.sh` 通过重新加载 AF_ALG 内核模块(`af_alg`、`algif_rng`、`algif_aead`、`algif_skcipher`、`algif_hash`)来撤销 `solution.sh` 的影响。如果物理模块文件(`af_alg.ko.xz`)已被重命名或删除,脚本将发出警告并在尝试加载模块之前提示您手动恢复。
## ⚠️ 警告
**在主动使用 AF_ALG(例如,带有 IPsec、dm-crypt/LUKS 或任何硬件加密卸载的系统)的生产系统上运行 `solution.sh` 会立即中断所有内核加密操作。** 这包括:
- IPsec VPN 连接和 WireGuard
- 磁盘加密(LUKS/dm-crypt)
- 使用内核支持加密的 TLS 终止
- 任何依赖 `algif_*` 套接字接口的容器或应用程序
该脚本强制卸载 AF_ALG 内核模块。内核加密操作将失败,直到重新启动。此脚本**仅适用于隔离的、非生产环境或一次性的系统**,用于测试和分析目的。请勿在生产或关键基础架构上运行它。
## 要求
- Linux(任何发行版)
- `check.sh` 除了 POSIX shell 和 `/proc`/`/sys` 之外没有其他依赖
- `solution.sh` 需要 root 权限
- `restore.sh` 需要 root 权限
- `af_alg_block.so` 需要具有 root 权限才能通过 `/etc/ld.so.preload` 进行安装
## WSL2 注意事项
此 POC 已在 WSL2 上进行了测试。请注意以下几点:
- **WSL2 会在重启时重置所有状态(`wsl --shutdown`)**。这包括 `solution.sh` 导致的内核模块状态更改、文件重命名、`check.sh` 结果以及此仓库中的任何本地文件修改。
- 若要在 WSL2 上实现永久性加固,请考虑单独配置 `.wslconfig`、`/etc/wsl.conf` 或自动启动脚本(例如 `/etc/rc.local`)。
- WSL2 适用于测试和验证目的,但**不适用于生产使用或持久的安全缓解措施**。
## 缓解措施
要彻底切断 AF_ALG 攻击向量:
1. **将内核模块列入黑名单**(最可靠):
echo "blacklist af_alg" | sudo tee /etc/modprobe.d/af_alg-blacklist.conf
或者重命名物理文件:
sudo mv /lib/modules/$(uname -r)/kernel/crypto/af_alg.ko.xz \
/lib/modules/$(uname -r)/kernel/crypto/af_alg.ko.xz.bak
2. **通过 sysctl 禁用 AF_ALG**:
sudo sysctl -w net.core.af_alg_disabled=1
3. **通过 SELinux / AppArmor 策略阻止创建 AF_ALG 套接字**
4. **禁用非特权用户命名空间**(容器环境):
sudo sysctl -w kernel.unprivileged_userns_clone=0
5. **通过 `LD_PRELOAD` 在 `socket()` syscall 处阻止 AF_ALG**(WSL2 权宜之计):
# 系统级安装(需要 root)
echo /absolute/path/to/af_alg_block.so | sudo tee -a /etc/ld.so.preload
仓库中包含了一个预构建的共享库(`af_alg_block.so`。它拦截 `socket(2)`,并在域为 `AF_ALG` (38) 时返回 `EAFNOSUPPORT`。所有其他的套接字调用将原封不动地传递给真实的实现。
此方法主要适用于 WSL2,因为其单用户语义和重启时重置行为使得系统级的 `LD_PRELOAD` 变得实用。在传统的多用户 Linux 系统上,请优先选择方法 1(模块黑名单)——通过 `/etc/ld.so.preload` 注入会影响系统上的每一个进程,并且可能会悄无声息地破坏依赖 AF_ALG 的服务。
**注意:** 需要 glibc(不支持 musl)。修改 `/etc/ld.so.preload` 需要 root 权限。如需移除,从该文件中删除相应的行即可。
## 许可证
MIT
标签:0day挖掘, AF_ALG, Crypto API, Cutter, CVE-2026-31431, Linux内核, LPE, osquery, SSIA, Structural Blocking, System Structural Integrity Audit, Web报告查看器, 临时补丁, 内存清除, 内核加固, 内核安全, 子域名枚举, 本地提权, 权限提升防御, 漏洞修复, 漏洞缓解, 系统安全, 结构化阻断, 网络安全培训, 运维安全