本文介绍 CVE-2026-31431 Linux 内核本地提权漏洞的风险及缓解方案。该方案通过禁用 AF_ALG socket 创建能力阻断漏洞利用路径,适用于业务不依赖 AF_ALG socket 的场景。
部署本方案后,依赖
AF_ALGsocket 的业务进程将无法创建相关套接字,可能导致业务不可用。如果无法 100% 确认业务是否依赖AF_ALGsocket,禁止部署本方案。本方案存在一定稳定性风险,必须按照灰度策略逐步上线,严禁直接全量部署至生产环境。
灰度部署期间,请密切关注相关业务的稳定性、错误日志及性能指标,发现异常请及时回滚。
漏洞背景
CVE-2026-31431 是 Linux 内核 algif_aead 模块中存在的高危本地权限提升漏洞。
攻击者通过构造特定的 AF_ALG socket 调用序列,并结合 splice() 系统调用绕过常规权限检查,实现对任意文件页缓存(Page Cache)的 4 字节越权写入。
攻击者可利用该能力篡改 /usr/bin/su 等 setuid 程序的内存映像,在不修改磁盘文件内容的情况下,实现从普通用户到 root 权限的本地提权。
缓解方案局限性
本缓解方案会导致依赖 AF_ALG socket 的加解密功能不可用,可能对依赖加解密功能的业务产生影响。实施前请务必评估业务是否存在对 AF_ALG socket 的依赖。如果无法确认业务是否依赖 AF_ALG socket 功能,请勿采用本缓解方案。
本节提供一些参考方法,用于检查业务是否依赖 AF_ALG socket 使用内核加密算法接口。可以通过 auditd 或 eBPF 等方式检查机器上是否存在 AF_ALG socket 创建行为,以下为基于 auditd 的示例:
# 首先确保 auditd 服务已启用
systemctl start auditd
# 如系统已配置其他 audit 规则,请先备份并评估影响
# 下发对 AF_ALG socket 的审计规则
auditctl -a always,exit -F arch=b64 -S socket -F a0=38 -k afalg_socket
# 运行一段时间后,查看审计结果
ausearch -k afalg_socket -ts recent -i
# 预期结果:如果统计期间有进程创建过 AF_ALG socket,将会输出审计记录
# 结束后删除对 AF_ALG socket 的审计规则
auditctl -d always,exit -F arch=b64 -S socket -F a0=38 -k afalg_socket以上排查方法仅供参考,不能完全排除业务对 AF_ALG 的依赖关系。仍建议结合业务源代码、依赖列表以及实际运行情况进行完整核查。
部署方法
在执行以下部署步骤前,请确认业务不依赖 AF_ALG socket 功能,并能够接受 AF_ALG 相关功能受限带来的影响。
步骤一:检查依赖条件
部署本方案前需满足以下条件:
内核已启用 livepatch 支持。
已安装当前运行内核版本对应的 kernel-devel 包。
# 1. 确认 kernel-devel 包已安装
# 检查当前运行内核版本对应的 kernel-devel 包是否已安装
test -d "/lib/modules/$(uname -r)/build" && echo "kernel-devel OK" || echo "请安装 kernel-devel-$(uname -r)"
# 如果需要手动安装 kernel-devel 包
sudo yum install -y kernel-devel-$(uname -r)
# 2. 确认内核已启用 livepatch 支持
test -d /sys/kernel/livepatch && echo "livepatch sysfs OK"步骤二:根据操作系统版本安装对应 RPM 包
# 1. 下载对应操作系统版本的 RPM 包(RPM 包下载地址采用白名单授权机制,请通过钉钉群179525012975获取下载链接)
# 2. 根据操作系统版本安装对应的 RPM 包,例如,对于 Alibaba Cloud Linux 3:
sudo yum install disable-af-alg-livepatch-1.0.0-1.al8.noarch.rpm更换运行中的内核版本后,需要重新安装对应 RPM 包才能生效。
步骤三:验证缓解方案是否生效
方法一:检查 livepatch 状态
适用于 Alibaba Cloud Linux 3 与 Alibaba Cloud Linux 4:
# 查看 livepatch 生效状态
kpatch list
# 预期输出:Loaded patch modules: 列表中包含 disable_af_alg [enabled] 条目视为生效方法二:验证 AF_ALG socket 是否被拦截
执行以下 Python 脚本:
python3 - <<'PY'
import socket, errno
try:
s = socket.socket(38, socket.SOCK_SEQPACKET, 0) # 38 = AF_ALG
print("AF_ALG socket create: SUCCESS (缓解方案未生效)")
s.close()
except OSError as e:
if e.errno == errno.EAFNOSUPPORT:
print(f"AF_ALG socket create: FAILED(缓解方案生效)")
else:
print(f"AF_ALG socket create: FAILED(返回非预期错误),errno={e.errno}, msg={e.strerror}")
PY回滚方法
如果部署后出现业务异常,可通过以下方式卸载缓解方案:
sudo yum remove disable-af-alg-livepatch卸载完成后,可再次执行验证脚本,确认对 AF_ALG socket 的拦截已被移除。