文档中心>容器服务>动态与公告>公告>安全漏洞修复说明>CVE-2026-43284 和 CVE-2026-43500 漏洞修复说明

CVE-2026-43284 和 CVE-2026-43500 漏洞修复说明

最近更新时间:2026-05-11 20:43:58

我的收藏

背景

本次涉及两个 Linux 内核本地提权漏洞,均属于「Dirty Frag」页缓存篡改(Page Cache Corruption)漏洞类。攻击者在满足相应条件后,可通过零拷贝路径中的解密操作就地篡改只读文件的内存内容,从而实现本地提权。两条漏洞链在内核中彼此独立,需分别处置。
CVE-2026-43284:问题位于 Linux 内核 xfrm 子系统的 esp4 / esp6 模块(IPsec ESP 协议)。MSG_SPLICE_PAGES 可将 pipe 页直接附加到 skb,而 IPv4/IPv6 datagram append 路径未设置 SKBFL_SHARED_FRAG 标志,导致 ESP 输入路径在共享页缓存上执行原地 AES-GCM 解密,直接篡改目标文件内存。漏洞代码路径位于 authenc/authencesn AEAD 模板内,CONFIG_CRYPTO_AUTHENC=n 时代码路径不存在,节点天然免疫
CVE-2026-43500:问题位于 Linux 内核 rxrpc.ko 模块(AFS 分布式文件系统协议)。攻击者通过 add_key 系统调用注册会话密钥,使 RxRPC 数据包解密路径以页缓存页同时作为输入和输出缓冲区,将可控的 8 字节数据就地覆写至只读文件内存。漏洞代码路径位于 rxkad(Kerberos 安全机制)内,CONFIG_RXKAD=n 时代码路径不存在,节点天然免疫

影响范围

CVE-2026-43284(xfrm esp4/esp6)

受影响版本:

Linux 内核:CONFIG_CRYPTO_AUTHENC 已启用(=m=y)、且尚未应用 CVE-2026-43284 修复补丁的版本。
TKE 节点:运行上述受影响内核版本的普通节点原生节点超级节点
注册节点:操作系统由用户自行控制,需用户自行评估内核版本及风险。
说明:
若内核编译时 CONFIG_CRYPTO_AUTHENC=n,则漏洞代码路径不存在,节点天然免疫,无需任何操作。可通过以下命令确认:
grep CONFIG_CRYPTO_AUTHENC /boot/config-$(uname -r)

攻击条件:

CVE-2026-43284 的攻击条件较为严格,攻击者需同时满足以下两个条件:
1. 具备本地普通用户权限或容器内代码执行权限;
2. 具备创建用户命名空间的权限unshare(CLONE_NEWUSER),部分发行版安全策略可能已限制此操作)。
该漏洞不可远程直接利用

CVE-2026-43500(rxrpc)

受影响版本:

Linux 内核:CONFIG_AF_RXRPC 已编译(=m=y CONFIG_RXKAD=y、并尚未应用 CVE-2026-43500 修复补丁的版本。
TKE 节点:运行上述受影响内核版本的普通节点原生节点超级节点
注册节点:操作系统由用户自行控制,需用户自行评估内核版本及风险。
说明:
CONFIG_RXKAD 在 TencentOS 内核配置中默认未启用,原生节点、超级节点天然不受影响,无需操作。普通节点与您使用的操作系统有关,请通过以下命令确认:
grep CONFIG_RXKAD /boot/config-$(uname -r)
# 若输出 "# CONFIG_RXKAD is not set" 或无输出,则天然免疫

攻击条件:

CVE-2026-43500 的攻击条件相对宽松,攻击者仅需具备本地普通用户权限或容器内代码执行权限,无需用户命名空间权限,相比 CVE-2026-43284 更容易被利用。
该漏洞不可远程直接利用

影响自查

说明:
容器用户请联系主机运维管理人员,在主机上执行以下检查。

针对 CVE-2026-43284(xfrm-ESP):

# 查看 esp4/esp6 是否已加载(有输出则当前存在风险,需执行缓解措施)
lsmod | grep -E '^esp4|^esp6'

# 若未加载,进一步确认是否可能被自动加载(编译选项)
cat /boot/config-$(uname -r) | grep -w CONFIG_CRYPTO_AUTHENC
cat /boot/config-$(uname -r) | grep -w CONFIG_INET_ESP
cat /boot/config-$(uname -r) | grep -w CONFIG_INET6_ESP
# 若以上选项均为 is not set,则天然免疫,无需操作
检查结果
结论
lsmod 能看到 esp4esp6
当前已暴露,需立即执行缓解措施
lsmod 无输出,且编译选项为 is not set
天然免疫,无需操作
lsmod 无输出,但编译选项为 =m
当前未加载,建议执行缓解以防被自动加载

针对 CVE-2026-43500(RxRPC):

# 查看 rxrpc 是否已加载(有输出则当前存在风险,需执行缓解措施)
lsmod | grep '^rxrpc'

# 若未加载,进一步确认是否可能被自动加载(编译选项)
cat /boot/config-$(uname -r) | grep -w CONFIG_RXKAD
# 若输出 "# CONFIG_RXKAD is not set" 或无输出,则天然免疫,无需操作
检查结果
结论
lsmod 能看到 rxrpc
当前已暴露,需立即执行缓解措施
lsmod 无输出,且 CONFIG_RXKADis not set
天然免疫,无需操作(TencentOS 默认)
lsmod 无输出,但 CONFIG_RXKAD=y
当前未加载,建议执行缓解以防被自动加载

修复建议

一、彻底修复(推荐)

不同节点类型的根治方案不同:
普通节点的操作系统由 CVM 镜像提供。请关注 CVM 公共镜像更新记录,在包含 CVE-2026-43284 / CVE-2026-43500 修复补丁的镜像版本发布后
新建节点默认使用修复版本,天然不受此漏洞影响。
存量节点可通过置换节点完成根治:先对节点执行驱逐(drain)将业务 Pod 迁移至其他节点,再将旧节点移出集群,最后新建节点加入集群(新节点默认使用修复版本镜像)。
原生节点的操作系统由 TKE 统一管控。请关注 TKE 后续公告更新,在 TKE 发布包含修复补丁的节点镜像后
新建节点默认使用修复版本,天然不受此漏洞影响。
存量节点可通过置换节点完成根治:先对节点执行驱逐(drain)将业务 Pod 迁移至其他节点,再将旧节点移出集群,最后新建节点加入集群(新节点默认使用修复版本镜像)。
超级节点的底层节点资源由 TKE 统一管控。请关注 TKE 后续公告更新,在 TKE 发布修复后
新建 Pod 默认运行在修复版本的节点上,天然不受此漏洞影响。
存量 Pod 可通过重建 Pod(删除后由控制器重新调度)完成根治。

二、临时缓解(内核升级前)

临时缓解不能替代内核升级,请尽快完成彻底修复。
两个 CVE 的缓解方案相互独立,需分别部署。临时缓解通过 DaemonSet 写入 /etc/modprobe.d 禁用配置并卸载模块,该 DaemonSet 须使用高权限(hostPID/hostNetwork/privileged),属于节点级高危变更,必须先 Canary 后全量
注意:
CVE-2026-31431 部署的 algif_aead 黑名单对本次两个漏洞完全无效,需单独处置。

CVE-2026-43284 缓解(禁用 esp4 / esp6)

注意:
禁用 esp4/esp6 将导致节点上所有依赖 IPsec ESP 的流量失效(包括 IPsec VPN、加密隧道等),执行前请确认节点及业务是否依赖此功能。
DaemonSet 在执行前会自动检查 CONFIG_CRYPTO_AUTHENC:若为 n,直接输出 NOT_AFFECTED 进入待机,无任何配置变更;若已启用,对 esp4/esp6 先尝试卸载,卸载成功后写入禁用配置。模块正在被业务使用时卸载失败不写入配置,避免重启后业务不可用。
配置文件路径:/etc/modprobe.d/block-cve-2026-43284.conf
步骤1:单节点预检
uname -r
# 检查漏洞前提
grep CONFIG_CRYPTO_AUTHENC /boot/config-$(uname -r)
# 检查 esp4/esp6 加载状态
lsmod | grep -E '^esp4|^esp6' || echo "esp4/esp6 not loaded"
# 确认是否有业务依赖 IPsec ESP
ip xfrm state list
ip xfrm policy list
检查结果
结论
CONFIG_CRYPTO_AUTHENC is not set
天然免疫,无需操作
CONFIG_CRYPTO_AUTHENC=m/y 且 esp4/esp6 未加载
下发禁用配置即可
CONFIG_CRYPTO_AUTHENC=m/y 且 esp4/esp6 已加载
需先确认业务无 IPsec ESP 依赖,再执行卸载+配置(卸载失败则不落盘)
esp4/esp6 为 built-in(=y
modprobe 规则无效,需 kpatch 或重启到修复内核
也可直接以 root 用户在单节点上手动执行(无需 DaemonSet):
# 若模块未加载,直接写入禁用配置
lsmod | grep -E '^esp4|^esp6' || \\
sh -c "printf 'install esp4 /bin/false\\ninstall esp6 /bin/false\\n' > /etc/modprobe.d/block-cve-2026-43284.conf"

# 若模块已加载,先卸载成功后再写入(卸载失败则不写,避免下次重启业务不可用)
rmmod esp4 2>/dev/null && printf 'install esp4 /bin/false\\n' >> /etc/modprobe.d/block-cve-2026-43284.conf || echo "esp4 in use, skip"
rmmod esp6 2>/dev/null && printf 'install esp6 /bin/false\\n' >> /etc/modprobe.d/block-cve-2026-43284.conf || echo "esp6 in use, skip"

# 验证(期望 cat 有内容,grep 无回显)
cat /etc/modprobe.d/block-cve-2026-43284.conf
cat /proc/modules | grep esp4
cat /proc/modules | grep esp6
步骤2:选择 1~3 台低风险节点打标签,部署 Canary DaemonSet:
kubectl label node <node-1> cve-43284-fix=canary
kubectl label node <node-2> cve-43284-fix=canary
保存为 disable-esp-canary.yaml 并部署:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: disable-esp
namespace: kube-system
labels:
app: disable-esp
spec:
selector:
matchLabels:
app: disable-esp
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
app: disable-esp
spec:
hostPID: true
hostNetwork: true
tolerations:
- operator: Exists
nodeSelector:
cve-43284-fix: canary
restartPolicy: Always
containers:
- name: disable-esp
image: busybox:1.36
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: host-root
mountPath: /host
readOnly: false
command:
- /bin/sh
- -c
- |
set -eu

CONF_DIR="/host/etc/modprobe.d"
CONF="/host/etc/modprobe.d/block-cve-2026-43284.conf"
STATE_DIR="/host/var/lib/cve-2026-43284"
STATE_FILE="${STATE_DIR}/pre-fix-state.json"

mkdir -p "${CONF_DIR}"
mkdir -p "${STATE_DIR}"

echo "[INFO] node=$(hostname) kernel=$(uname -r)"

# ========== 检查漏洞触发前提:CONFIG_CRYPTO_AUTHENC ==========
KVER=$(chroot /host uname -r 2>/dev/null || uname -r)
AUTHENC_STATUS="?"
if [ -r "/host/boot/config-${KVER}" ]; then
if grep -q "^CONFIG_CRYPTO_AUTHENC=m\\|^CONFIG_CRYPTO_AUTHENC=y" "/host/boot/config-${KVER}" 2>/dev/null; then
AUTHENC_STATUS="enabled"
elif grep -q "^# CONFIG_CRYPTO_AUTHENC is not set" "/host/boot/config-${KVER}" 2>/dev/null; then
AUTHENC_STATUS="n"
fi
fi

if [ "${AUTHENC_STATUS}" = "n" ]; then
echo "[INFO] CONFIG_CRYPTO_AUTHENC=n: vulnerability code path absent. NOT_AFFECTED."
echo "[POSTCHECK][OK] NOT_AFFECTED - no config deployed"
while true; do sleep 3600; done
fi
echo "[INFO] CONFIG_CRYPTO_AUTHENC=${AUTHENC_STATUS}: proceeding with esp4/esp6 check."

# ========== 记录禁用前状态(幂等,仅首次写入)==========
if [ ! -f "${STATE_FILE}" ]; then
ESP4_LOADED="false"
ESP6_LOADED="false"
grep -q "^esp4 " /proc/modules 2>/dev/null && ESP4_LOADED="true"
grep -q "^esp6 " /proc/modules 2>/dev/null && ESP6_LOADED="true"
cat > "${STATE_FILE}" <<SNAP
{
"timestamp": "$(date -u '+%Y-%m-%dT%H:%M:%SZ')",
"hostname": "$(hostname)",
"kernel": "${KVER}",
"esp4_was_loaded": ${ESP4_LOADED},
"esp6_was_loaded": ${ESP6_LOADED},
"cve": "CVE-2026-43284"
}
SNAP
chmod 0644 "${STATE_FILE}"
echo "[STATE] pre-fix state saved to ${STATE_FILE}"
fi

# ========== 下发禁用配置 + 卸载模块 ==========
for MODULE in esp4 esp6; do
if grep -q "^${MODULE} " /proc/modules 2>/dev/null; then
echo "[WARN] ${MODULE} is currently LOADED. Attempting unload first..."
UNLOAD_OK=0
if chroot /host /sbin/modprobe -r "${MODULE}" 2>/tmp/modprobe-r.err; then
echo "[FIX] modprobe -r ${MODULE} succeeded"
UNLOAD_OK=1
else
cat /tmp/modprobe-r.err || true
if chroot /host /sbin/rmmod "${MODULE}" 2>/tmp/rmmod.err; then
echo "[FIX] rmmod ${MODULE} succeeded"
UNLOAD_OK=1
else
cat /tmp/rmmod.err || true
fi
fi
if [ "${UNLOAD_OK}" = "1" ]; then
echo "[FIX] writing blacklist config for ${MODULE}"
printf 'blacklist %s\\ninstall %s /bin/false\\n' "${MODULE}" "${MODULE}" >> "${CONF}"
echo "[FIX] config written for ${MODULE}"
else
echo "[WARN] ${MODULE} is in use, skip - config NOT written to avoid breaking business on next load"
fi
else
echo "[FIX] ${MODULE} not loaded, writing blacklist config"
printf 'blacklist %s\\ninstall %s /bin/false\\n' "${MODULE}" "${MODULE}" >> "${CONF}"
echo "[FIX] config written for ${MODULE}"
fi
done
chmod 0644 "${CONF}" 2>/dev/null || true
sync

# ========== Postcheck ==========
echo "[POSTCHECK] config:"
cat "${CONF}"
RESULT="OK"
for MODULE in esp4 esp6; do
if grep -q "^${MODULE} " /proc/modules 2>/dev/null; then
echo "[POSTCHECK][WARN] ${MODULE} is still loaded and config was NOT written - module is in use by business"
RESULT="WARN"
else
echo "[POSTCHECK][OK] ${MODULE} is not loaded"
fi
done
echo "[POSTCHECK][${RESULT}] CVE-2026-43284 mitigation complete"

while true; do sleep 3600; done
volumes:
- name: host-root
hostPath:
path: /
type: Directory
kubectl apply -f disable-esp-canary.yaml

# 观察(成功标准:日志出现 [POSTCHECK][OK] 或 NOT_AFFECTED)
kubectl -n kube-system get pod -l app=disable-esp -o wide
kubectl -n kube-system logs -l app=disable-esp --tail=50
步骤3:Canary 通过后,删除 YAML 中的 nodeSelector 段,全量 apply:
kubectl apply -f disable-esp.yaml
kubectl -n kube-system rollout status ds/disable-esp --timeout=10m

CVE-2026-43500 缓解(禁用 rxrpc)

DaemonSet 在执行前会自动检查 CONFIG_RXKAD:若为 n(TencentOS 默认),直接输出 NOT_AFFECTED 进入待机,无任何配置变更;若已启用,对 rxrpc 先尝试卸载,卸载成功后写入禁用配置。
配置文件路径:/etc/modprobe.d/block-cve-2026-43500.conf
步骤1:单节点预检
uname -r
# 检查漏洞前提(TencentOS 默认未启用,预期输出 "not set" 或无输出)
grep CONFIG_RXKAD /boot/config-$(uname -r) || echo "CONFIG_RXKAD not set - NOT AFFECTED"
# 检查 rxrpc 加载状态
lsmod | grep '^rxrpc' || echo "rxrpc not loaded"
检查结果
结论
CONFIG_RXKAD is not set
天然免疫,无需操作
CONFIG_RXKAD=y 且 rxrpc 未加载
下发禁用配置即可
CONFIG_RXKAD=y 且 rxrpc 已加载
需确认业务无 AFS/Kerberos AFS 依赖,再执行卸载+配置(卸载失败则不落盘)
rxrpc 为 built-in(=y
modprobe 规则无效,需 kpatch 或重启到修复内核
也可直接以 root 用户在单节点上手动执行(无需 DaemonSet):
# 若模块未加载,直接写入禁用配置
lsmod | grep '^rxrpc' || \\
printf 'install rxrpc /bin/false\\n' > /etc/modprobe.d/block-cve-2026-43500.conf

# 若模块已加载,先卸载成功后再写入(卸载失败则不写,避免下次重启业务不可用)
rmmod rxrpc 2>/dev/null && printf 'install rxrpc /bin/false\\n' > /etc/modprobe.d/block-cve-2026-43500.conf || echo "rxrpc in use, skip"

# 验证(期望 cat 有内容,grep 无回显)
cat /etc/modprobe.d/block-cve-2026-43500.conf
cat /proc/modules | grep rxrpc
步骤2:选择 1~3 台低风险节点打标签,部署 Canary DaemonSet:
kubectl label node <node-1> cve-43500-fix=canary
kubectl label node <node-2> cve-43500-fix=canary
保存为 disable-rxrpc-canary.yaml 并部署:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: disable-rxrpc
namespace: kube-system
labels:
app: disable-rxrpc
spec:
selector:
matchLabels:
app: disable-rxrpc
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
app: disable-rxrpc
spec:
hostPID: true
hostNetwork: true
tolerations:
- operator: Exists
nodeSelector:
cve-43500-fix: canary
restartPolicy: Always
containers:
- name: disable-rxrpc
image: busybox:1.36
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: host-root
mountPath: /host
readOnly: false
command:
- /bin/sh
- -c
- |
set -eu

MODULE="rxrpc"
CONF="/host/etc/modprobe.d/block-cve-2026-43500.conf"
STATE_DIR="/host/var/lib/cve-2026-43500"
STATE_FILE="${STATE_DIR}/pre-fix-state.json"

mkdir -p /host/etc/modprobe.d
mkdir -p "${STATE_DIR}"

echo "[INFO] node=$(hostname) kernel=$(uname -r)"

# ========== 检查漏洞触发前提:CONFIG_RXKAD ==========
KVER=$(chroot /host uname -r 2>/dev/null || uname -r)
RXKAD_STATUS="?"
if [ -r "/host/boot/config-${KVER}" ]; then
if grep -q "^CONFIG_RXKAD=y" "/host/boot/config-${KVER}" 2>/dev/null; then
RXKAD_STATUS="y"
elif grep -q "^# CONFIG_RXKAD is not set" "/host/boot/config-${KVER}" 2>/dev/null; then
RXKAD_STATUS="n"
else
RXKAD_STATUS="n"
fi
fi

if [ "${RXKAD_STATUS}" = "n" ]; then
echo "[INFO] CONFIG_RXKAD=n: vulnerability code path absent. NOT_AFFECTED."
echo "[POSTCHECK][OK] NOT_AFFECTED - no config deployed"
while true; do sleep 3600; done
fi
echo "[INFO] CONFIG_RXKAD=${RXKAD_STATUS}: proceeding with rxrpc check."

# ========== 记录禁用前状态(幂等,仅首次写入)==========
if [ ! -f "${STATE_FILE}" ]; then
MODULE_LOADED="false"
MODULE_LINE=""
if grep -q "^${MODULE} " /proc/modules 2>/dev/null; then
MODULE_LOADED="true"
MODULE_LINE=$(grep "^${MODULE} " /proc/modules)
fi
cat > "${STATE_FILE}" <<SNAP
{
"timestamp": "$(date -u '+%Y-%m-%dT%H:%M:%SZ')",
"hostname": "$(hostname)",
"kernel": "${KVER}",
"module_was_loaded": ${MODULE_LOADED},
"module_proc_line": "${MODULE_LINE}",
"cve": "CVE-2026-43500"
}
SNAP
chmod 0644 "${STATE_FILE}"
echo "[STATE] pre-fix state saved to ${STATE_FILE}"
fi

# ========== 下发禁用配置 + 卸载模块 ==========
if grep -q "^${MODULE} " /proc/modules 2>/dev/null; then
echo "[WARN] ${MODULE} is currently LOADED. Attempting unload first..."
UNLOAD_OK=0
if chroot /host /sbin/modprobe -r "${MODULE}" 2>/tmp/modprobe-r.err; then
echo "[FIX] modprobe -r ${MODULE} succeeded"
UNLOAD_OK=1
else
cat /tmp/modprobe-r.err || true
if chroot /host /sbin/rmmod "${MODULE}" 2>/tmp/rmmod.err; then
echo "[FIX] rmmod ${MODULE} succeeded"
UNLOAD_OK=1
else
cat /tmp/rmmod.err || true
fi
fi
if [ "${UNLOAD_OK}" = "1" ]; then
echo "[FIX] writing blacklist config for ${MODULE}"
printf '# CVE-2026-43500 mitigation - DO NOT REMOVE\\nblacklist %s\\ninstall %s /bin/false\\n' "${MODULE}" "${MODULE}" > "${CONF}"
chmod 0644 "${CONF}"
sync
echo "[FIX] config written to ${CONF}"
else
echo "[WARN] ${MODULE} is in use, skip - config NOT written to avoid breaking business on next load"
fi
else
echo "[FIX] ${MODULE} not loaded, writing blacklist config"
printf '# CVE-2026-43500 mitigation - DO NOT REMOVE\\nblacklist %s\\ninstall %s /bin/false\\n' "${MODULE}" "${MODULE}" > "${CONF}"
chmod 0644 "${CONF}"
sync
echo "[FIX] config written to ${CONF}"
fi

# ========== Postcheck ==========
if [ -f "${CONF}" ]; then
echo "[POSTCHECK] config:"
cat "${CONF}"
fi
if grep -q "^${MODULE} " /proc/modules 2>/dev/null; then
echo "[POSTCHECK][WARN] ${MODULE} is still loaded and config was NOT written - module is in use by business"
else
echo "[POSTCHECK][OK] ${MODULE} is not loaded"
fi

while true; do sleep 3600; done
volumes:
- name: host-root
hostPath:
path: /
type: Directory
kubectl apply -f disable-rxrpc-canary.yaml

# 观察(成功标准:日志出现 [POSTCHECK][OK] 或 NOT_AFFECTED)
kubectl -n kube-system get pod -l app=disable-rxrpc -o wide
kubectl -n kube-system logs -l app=disable-rxrpc --tail=50
步骤3:Canary 通过后,删除 YAML 中的 nodeSelector 段,全量 apply:
kubectl apply -f disable-rxrpc.yaml
kubectl -n kube-system rollout status ds/disable-rxrpc --timeout=10m

修复后检查

# DaemonSet 状态(期望 DESIRED = READY)
kubectl -n kube-system get ds disable-esp disable-rxrpc

# 日志检查(成功标准:日志出现 [POSTCHECK][OK] 或 NOT_AFFECTED)
kubectl -n kube-system logs -l app=disable-esp --tail=100 | grep -E "POSTCHECK|ERROR|WARN"
kubectl -n kube-system logs -l app=disable-rxrpc --tail=100 | grep -E "POSTCHECK|ERROR|WARN"

# 节点与业务状态
kubectl get nodes
kubectl get events -A --sort-by='.lastTimestamp' | tail -100
重点确认无新增:NodeNotReady / FailedMount / FailedCreatePodSandBox,以及 CNI/DNS 连通性、IPsec 相关业务(针对 CVE-2026-43284)是否正常。

异常处理与回滚

若出现业务异常,立即停止扩大范围:
kubectl -n kube-system delete ds disable-esp
kubectl -n kube-system delete ds disable-rxrpc
注意:
删除 DaemonSet 只会删除 Pod,不会自动清理宿主机上的配置文件,需通过以下回滚 DaemonSet 主动清理。
保存为 rollback-esp.yaml 并执行(CVE-2026-43284):
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: rollback-esp
namespace: kube-system
labels:
app: rollback-esp
spec:
selector:
matchLabels:
app: rollback-esp
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
app: rollback-esp
spec:
hostPID: true
hostNetwork: true
tolerations:
- operator: Exists
restartPolicy: Always
containers:
- name: rollback-esp
image: busybox:1.36
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: host-root
mountPath: /host
readOnly: false
command:
- /bin/sh
- -c
- |
CONF="/host/etc/modprobe.d/block-cve-2026-43284.conf"

echo "[ROLLBACK] node=$(hostname) start rollback for CVE-2026-43284"

if [ -f "${CONF}" ]; then
echo "[ROLLBACK] removing ${CONF}"
rm -f "${CONF}"
sync
else
echo "[ROLLBACK] config not found, skip"
fi

for MODULE in esp4 esp6; do
echo "[ROLLBACK] try to reload ${MODULE} (optional)"
if grep -q "^${MODULE} " /proc/modules 2>/dev/null; then
echo "[ROLLBACK] ${MODULE} already loaded"
else
chroot /host /sbin/modprobe "${MODULE}" 2>/tmp/modprobe.err \\
&& echo "[ROLLBACK] modprobe ${MODULE} succeeded" \\
|| { echo "[WARN] modprobe ${MODULE} failed (module may not be needed)"; cat /tmp/modprobe.err || true; }

fi
done

if [ -f "${CONF}" ]; then
echo "[POSTCHECK][FAIL] config still exists"
else
echo "[POSTCHECK][OK] config removed"
fi

while true; do sleep 3600; done
volumes:
- name: host-root
hostPath:
path: /
type: Directory
保存为 rollback-rxrpc.yaml 并执行(CVE-2026-43500):
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: rollback-rxrpc
namespace: kube-system
labels:
app: rollback-rxrpc
spec:
selector:
matchLabels:
app: rollback-rxrpc
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
app: rollback-rxrpc
spec:
hostPID: true
hostNetwork: true
tolerations:
- operator: Exists
restartPolicy: Always
containers:
- name: rollback-rxrpc
image: busybox:1.36
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: host-root
mountPath: /host
readOnly: false
command:
- /bin/sh
- -c
- |
MODULE="rxrpc"
CONF="/host/etc/modprobe.d/block-cve-2026-43500.conf"

echo "[ROLLBACK] node=$(hostname) start rollback for CVE-2026-43500"

if [ -f "${CONF}" ]; then
echo "[ROLLBACK] removing ${CONF}"
rm -f "${CONF}"
sync
else
echo "[ROLLBACK] config not found, skip"
fi

echo "[ROLLBACK] try to reload ${MODULE} (optional)"
if grep -q "^${MODULE} " /proc/modules 2>/dev/null; then
echo "[ROLLBACK] ${MODULE} already loaded"
else
chroot /host /sbin/modprobe "${MODULE}" 2>/tmp/modprobe.err \\
&& echo "[ROLLBACK] modprobe ${MODULE} succeeded" \\
|| { echo "[WARN] modprobe ${MODULE} failed; module may be unavailable or not required"; cat /tmp/modprobe.err || true; }

fi

if [ -f "${CONF}" ]; then
echo "[POSTCHECK][FAIL] config still exists"
else
echo "[POSTCHECK][OK] config removed"
fi

while true; do sleep 3600; done
volumes:
- name: host-root
hostPath:
path: /
type: Directory
# 执行回滚
kubectl apply -f rollback-esp.yaml
kubectl apply -f rollback-rxrpc.yaml

# 观察(成功标准:日志出现 [POSTCHECK][OK] config removed)
kubectl -n kube-system logs -l app=rollback-esp --tail=50
kubectl -n kube-system logs -l app=rollback-rxrpc --tail=50

# 成功后清理
kubectl -n kube-system delete ds rollback-esp rollback-rxrpc
常见异常场景:
现象
原因
处置方式
日志出现 [WARN] … is in use, skip
模块正在被业务使用,配置未落盘
确认业务停用后重跑 DaemonSet;或置换节点;或等待内核升级根治
日志出现 [POSTCHECK][WARN] … still loaded and config was NOT written
模块卸载失败,配置未落盘
同上
日志出现 [INFO] … vulnerability code path absent. NOT_AFFECTED 但实际受影响
Kconfig 检测读取失败
手动执行单节点命令,确认编译选项后手动下发
DaemonSet Pod 无法启动
PSP/OPA/Gatekeeper 阻止特权容器
临时为 kube-system 命名空间放开特权容器限制,修复后恢复
节点出现 NodeNotReady
操作影响节点稳定性
立即停止扩大范围,先 drain 关键业务节点,再诊断
CVE-2026-43284 缓解后 IPsec 流量中断
esp4/esp6 被卸载
立即执行回滚;若业务依赖 IPsec,需等待内核升级根治

常见问题

TKE 节点默认有风险吗?

CVE-2026-43284:TKE 节点默认网络方案不依赖 IPsec ESP,esp4/esp6 通常未加载,整体风险较低。建议通过 lsmod | grep -E '^esp4|^esp6' 确认。
CVE-2026-43500:原生节点、超级节点使用 TencentOS 内核,CONFIG_RXKAD 默认未启用,天然不受影响。普通节点取决于所使用的操作系统,建议通过 grep CONFIG_RXKAD /boot/config-$(uname -r) 确认。

两个 CVE 可以同时处置吗?

可以,两个 DaemonSet 相互独立,可并行部署。建议分别 Canary 验证后再各自全量。

CVE-2026-43284 中,禁用 esp4/esp6 是否会影响普通网络通信?

普通 TCP/UDP、HTTPS、SSH 不依赖 esp4/esp6,不受影响。仅 IPsec ESP 模式的加密隧道会失效。

CVE-2026-43500 中,禁用 rxrpc 是否会影响业务?

rxrpc 模块仅用于 AFS 分布式文件系统协议,普通业务通常不依赖此模块。TencentOS 上 CONFIG_RXKAD 默认未启用,大多数节点 DaemonSet 会直接输出 NOT_AFFECTED

已部署 CVE-2026-31431 的缓解 DaemonSet,是否覆盖本次漏洞?

不覆盖。 CVE-2026-31431 的 algif_aead 黑名单与本次两个漏洞完全无关,需单独部署。

DaemonSet 临时修复后是否还需要升级内核?

需要。DaemonSet 仅是临时缓解,根治需升级到含 CVE-2026-43284 / CVE-2026-43500 修复补丁的内核或节点镜像。

集群开了 PSP 怎么办?

若开启了 k8sPSPPrivilegedContainerk8sPSPHostNamespacek8sPSPHostNetworkingPorts 且未豁免 kube-system,需先临时放开 kube-system 命名空间,修复完成后恢复。