Copy Fail Detection and Remediation(复制故障检测与修复)
一套用于检测和修复 CVE-2026-31431(复制故障)的 Ansible 角色和剧本套件,该漏洞是 Linux 内核 algif_aead 模块中的一个严重本地权限提升漏洞。
🔗 GitHub: https://github.com/parmstro/cfDr
cfDr 这个名称是 "Copy Fail Doctor"(复制故障医生)的谐音——它是您应对 CVE-2026-31431 的可靠良方。
CVE-2026-31431(CVSS 7.8)是 2026 年发现的 Linux 内核 AEAD 套接字接口(AF_ALG)中的一个逻辑缺陷。该漏洞允许任何非特权本地用户在数秒内将权限提升至 root。
algif_aead 内核模块(AF_ALG 加密接口)内核版本:Linux 内核 >= 4.10(2017 年发布)
受影响的发行版:
注意:任何使用内核 4.10 或更高版本的 Linux 发行版都可能存在漏洞。
该漏洞特别危险,原因如下:
一旦攻击者获得任何形式的本地访问权限(SSH、Web Shell、容器逃逸等),他们就可以:
在等待厂商提供内核补丁期间,有多种缓解策略可供使用。cfDr 实现了所有这些策略,并根据您的系统配置提供智能推荐。
并非所有修复方案效果相同。以下内容您需要了解:
| 方法 | Root 能否绕过? | 覆盖范围 | 企业级 Linux 支持 |
|---|---|---|---|
| 模块黑名单 | ✅ 可以(通过 insmod) | 阻止 modprobe 加载 | 所有版本 |
| SELinux 策略 | ❌ 不能(LSM 层) | 仅限已配置的域 | 所有版本(默认) |
| systemd seccomp | ❌ 不能(系统调用过滤器) | 仅限已配置的服务 | 所有版本 |
| eBPF LSM | ❌ 不能(LSM 层) | 系统范围(若已配置) | RHEL 9+、Fedora 34+ |
cfDr 的默认推荐:标志 3(模块黑名单 + SELinux)
这提供了两个独立的防护层:``` ┌─────────────────────────────────────────────────┐ │ Layer 1: Module Blacklist │ │ • Prevents modprobe algif_aead │ │ • Persists across reboots │ │ • CAN be bypassed by malicious root (insmod) │ ├─────────────────────────────────────────────────┤ │ Layer 2: SELinux Policy │ │ • Blocks AF_ALG socket() at syscall level │ │ • Works even if module is loaded │ │ • CANNOT be bypassed from userspace │ │ • Covers user_t, unconfined_t (majority cases) │ └─────────────────────────────────────────────────┘
Result: If either layer fails, the other still protects
### 为什么仅靠模块黑名单是不够的
拥有 root 权限的坚定攻击者可以绕过模块黑名单:```bash
# Module blacklist DOES NOT prevent:
insmod /lib/modules/$(uname -r)/kernel/crypto/algif_aead.ko.xz
然而,这是可以接受的,因为:
要实现完整、不可绕过的防护,你需要:
模块黑名单 + 以下至少一项:
cfDr 使用位标志来启用多种缓解措施:
| 标志值 | 已启用的缓解措施 | 使用场景 |
|---|---|---|
| 1 | 仅模块黑名单 | 最低防护,适用于没有 SELinux 的系统 |
| 2 | 仅 SELinux | 仅 SELinux 环境 |
| 3 | 模块黑名单 + SELinux | 推荐默认值 |
| 5 | 模块黑名单 + seccomp | 非 SELinux 环境,带服务加固 |
| 7 | 模块黑名单 + SELinux + seccomp | 增强防护 |
| 15 | 所有缓解措施 | 最高防护(仅限 RHEL 9+) |
计算标志:1(黑名单)+ 2(SELinux)+ 4(seccomp)+ 8(eBPF)= 总和
SELinux 防护:
user_t、unconfined_t、httpd_t、postgresql_t、mysqld_tuser_t 和 unconfined_t 覆盖了绝大多数攻击场景systemd seccomp 防护:
httpd、nginx、postgresql、mariadb、redis、memcachedeBPF LSM 防护:
cfDr 在多个维度上执行全面评估:
uname -r
- 判断内核版本是否 >= 4.10(受影响范围)
- 识别内核发行版本及发行版信息
#### 2. 模块可用性检查```bash
modinfo algif_aead
algif_aead 模块lsmod | grep algif_aead
- 确定模块当前是否已加载
- **关键**:已加载模块 = 可主动利用
#### 4. 活动套接字检测```bash
lsof -U | grep AF_ALG
模块黑名单:```bash grep -E "blacklist algif_aead|install algif_aead" /etc/modprobe.d/*.conf
**SELinux 策略**:```bash
semodule -l | grep cve_2026_31431_af_alg_deny
systemd seccomp:```bash systemctl show | grep RestrictAddressFamilies
#### 6. 分类状态判定
cfDr 将每台主机归类为以下状态之一:
| 状态 | 条件 | 所需操作 |
|--------|-----------|-----------------|
| **易受攻击 - 模块已加载** | 内核 >= 4.10,模块存在且已加载 | **立即处理** - 可主动利用 |
| **易受攻击 - 模块存在** | 内核 >= 4.10,模块存在但未加载 | **高优先级** - 可加载并利用 |
| **已缓解 - 模块被列入黑名单** | 检测到黑名单 | **低优先级** - 监控,应用额外防护层 |
| **已防护 - 纵深防御** | 黑名单 + SELinux/seccomp/eBPF | **无需处理** - 完全防护 |
| **不易受攻击 - 内核过旧** | 内核 < 4.10 | **无需处理** - 早于漏洞出现时间 |
| **不易受攻击 - 无模块** | 内核中无 algif_aead 模块 | **无需处理** - 模块不可用 |
### 评估输出
每台主机将获得:
1. **控制台输出**:简短的单行状态
2. **详细文件**:`/root/cve-2026-31431-assessment-<hostname>.txt`
3. **JSON 报告**:`/tmp/cve-2026-31431-<hostname>.json`
简短输出示例:```
webserver1.example.com: VULNERABLE - Module exists and can be loaded
dbserver2.example.com: PROTECTED - Defense-in-depth (Module Blacklist + SELinux)
appserver3.example.com: NOT VULNERABLE - Module not available
cfDr 是一个现代的 Ansible 角色,包含多个 playbook 入口点:``` cfDr/ ├── roles/ │ └── cve_2026_31431/ # Main role │ ├── tasks/ │ │ ├── main.yml # Role orchestration │ │ ├── assessment.yml # Vulnerability detection │ │ ├── remediation_module_blacklist.yml │ │ ├── remediation_selinux.yml │ │ ├── remediation_seccomp.yml │ │ ├── remediation_ebpf.yml │ │ ├── reporting.yml # Status reporting │ │ └── inventory_update.yml # Inventory generation │ ├── templates/ # Config file templates │ ├── defaults/ # Default variables │ └── handlers/ # Service restarts, etc. ├── quickstart.yml # Simplest usage ├── sample_playbook.yml # Multiple examples └── cve_2026_31431_playbook.yml # Full-featured playbook
### 执行流程
#### 评估模式(默认)```
1. Pre-flight checks
↓
2. Gather system facts
↓
3. Detect kernel version
↓
4. Check module availability
↓
5. Check current load status
↓
6. Check existing mitigations
↓
7. Determine vulnerability status
↓
8. Flag vulnerable hosts
↓
9. Generate reports
↓
10. Create summary
↓
11. [Optional] Generate inventory
apply_remediation=true)```1-8. [Same as Assessment Mode] ↓ 9. Apply Module Blacklist (if flag 1) • Unload module if loaded • Create blacklist config • Update initramfs/initrd • Verify blacklist works ↓ 10. Apply SELinux Policy (if flag 2) • Install policy packages • Compile policy module • Install policy • Verify policy active ↓ 11. Apply systemd seccomp (if flag 4) • Create drop-in files • Reload systemd • Restart services • Verify filters active ↓ 12. Apply eBPF LSM (if flag 8) • Compile eBPF program • Load into kernel • Verify program attached ↓ 13. Re-assess protection status ↓ 14. Generate reports ↓ 15. Create summary
### 修复详情
#### 模块黑名单(标志 1)
**功能说明**:
1. 如果 `algif_aead` 模块当前已加载,则将其卸载(`rmmod algif_aead`)
2. 创建 `/etc/modprobe.d/blacklist-algif_aead-cve-2026-31431.conf`: ```
blacklist algif_aead
install algif_aead /bin/true
update-initramfs -udracut -fmodprobe 加载防护:即时生效,无需重启 持久性:在重启和内核更新后仍然有效