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报告查看器, 临时补丁, 内存清除, 内核加固, 内核安全, 子域名枚举, 本地提权, 权限提升防御, 漏洞修复, 漏洞缓解, 系统安全, 结构化阻断, 网络安全培训, 运维安全