slauger/CVE-2026-31431

GitHub: slauger/CVE-2026-31431

针对 Linux 内核 algif_aead 本地提权漏洞 CVE-2026-31431 的深度分析与缓解方案,提供检测工具和 RHEL/OpenShift 环境下的防御部署指南。

Stars: 0 | Forks: 0

# CVE-2026-31431 — "Copy Fail" Linux 内核加密子系统 `algif_aead` 中的本地权限提升漏洞。 ## 概述 CVE-2026-31431,被称为“Copy Fail”,是 Linux 内核 `authencesn` 加密模板(`algif_aead`)中的一个逻辑缺陷。它允许无特权的本地用户对任何可读文件的页缓存进行受控的 4 字节写入,这可以被用来修改 setuid 二进制文件并获取 root 权限。 - **CVSS:** 7.8(高) - **受影响版本:** 自 2017 年以来发布的所有主流 Linux 内核 - **漏洞利用:** 一个 732 字节的 Python 脚本 —— 无竞态条件,无特定内核偏移量 - **修复:** 主线提交 `a664bf3d603d` ## 时间线 | 日期 | 事件 | |---|---| | 2026-03-23 | 报告给 Linux 内核安全团队 | | 2026-04-01 | 补丁提交至主线 | | 2026-04-22 | 分配 CVE 编号 | | 2026-04-29 | 公开披露 | ## 影响矩阵 | 环境 | `allowPrivilegeEscalation` | 容器 Root | 宿主机 Root | 风险 | |---|---|---|---|---| | **RHEL 8 / RHEL 9**(本地用户) | n/a | n/a | **是** | **严重** | | **OpenShift 节点**(Shell 访问权限,例如 `oc debug node/`) | n/a | n/a | **是** | **严重** | | **OpenShift Pod** — `restricted-v2` SCC(默认) | `false` | 否 | 否 | **低** | | **OpenShift Pod** — `anyuid` SCC | `true` | **是** | 否(命名空间隔离) | **高** | | **OpenShift Pod** — `privileged` SCC | `true` | **是** | **是**(无隔离) | **严重** | | **OpenShift Pod** — 自定义 SCC | 视情况而定 | 视情况而定 | 视情况而定 | **需审计** | | **Kubernetes Pod** — PSS Restricted | `false` | 否 | 否 | **低** | | **Kubernetes Pod** — PSS Baseline / 无策略 | `true`(默认) | **是** | 否 | **高** | | **Docker / Podman** — `--security-opt no-new-privileges` | `false` | 否 | 否 | **低** | | **Docker / Podman** — 默认 | `true` | **是** | 否 | **高** | 该漏洞利用需要两个条件:一个 `AF_ALG` socket(在所有 seccomp 配置文件中默认允许)和一个 setuid 二进制文件(例如 `/usr/bin/su`)。关键的缓解措施是 `allowPrivilegeEscalation: false` —— 这会通过 `prctl(PR_SET_NO_NEW_PRIVS, 1)` 设置 Linux 内核的 [`no_new_privs`](https://docs.kernel.org/userspace-api/no_new_privs.html) 标志,从而使内核在执行 `execve()` 时忽略 setuid/setgid 位。由于该漏洞利用依赖于执行被修改的 setuid 二进制文件,因此这会阻止最终的提权步骤。 这**不是 OpenShift 特有的功能** —— 它在原生 Kubernetes(Pod 安全标准 Restricted)、Docker(`--security-opt no-new-privileges`)和 Podman 上的工作原理完全相同。OpenShift 只是通过 `restricted-v2` SCC 默认强制执行了该配置,而其他平台则需要显式配置。 ### RHEL 8 / RHEL 9 RHEL 8 和 RHEL 9 附带的内核包含此易受攻击的代码。拥有 shell 访问权限的无特权本地用户可以利用此漏洞获取 root 权限。**请立即打补丁。** ``` yum updateinfo list cves CVE-2026-31431 yum update kernel ``` ### OpenShift (4.x) OpenShift 运行在 RHCOS 之上,而 RHCOS 附带了带有此漏洞的内核。实际的影响取决于工作负载的安全上下文约束(SCC)。 使用默认 `restricted-v2` SCC 的标准工作负载**不可被利用**,因为强制执行了 `allowPrivilegeEscalation: false`。 使用提权 SCC(`anyuid`、`privileged` 或允许 `allowPrivilegeEscalation: true` 的自定义 SCC)运行的 Pod **存在漏洞**。这通常包括: - CI/CD 构建 Pod(Jenkins 代理,带有自定义 SCC 的 Tekton) - 需要 `anyuid` 的旧版应用程序 - 基础设施 Pod(监控、日志、存储) 直接访问节点(例如通过 `oc debug node/`)总是存在风险的 —— 这是标准的本地权限提升,不涉及容器隔离。 ## 测试 我们提供了一个测试 Pod,用于检查您的集群中是否满足漏洞利用的先决条件。它**不会**尝试利用该漏洞 —— 它仅检查: 1. 能否创建 `AF_ALG` socket?(内核攻击面可达) 2. 是否设置了 `no_new_privs`?(阻止 setuid 提权) 3. 容器镜像中是否存在 setuid 二进制文件? 4. 底层节点的内核版本 ### 用法(Pod) ``` oc apply -f test-pod.yaml oc logs cve-2026-31431-check oc delete -f test-pod.yaml ``` ### 用法(Deployment) 使用 Deployment 变体可以通过扩展副本或使用 Pod 反亲和性来跨多个节点进行测试: ``` oc apply -f test-deployment.yaml oc logs -l app=cve-2026-31431-check oc delete -f test-deployment.yaml ``` ### 退出码 | 代码 | 含义 | |---|---| | `0` | 不可利用 — AF_ALG socket 被 seccomp 阻止 | | `1` | 部分暴露 — AF_ALG 可达,但 setuid 被 `no_new_privs` 阻止 | | `2` | 易受攻击 — 满足所有漏洞利用先决条件 | ### 默认 OpenShift 上的预期结果 在带有 `restricted-v2` SCC 的标准 OpenShift 集群上,您应该会看到退出码 `1`(部分暴露):可以创建 AF_ALG socket(RuntimeDefault seccomp 未阻止它),但 `no_new_privs` 阻止了 setuid 提权步骤。已发布的 PoC 将不起作用,但内核级别的漏洞依然可达 —— 建议打补丁。 ## 缓解措施 ### 1. 给内核打补丁(P0) 这是唯一彻底的修复方法。更新所有节点上的内核并重启。 对于 OpenShift,更新至包含此修复的 RHCOS 版本并执行节点滚动重启。 ### 2. 禁用 algif_aead 模块(临时解决方法) 如果 `algif_aead` 被编译为**可加载模块**(`CONFIG_CRYPTO_USER_API_AEAD=m`): ``` echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf rmmod algif_aead 2>/dev/null || true ``` **如果 `algif_aead` 是内置的(`=y`),则此方法无效**,RHCOS 就是这种情况。请使用以下命令检查: ``` modinfo algif_aead 2>&1 | grep builtin grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r) ``` ### 3. 通过 seccomp 阻止 AF_ALG(OpenShift) 如果内核模块是内置的,那么对于容器而言,在打补丁前唯一的缓解措施就是通过自定义 seccomp 配置文件阻止 `socket(AF_ALG, ...)` 系统调用。 #### 通过 MachineConfig 部署 seccomp 配置文件 创建 MachineConfig 以将配置文件放置在所有节点上(对控制平面节点需使用 `role: master` 重复此操作): ``` apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 99-worker-seccomp-deny-af-alg spec: config: ignition: version: 3.2.0 storage: files: - path: /var/lib/kubelet/seccomp/deny-af-alg.json mode: 0644 contents: source: data:application/json;charset=utf-8;base64,ewogICJkZWZhdWx0QWN0aW9uIjogIlNDTVBfQUNUX0FMTE9XIiwKICAic3lzY2FsbHMiOiBbCiAgICB7CiAgICAgICJuYW1lcyI6IFsic29ja2V0Il0sCiAgICAgICJhY3Rpb24iOiAiU0NNUF9BQ1RfRVJSTk8iLAogICAgICAiYXJncyI6IFsKICAgICAgICB7CiAgICAgICAgICAiaW5kZXgiOiAwLAogICAgICAgICAgInZhbHVlIjogMzgsCiAgICAgICAgICAib3AiOiAiU0NNUF9DTVBfRVEiCiAgICAgICAgfQogICAgICBdCiAgICB9CiAgXQp9 ``` Base64 内容解码为: ``` { "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "names": ["socket"], "action": "SCMP_ACT_ERRNO", "args": [ { "index": 0, "value": 38, "op": "SCMP_CMP_EQ" } ] } ] } ``` #### 在 Pod 规范中引用该配置文件 ``` securityContext: seccompProfile: type: Localhost localhostProfile: deny-af-alg.json ``` #### 集群范围的替代方案 为了在不修改 Pod 规范的情况下保护所有容器,可以通过 MachineConfig 向现有的默认配置文件(`/etc/crio/seccomp.json`)添加 AF_ALG 过滤规则,从而覆盖 CRI-O 的默认 seccomp 配置文件。 ### 4. 审计您的 SCC 识别以提升的权限运行的 Pod: ``` # 查找未使用 restricted-v2 的 pods oc get pods -A -o json | jq -r ' .items[] | select(.metadata.annotations["openshift.io/scc"] != "restricted-v2") | "\(.metadata.namespace)/\(.metadata.name) → \(.metadata.annotations["openshift.io/scc"])" ' ``` 这些 Pod 是能够运行完整漏洞利用链的地方。请优先为运行这些工作负载的节点打补丁或实施 seccomp 缓解措施。 ## 禁用 AF_ALG 的影响 阻止 AF_ALG socket 对大多数工作负载的**影响微乎其微**。以下内容**不受影响**: - dm-crypt / LUKS - kTLS - IPsec - OpenSSL / GnuTLS(标准构建) 只有显式配置为使用 OpenSSL `afalg` 引擎的应用程序才会受到影响。 ## 参考 - [Copy Fail — 项目主页](https://copy.fail) - [Red Hat CVE-2026-31431](https://access.redhat.com/security/cve/cve-2026-31431) - [NVD — CVE-2026-31431](https://nvd.nist.gov/vuln/detail/CVE-2026-31431) - [RuntimeDefault 并未阻止 AF_ALG (juliet.sh)](https://juliet.sh/blog/we-tested-copy-fail-in-kubernetes-pss-restricted-runtime-default-af-alg) - [Xint — Copy Fail 漏洞分析文章](https://xint.io/blog/copy-fail-linux-distributions) - [The Register — Linux 加密代码缺陷](https://www.theregister.com/2026/04/30/linux_cryptographic_code_flaw/)
标签:algif_aead, Copy Fail, CVE-2026-31431, JSONLines, Linux Kernel, Linux内核漏洞, OpenShift, PoC, RHEL, setuid提权, Web截图, Web报告查看器, 子域名枚举, 子域名突变, 容器安全, 容器隔离, 应用安全, 暴力破解, 本地提权, 漏洞分析, 漏洞缓解, 系统安全, 网络安全, 路径探测, 逆向工具, 隐私保护, 零信任, 页缓存篡改