针对 CVE-2026-31431(“Copy Fail”),我们通过组合三种绕过策略,展示了主流安全产品的系统性弱点:io_uring 异步 I/O 路径、进程拆分(fork + SCM_RIGHTS) 以及套接字复用。通过实证测试,我们证明这些技术可以规避几乎所有基于系统调用的检测工具。
io_uring 通过共享内存环形缓冲区提交请求,绕过了传统的系统调用入口点。这意味着:
iou-wrk-XXXXX)在内核内部执行操作,不会触发 audit_syscall_entry()socket(AF_ALG) 的 Seccomp 策略可通过 IORING_OP_SOCKET 绕过——seccomp 仅在系统调用入口处检查,而 io_uring 操作不经过该入口通过使用 fork + SCM_RIGHTS(Unix 域套接字 fd 传递),套接字创建和 splice 操作可以放置在不同的进程中:
same_field(audit.pid) 关联被破坏——套接字 PID ≠ splice PID,CRITICAL 规则不会触发原始 PoC 每次迭代创建一个新套接字(产生 40+ 次 socket(AF_ALG) 调用)。套接字复用仅创建一个监听套接字;循环调用 accept(),不会产生新的套接字事件。基于 count >= N 的规则被完全击败。
io_uring 路径 + splice + /etc/passwd + authenc 算法 + SCM_RIGHTS 拆分 + 套接字复用
在此组合下:基于系统调用的工具完全失明,进程级关联被破坏,计数阈值失效。只有 kprobe 汇聚点检测才能捕获此组合。
__sock_create(family=38) 是所有路径(系统调用和 io_uring)的不可绕过的汇聚点——AF_ALG 是 Linux 内核中唯一的用户空间加密 API。无论攻击者如何变换手法,都必须创建 AF_ALG 套接字。在 LSM 级别监控此函数可实现 100% 召回率,且不受任何变体影响。
Falco 原生的 modern_ebpf 驱动仅捕获系统调用路径。必须使用 krsi 插件——它利用 fexit 跟踪 io_socket() 和 __sys_socket() 内核函数退出,以覆盖 AF_ALG 套接字创建的 io_uring 路径。推荐的备用规则:
- rule: AF_ALG Socket Created
condition: >
(evt.type = socket and evt.args contains AF_ALG) or
(evt.type = krsi_socket and krsi.domain = 38)
output: >
AF_ALG socket created (source=%evt.type domain=%evt.arg.domain
krsi_domain=%krsi.domain proc=%proc.name pid=%proc.pid)
priority: WARNING
tags: [cve-2026-31431, crypto, container_escape]
推荐规则的检测方法:同时覆盖 socket 事件(系统调用路径,使用 evt.args contains AF_ALG 字符串匹配以绕过 ENUMFLAGS32 类型限制)和 krsi_socket 事件(io_uring 路径,使用 krsi.domain = 38 整数比较)。不依赖计数阈值(已被套接字复用击败),不依赖 PID 关联(已被多进程拆分击败)。
注意:社区 ThreatBear 规则的三层防御均可被绕过——ENUMFLAGS32 类型不匹配(evt.arg[0]=38 始终为 false)、套接字复用击败计数阈值(count=1 < 40)、多进程拆分破坏 PID 关联。参见规则绕过分析。
Wazuh 完全依赖 auditd 的系统调用审计事件。io_uring 操作不经过系统调用入口,因此 auditd 产生零事件,所有 7 条 Wazuh 规则均失效。Elastic Security Agent 同样如此——依赖系统调用入口的产品在结构上对 io_uring 路径失明。参见Wazuh 局限性分析。
bypass_demo/ 目录包含检测绕过方法的理论描述。实际 PoC 代码仅供内部使用,不公开发布。
| 文档 | 内容 |
|---|---|
| VULNERABILITY.md | 根本原因——三项内核变更的叠加、9 步攻击链、页缓存写入特性 |
| EXPLOIT_VARIANTS.md |
| 文档 | 内容 |
|---|---|
| defense/HARDENING.md | 3 层防御模型:内核配置 → seccomp → 用户命名空间;Docker 29.4.2 安全性分析 |
| 产品 | 检测层 | 传统系统调用 | io_uring 路径 | 多进程拆分 | 套接字复用 | 评估 |
|---|
| Tetragon (kprobe) | 内核函数 | ✅ | ✅ | ✅ | ✅ | 唯一全链路覆盖 |
| Falco + krsi 插件 | fexit/fentry | ✅ | ✅ | ✅ | ✅ | 需要 krsi 支持 io_uring;仅入口 |
| Falco (modern_ebpf) | 系统调用 tracepoint | ✅ | ❌ | ✅ | ✅ | io_uring 完全不可见 |
| auditd / Wazuh | 系统调用审计 | ✅ | ❌ | ❌ PID 被破坏 | ⚠️ | io_uring 盲区 + PID 关联被破坏 |
| Elastic Security Agent | 系统调用 | ✅ | ❌ | ⚠️ | ⚠️ | 与 Wazuh 相同;依赖系统调用 = 盲区 |
| 6 个利用变体维度——I/O 路径 × 数据提交 × 目标文件 × AEAD 算法 × 进程拆分 × 套接字复用 |
| DETECTION_THEORY.md | 检测理论——汇聚点与发散点、4 层检测架构、多信号时间关联 |
| 文档 | 内容 |
|---|
| detection/tetragon.md | 推荐——Tetragon kprobe,5 个探针覆盖传统 + io_uring,唯一全链路检测 |
| detection/falco.md | Falco 0.40.0 + krsi 0.1.0 配置指南、krsi 内部原理、故障排查 |
| detection/wazuh.md | Wazuh + auditd 三大局限性:io_uring 盲区、PID 关联失效、页缓存不可见 |
| detection/rule_bypass.md | ThreatBear 规则绕过原理、推荐规则防绕过的实证验证 |