Linux 内核 crypto algif_aead 子系统中的本地权限提升漏洞。
CVE-2026-31431,代号“Copy Fail”,是 Linux 内核 authencesn 加密模板(algif_aead)中的一个逻辑缺陷。它允许非特权本地用户对任何可读文件的页缓存执行受控的 4 字节写入,从而可被利用来修改 setuid 二进制文件并获得 root 权限。
a664bf3d603d| 日期 | 事件 |
|---|---|
| 2026-03-23 | 报告给 Linux 内核安全团队 |
| 2026-04-01 | 补丁提交至主线 |
| 2026-04-22 | 分配 CVE 编号 |
| 2026-04-29 | 公开披露 |
该漏洞利用需要两个条件:一个 AF_ALG 套接字(所有 seccomp 配置文件中默认允许)和一个 setuid 二进制文件(例如 /usr/bin/su)。关键的缓解措施是 allowPrivilegeEscalation: false——这会通过 prctl(PR_SET_NO_NEW_PRIVS, 1) 设置 Linux 内核的 no_new_privs 标志,导致内核在 execve() 时忽略 setuid/setgid 位。由于该漏洞利用依赖于执行修改后的 setuid 二进制文件,因此这会阻止最终的提权步骤。
这并非 OpenShift 特有功能——它在原生 Kubernetes(Pod 安全标准 Restricted)、Docker(--security-opt no-new-privileges)和 Podman 上的工作方式相同。OpenShift 只是通过 restricted-v2 SCC 默认强制执行,而其他平台需要显式配置。
RHEL 8 和 RHEL 9 附带的内核包含易受攻击的代码。具有 shell 访问权限的非特权本地用户可以利用此漏洞获取 root 权限。请立即修补。
yum updateinfo list cves CVE-2026-31431
yum update kernel
OpenShift 运行在 RHCOS 上,其附带的内核存在漏洞。实际影响取决于工作负载的安全上下文约束(SCC)。
使用默认 restricted-v2 SCC 的标准工作负载不可被利用,因为强制启用了 allowPrivilegeEscalation: false。
使用提升 SCC(anyuid、privileged 或允许 allowPrivilegeEscalation: true 的自定义 SCC)运行的 Pod 存在漏洞。这通常包括:
anyuid 的遗留应用程序直接节点访问(例如通过 oc debug node/)始终存在漏洞——这是标准的本地权限提升,不涉及容器隔离。
提供了一个测试 Pod,用于检查您的集群中是否满足漏洞利用的先决条件。它不会尝试利用该漏洞——仅检查:
AF_ALG 套接字?(内核攻击面是否可达)no_new_privs?(阻止 setuid 提权)oc apply -f test-pod.yaml
oc logs cve-2026-31431-check
oc delete -f test-pod.yaml
使用 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 套接字被 seccomp 阻止 |
1 | 部分暴露——AF_ALG 可达,但 setuid 被 no_new_privs 阻止 |
2 | 存在漏洞——所有漏洞利用先决条件均已满足 |
在具有 restricted-v2 SCC 的标准 OpenShift 集群上,您应该看到退出码 1(部分暴露):可以创建 AF_ALG 套接字(RuntimeDefault seccomp 不会阻止它),但 no_new_privs 阻止了 setuid 提权步骤。已发布的 PoC 将无法生效,但内核级漏洞仍然可达——建议进行修补。
这是唯一完整的修复方案。更新所有节点上的内核并重启。
对于 OpenShift,请更新到包含该修复的 RHCOS 版本,并执行滚动节点重启。
如果 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)
如果内核模块是内置的,那么在补丁发布前,针对容器的唯一缓解措施是通过自定义 seccomp 配置文件阻止 socket(AF_ALG, ...) 系统调用。
创建 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"
}
]
}
]
}
注意: 应用 MachineConfig 会触发滚动节点重启。
securityContext:
seccompProfile:
type: Localhost
localhostProfile: deny-af-alg.json
为保护所有容器而无需修改 Pod 规格,可通过 MachineConfig 覆盖 CRI-O 默认 seccomp 配置文件(/etc/crio/seccomp.json),将 AF_ALG 过滤规则添加到现有配置文件中。
识别以提升权限运行的 Pod:
# 查找未使用 restricted-v2 的 Pod
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 套接字对大多数工作负载的影响可忽略不计。以下内容不受影响:
只有显式配置为使用 OpenSSL afalg 引擎的应用程序才会受到影响。
| 环境 | allowPrivilegeEscalation | 容器 Root | 宿主机 Root | 风险 |
|---|
| RHEL 8 / RHEL 9(本地用户) | 不适用 | 不适用 | 是 | 严重 |
OpenShift 节点(shell 访问,例如 oc debug node/) | 不适用 | 不适用 | 是 | 严重 |
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 | 是 | 否 | 高 |