deckhouse/d8-copy-fail-mitigation
GitHub: deckhouse/d8-copy-fail-mitigation
针对 Deckhouse Kubernetes Platform 的 CVE-2026-31431 内核漏洞提供节点级模块禁用与运行时攻击检测的自动化缓解方案。
Stars: 0 | Forks: 0
# Deckhouse Kubernetes Platform 的 CVE-2026-31431 缓解措施
**语言:** English | [Русский](README_RU.md)
## 关于该漏洞
CVE-2026-31431 是 Linux 内核 `algif_aead` 模块中的一个漏洞,该模块通过 `AF_ALG` 套接字族将内核 crypto API 暴露给用户空间。AEAD (Authenticated Encryption with Associated Data) 接口中的一个缺陷允许本地无特权用户通过提交特制的 scatter-gather 列表在内核中触发内存损坏,从而导致本地权限提升或拒绝服务。
只要进程(包括无特权容器)被允许调用 `socket(AF_ALG, SOCK_SEQPACKET, 0)` 并将其绑定到 `aead` 类型的算法,就可以触达该漏洞面。未丢弃默认 seccomp 配置文件或未限制 `socket` 系统调用族的容器运行时,会使集群节点暴露在此攻击之下。
在通过操作系统包更新推出上游内核补丁之前,建议的缓解措施是**在每个集群节点上禁用 `algif_aead` 内核模块**,并在运行时检测利用该漏洞的企图。
## 本仓库中的文件
本仓库包含在 Deckhouse 管理的集群上缓解 CVE-2026-31431 所需的一切内容:
| 文件 | 用途 |
|------|---------|
| `ngc-cve-2026-31431.yaml` | `NodeGroupConfiguration`,用于探测易受攻击的接口、阻止加载 `algif_aead`、卸载当前已加载的模块,并验证修复是否有效。适用于所有 bundle 和节点组。 |
| `far-cve-2026-31431.yaml` | `FalcoAuditRules`,用于检测通过绑定到 AEAD 算法的 `AF_ALG` 套接字在运行时利用该漏洞的企图。**仅在 Deckhouse 企业版 (EE) 和认证安全版 (CSE) 中提供**,因为 `runtime-audit-engine` 模块随这些版本一同发布。 |
### `ngc-cve-2026-31431.yaml` — 节点侧缓解措施
`NodeGroupConfiguration` 通过 `bashible` 在每个节点上运行,并执行四个步骤:
1. **探测 (Probe)** — 打开一个 `AF_ALG` 套接字并将其绑定到 `aead/gcm(aes)`,以确定节点上是否可以访问该易受攻击的接口。
2. **阻止 (Block)** — 写入包含 `install` 指令的 `/etc/modprobe.d/disable-algif.conf`,以防止 `algif_aead`(以及总括模块 `af_alg`)被手动或作为依赖项再次加载。
3. **卸载 (Unload)** — 如果当前已加载该模块,则运行 `rmmod algif_aead`。如果模块是内建到内核中的,则跳过此步(在这种情况下,仅适用阻止列表 + 运行时检测)。
4. **验证 (Verify)** — 重新运行探测,如果 AEAD 接口仍然可以访问,则使 bashible 步骤失败(非零退出),以便 bashible 状态将该节点显示为未缓解。
幂等性:在已缓解的节点上重新运行此配置是空操作。
### `far-cve-2026-31431.yaml` — 运行时检测
`FalcoAuditRules` 资源添加了一条自定义的 Falco 规则,每当进程打开 `AF_ALG` 套接字并将其绑定到 `aead` 算法(此攻击独有的系统调用模式)时,该规则就会触发 `Critical` 事件。当进程尝试通过 `modprobe`/`insmod` 加载 `algif_aead` 模块时,它还会发出 `Warning` 事件,因为在已缓解的节点上这绝不应该成功,这是利用漏洞企图或操作员配置错误的强烈信号。
## 应用
```
kubectl apply -f ngc-cve-2026-31431.yaml
# 仅限 EE / CSE:
kubectl apply -f far-cve-2026-31431.yaml
```
### 等待收敛
通过观察每个 `NodeGroup` 的状态,等待配置在每个节点上应用完成。Bashible 会将每个步骤的成功状态报告回 `NodeGroup`,Deckhouse 会将其汇总到您可以轮询的两个字段中:
- `.status.upToDate` — 最新一次 bashible 运行使用当前配置成功的节点数量。当每个组的 `upToDate == nodes` 时,即达到收敛。
- `.status.conditionSummary.ready` — 一旦组处于健康状态,即为 `"True"`;如果任何节点的 bashible 步骤失败(这正是 `NodeGroupConfiguration` 中的验证步骤在无法应用修复的节点上执行的操作),则变为 `"False"`,并在 `.status.conditionSummary.statusMessage` 中提供可读的原因。
跨所有组的一次性视图:
```
kubectl get nodegroups
```
```
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
```
一个可编写脚本的检查,仅当每个组都已收敛时才以退出码 0 退出:
```
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "still converging" || echo "all node groups converged"
```
如果某个 `NodeGroup` 卡在 `conditionSummary.ready == "False"` 状态,请读取 `.status.conditionSummary.statusMessage` — 它会显示失败的 bashible 步骤,包括来自此缓解措施的验证步骤。
## 回滚
在每个节点上安装了包含官方修复的上游内核包之后,请移除这两个资源:
```
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
```
移除 `NodeGroupConfiguration` **不会**自动删除 `/etc/modprobe.d/disable-algif.conf` — 如果您希望该模块能够再次加载,请手动清理它;如果集群上的任何工作负载都不使用内核 crypto API,则可以将阻止列表保留在原位。
## 手动验证
集群范围:
```
kubectl get nodegroups
```
`UPTODATE` 应等于 `NODES`,并且每个组的状态消息列应为空。
在节点上(通过 SSH 或 `kubectl debug node/` + `chroot /host`):
```
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
```
预期结果:
- `cat` 显示四行 `install` / `blacklist` 内容。
- `lsmod` 输出为空。
- `modprobe -n -v` 打印 `install /bin/false`。
- `modprobe` 返回 `exit=1`。
标签:0day挖掘, AEAD加密, AF_ALG, algif_aead, CVE-2026-31431, Deckhouse, Falco, GitHub Advanced Security, Hpfeeds, Linux内核, NodeGroupConfiguration, Pandas, Seccomp, Web截图, Web报告查看器, 内存破坏, 内核安全, 协议分析, 子域名突变, 安全加固, 安全补丁, 容器安全, 拒绝服务, 敏感词过滤, 本地提权, 权限提升, 漏洞缓解, 系统调用