algif_aead module, which is the AEAD socket interface (AF_ALG) of the kernel's userspace crypto API. This vulnerability can affect the kernel page cache via AF_ALG + splice(). An attacker who already has the ability to execute user-space code on a node may further escalate privileges to root on that node or cause cross-container impact (processes on the same host share the kernel page cache). The Linux kernel community describes the fix for this vulnerability as: crypto: algif_aead - Revert to operating out-of-place.CONFIG_CRYPTO_USER_API_AEAD=m or =y compilation configuration and have not yet applied the CVE-2026-31431 fix patch.CONFIG_CRYPTO_USER_API_AEAD=n (the module is not compiled), it is inherently immune and requires no action.Cluster Type | Risk Description |
Multi-tenant cluster | Untrusted users can submit Pods, posing a high risk. |
CI/CD Runner cluster | Build tasks typically execute untrusted code, posing a high risk. |
Online service co-located cluster | If a single business container is compromised, it may affect the entire node. |
Cluster with exec/debug permissions enabled | Attackers can more easily gain the ability to execute code within containers. |
Cluster running high-privilege Pods | Lateral movement risk is greater after a vulnerability is exploited. |
GPU / MaaS inference cluster | Typically hosts third-party models, code, plugins, or user tasks, requiring critical evaluation. |
algif_aead by default, resulting in a relatively low overall risk. The temporary mitigation works by using a DaemonSet to write a blocklist to /etc/modprobe.d and unload the module. This DaemonSet requires high privileges (hostPID/hostNetwork/privileged) and constitutes a high-risk, node-level change. It must be deployed using a canary-first, then full-scale rollout approach.uname -rlsmod | grep '^algif_aead' || echo "algif_aead not loaded"modinfo algif_aead 2>/dev/null || echo "algif_aead module not found or built-in"test -f /etc/modprobe.d/blacklist-algif_aead.conf && \\cat /etc/modprobe.d/blacklist-algif_aead.conf || \\echo "blacklist config not found"
Inspection result | Conclusions |
algif_aead is visible via lsmod | The current runtime state poses a risk and requires uninstallation. |
The configuration file does not exist. | It may still be automatically loaded after a restart and requires fixing. |
Only blacklist algif_aead | It is recommended to enhance it to install algif_aead /bin/false. |
The module information cannot be found via modinfo, but the feature still exists. | It may be built-in or due to a path discrepancy, and requires further confirmation. |
The module is in use and cannot be unloaded. | It requires evaluation based on business needs and may take effect after a node restart. |
kubectl label node <node-1> algif-aead-fix=canarykubectl label node <node-2> algif-aead-fix=canary
disable-algif-aead-canary.yaml and deploy the Canary DaemonSet:apiVersion: apps/v1kind: DaemonSetmetadata:name: disable-algif-aeadnamespace: kube-systemlabels:app: disable-algif-aeadspec:selector:matchLabels:app: disable-algif-aeadupdateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1template:metadata:labels:app: disable-algif-aeadspec:hostPID: truehostNetwork: truetolerations:- operator: ExistsnodeSelector:algif-aead-fix: canaryrestartPolicy: Alwayscontainers:- name: disable-algif-aeadimage: busybox:1.36imagePullPolicy: IfNotPresentsecurityContext:privileged: truevolumeMounts:- name: host-rootmountPath: /hostreadOnly: falsecommand:- /bin/sh- -c- |set -euMODULE="algif_aead"CONF="/host/etc/modprobe.d/blacklist-algif_aead.conf"STATE_DIR="/host/var/lib/cve-2026-3143"STATE_FILE="${STATE_DIR}/pre-fix-state.json"ROLLBACK_DONE="${STATE_DIR}/rollback-done"echo "[INFO] node=$(hostname) start precheck"mkdir -p /host/etc/modprobe.dmkdir -p "${STATE_DIR}"# ========== Clean up the previous rollback markers (supports repeated disable/rollback operations) ==========if [ -f "${ROLLBACK_DONE}" ]; thenecho "[FIX] clearing previous rollback marker"rm -f "${ROLLBACK_DONE}"fi# ========== Record the pre-disable state (for rollback) ==========MODULE_LOADED="false"MODULE_LINE=""if grep -q "^${MODULE} " /proc/modules; thenMODULE_LOADED="true"MODULE_LINE=$(grep "^${MODULE} " /proc/modules)fiCONF_EXISTED="false"CONF_BACKUP=""if [ -f "${CONF}" ]; thenCONF_EXISTED="true"CONF_BACKUP=$(cat "${CONF}" 2>/dev/null || echo "")fi# Write the state file only during the first execution to avoid overwriting the original state during repeated runs.if [ ! -f "${STATE_FILE}" ]; thencat > "${STATE_FILE}" <<SNAP{"timestamp": "$(date -u '+%Y-%m-%dT%H:%M:%SZ')","hostname": "$(hostname)","kernel": "$(uname -r)","module_was_loaded": ${MODULE_LOADED},"module_proc_line": "${MODULE_LINE}","blacklist_conf_existed": ${CONF_EXISTED},"blacklist_conf_backup": "${CONF_BACKUP}","cve": "CVE-2026-3143"}SNAPchmod 0644 "${STATE_FILE}"echo "[STATE] pre-fix state saved to ${STATE_FILE}"elseecho "[STATE] state file already exists, skip (idempotent)"fiecho "[STATE] recorded state:"cat "${STATE_FILE}"# ========== Precheck ==========if [ "${MODULE_LOADED}" = "true" ]; thenecho "[PRECHECK] ${MODULE} is loaded: ${MODULE_LINE}"elseecho "[PRECHECK] ${MODULE} is not loaded"fiif [ "${CONF_EXISTED}" = "true" ]; thenecho "[PRECHECK] existing config:"echo "${CONF_BACKUP}"elseecho "[PRECHECK] config not found"fi# ========== Fix ==========echo "[FIX] writing blacklist config"cat > "${CONF}" <<EOF# Managed by TKE DaemonSet disable-algif-aead# CVE: CVE-2026-3143blacklist algif_aeadinstall algif_aead /bin/falseEOFchmod 0644 "${CONF}"syncecho "[FIX] try to unload ${MODULE}"if grep -q "^${MODULE} " /proc/modules; thenif chroot /host /sbin/modprobe -r "${MODULE}" 2>/tmp/modprobe-r.err; thenecho "[FIX] modprobe -r ${MODULE} succeeded"elseecho "[WARN] modprobe -r failed:"cat /tmp/modprobe-r.err || trueif chroot /host /sbin/rmmod "${MODULE}" 2>/tmp/rmmod.err; thenecho "[FIX] rmmod ${MODULE} succeeded"elseecho "[ERROR] failed to unload ${MODULE}:"cat /tmp/rmmod.err || truefifielseecho "[FIX] ${MODULE} is not loaded, skip unload"fi# ========== Postcheck ==========echo "[POSTCHECK] config:"cat "${CONF}"if grep -q "^${MODULE} " /proc/modules; thenecho "[POSTCHECK][FAIL] ${MODULE} is still loaded"elseecho "[POSTCHECK][OK] ${MODULE} is not loaded"fiwhile true; dosleep 3600donevolumes:- name: host-roothostPath:path: /type: Directory
kubectl apply -f disable-algif-aead-canary.yaml# Observation (Success criterion: The log shows [POSTCHECK][OK] algif_aead is not loaded)kubectl -n kube-system get pod -l app=disable-algif-aead -o widekubectl -n kube-system logs -l app=disable-algif-aead --tail=50
nodeSelector section from the YAML and apply it fully:kubectl apply -f disable-algif-aead.yamlkubectl -n kube-system rollout status ds/disable-algif-aead --timeout=10mkubectl -n kube-system get ds disable-algif-aead
# DaemonSet Status (Expected: DESIRED = READY)kubectl -n kube-system get ds disable-algif-aead# Log check (Success criterion: [POSTCHECK][OK] algif_aead is not loaded)kubectl -n kube-system logs -l app=disable-algif-aead --tail=300 | grep -E "POSTCHECK|ERROR|WARN|FAIL|OK"# Sample check of host configurationsPOD=$(kubectl -n kube-system get pod -l app=disable-algif-aead -o jsonpath='{.items[0].metadata.name}')kubectl -n kube-system exec "$POD" -- cat /host/etc/modprobe.d/blacklist-algif_aead.confkubectl -n kube-system exec "$POD" -- grep '^algif_aead ' /proc/modules || echo "not loaded - OK"# Node and Service Statuskubectl get nodeskubectl get events -A --sort-by='.lastTimestamp' | tail -100
NodeNotReady / MemoryPressure / DiskPressure / PIDPressure / NetworkUnavailable / FailedCreatePodSandBox / FailedMount, and verifying whether service-level metrics such as Pod restarts, error rates, CNI/DNS connectivity, storage mounting, and GPU scheduling (including the NVIDIA device plugin) are normal. If scenarios involve self-developed encryption components, IPsec, or dependencies on the kernel crypto API, perform additional verification.rmmod: ERROR: Module algif_aead is in use), do not forcibly terminate business processes. After confirming that the configuration file has been written, record the node as "configured but not unloaded". Restart or replace the node during off-peak business hours. If the log shows [POSTCHECK][FAIL] algif_aead is still loaded, it indicates that the configuration has been persisted but runtime unloading failed. Common causes include: the module is in use, the module is built-in, the node lacks modprobe/rmmod, or a security policy prevents unloading.k8sPSPPrivilegedContainer, k8sPSPHostNamespace, and k8sPSPHostNetworkingPorts restrictions for the kube-system namespace. Restore them after the fix is complete.kubectl describe node <node-name>kubectl get events -A --sort-by='.lastTimestamp' | tail -200# Critical Business Nodes: Drain Firstkubectl cordon <node-name>kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
kubectl -n kube-system delete ds disable-algif-aead
algif_aead, and checking business recovery status. Note that deleting the DaemonSet only deletes the Pods and does not automatically delete the configuration files on the host. You must use the following rollback DaemonSet to clean them up.rollback-algif-aead.yaml and execute:apiVersion: apps/v1kind: DaemonSetmetadata:name: rollback-algif-aeadnamespace: kube-systemlabels:app: rollback-algif-aeadspec:selector:matchLabels:app: rollback-algif-aeadupdateStrategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1template:metadata:labels:app: rollback-algif-aeadspec:hostPID: truehostNetwork: truetolerations:- operator: ExistsrestartPolicy: Alwayscontainers:- name: rollback-algif-aeadimage: busybox:1.36imagePullPolicy: IfNotPresentsecurityContext:privileged: truevolumeMounts:- name: host-rootmountPath: /hostreadOnly: falsecommand:- /bin/sh- -c- |set -euMODULE="algif_aead"CONF="/host/etc/modprobe.d/blacklist-algif_aead.conf"echo "[ROLLBACK] node=$(hostname) start rollback"if [ -f "${CONF}" ]; thenecho "[ROLLBACK] remove ${CONF}"rm -f "${CONF}"syncelseecho "[ROLLBACK] config not found, skip"fiecho "[ROLLBACK] try to reload ${MODULE}, optional"if grep -q "^${MODULE} " /proc/modules; thenecho "[ROLLBACK] ${MODULE} already loaded"elseif chroot /host /sbin/modprobe "${MODULE}" 2>/tmp/modprobe.err; thenecho "[ROLLBACK] modprobe ${MODULE} succeeded"elseecho "[WARN] modprobe ${MODULE} failed; module may be unavailable or not required"cat /tmp/modprobe.err || truefifiif [ -f "${CONF}" ]; thenecho "[POSTCHECK][FAIL] config still exists"elseecho "[POSTCHECK][OK] config removed"fiif grep -q "^${MODULE} " /proc/modules; thenecho "[POSTCHECK] ${MODULE} is loaded"elseecho "[POSTCHECK] ${MODULE} is not loaded"fiwhile true; dosleep 3600donevolumes:- name: host-roothostPath:path: /type: Directory
kubectl apply -f rollback-algif-aead.yaml# Observationkubectl -n kube-system get pod -l app=rollback-algif-aead -o widekubectl -n kube-system logs -l app=rollback-algif-aead --tail=200# Cleanup After Successkubectl -n kube-system delete ds rollback-algif-aead
algif_aead module is not enabled, resulting in a relatively low overall risk. For Register nodes, users need to perform their own assessment.algif_aead. If you have self-developed kernel encryption components or IPsec scenarios, perform a canary deployment first.install algif_aead /bin/false Instead of Just blacklist?blacklist primarily prevents automatic loading, while install algif_aead /bin/false further blocks manual modprobe. Configuring both simultaneously provides stronger security hardening./etc/modprobe.d directory and unload the kernel module. The operation cannot be completed without privileged access and a mount of the host's root directory.k8sPSPPrivilegedContainer, k8sPSPHostNamespace, and k8sPSPHostNetworkingPorts are enabled and kube-system is not exempted, you must first temporarily lift the restrictions on the kube-system namespace and restore them after the fix is completed. The super node solution is not subject to this restriction.Was this page helpful?
You can also Contact sales or Submit a Ticket for help.
Help us improve! Rate your documentation experience in 5 mins.
Feedback