【安全】如何查看 openEuler 是否加载启用了 algif_aead 内核模块 ?

如何查看 openEuler 是否加载启用了 algif_aead 内核模块 ?

在 openEuler 系统中,你可以通过以下几种命令来确认 algif_aead 内核模块是否被加载或启用。

🔍 方法一:检查已加载的模块(最常用)

使用 lsmod 命令查看当前内核中已加载的模块列表,并配合 grep 过滤查找。

lsmod | grep algif_aead
  • 如果有输出:显示类似 algif_aead 16384 0 的信息,说明模块已加载,系统存在漏洞利用面,需要立即处理。
  • 无输出:说明模块当前未加载

📜 方法二:检查模块是否内置于内核

部分 openEuler 版本可能将该模块直接编译进了内核(Built-in),这种情况下 lsmod 是查不到的,但模块功能实际上是存在的。你可以通过查看内核配置文件来确认。

grep CONFIG_CRYPTO_ALGIF_AEAD /boot/config-$(uname -r)
  • 输出 CONFIG_CRYPTO_ALGIF_AEAD=y:说明模块已编译进内核(Built-in)。
    • 注意:如果是 =y,则无法通过 rmmod 卸载,必须通过修改 GRUB 启动参数(添加 initcall_blacklist=algif_aead_init)来禁用。
  • 输出 CONFIG_CRYPTO_ALGIF_AEAD=m:说明模块是独立模块文件,可以按需加载或卸载。
  • 无输出或 is not set:说明内核未包含该功能。

📂 方法三:检查模块文件是否存在

如果你想确认系统中是否安装了该模块文件(即使当前未加载),可以使用 modprobe 查询。

modprobe -n -v algif_aead
  • 输出路径(如 insmod /lib/modules/.../algif_aead.ko.xz:说明系统中存在该模块文件,系统可能会在需要时自动加载它。
  • 报错 Module algif_aead not found:说明系统中不存在该模块文件,相对安全。

📌 总结与建议

检查结果 含义 建议操作
lsmod 有输出 高风险:模块正在运行 立即执行 sudo rmmod algif_aead 并配置禁用文件。
config 显示 =y 中风险:模块内置于内核 无法卸载,需修改 GRUB 参数禁用,或直接升级内核。
modprobe 显示路径 潜在风险:模块文件存在 建议配置 /etc/modprobe.d/ 禁止自动加载。

这意味着什么,要如何处理?

# cat /etc/openEuler-release
openEuler release 22.03 LTS

# uname -a
Linux zyy-ingress02 5.10.0-60.18.0.50.oe2203.x86_64 #1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

#  rmmod algif_aead
rmmod: ERROR: Module algif_aead is builtin.

这个报错信息 rmmod: ERROR: Module algif_aead is builtin 意味着 algif_aead 模块不是作为一个独立的可加载文件(.ko)存在的,而是被直接编译进了 Linux 内核镜像本身(即静态编译)。

在 openEuler 22.03 LTS 的某些版本中,为了性能或稳定性,部分关键模块会被设为 builtin(配置项为 y 而非 m)。

🚨 这意味着什么?

  1. 无法卸载:你不能使用 rmmod 命令把它从内存中“拔除”,因为它就是内核核心代码的一部分。
  2. 风险依然存在:虽然 lsmod 看不到它,但它的代码在内核里运行。如果攻击者触发相关调用,依然可以利用该漏洞。
  3. 必须换一种禁用方式:不能靠卸载,只能靠“屏蔽”。

🛡️ 如何处理?(两种方案)

针对 builtin 模块,你需要采用更底层的屏蔽手段。

方案 A:通过 GRUB 启动参数屏蔽(推荐,无需重新编译内核)

这是最有效的临时缓解方案。我们需要告诉内核在启动时不要初始化这个模块的功能。

操作步骤:

  1. 编辑 GRUB 配置文件
    使用编辑器打开 /etc/default/grub

    sudo vi /etc/default/grub
    
  2. 添加屏蔽参数
    找到 GRUB_CMDLINE_LINUX 这一行,在引号内的末尾添加 initcall_blacklist=algif_aead_init

    修改前示例:
    GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 ..."

    修改后示例:
    GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 ... initcall_blacklist=algif_aead_init"

  3. 重新生成 GRUB 配置
    保存退出后,执行以下命令使配置生效:

    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    
  4. 重启系统
    必须重启才能生效:

    sudo reboot
    
  5. 验证是否生效
    重启后,尝试创建一个 AF_ALG 套接字。如果屏蔽成功,应该会报错。

    # 使用 Python 快速测试
    python3 -c "import socket; s = socket.socket(38, 5, 0); print('FAIL: 漏洞仍存在')"
    
    • 如果输出 OSError: [Errno 92] Protocol not supported 或类似错误,说明屏蔽成功,漏洞已规避。
    • 如果没报错,说明屏蔽失败。

方案 B:升级内核(彻底修复)

既然模块是内置的,说明当前内核版本较老或配置较旧。升级到有官方补丁的新版内核是治本的方法。

  1. 检查可用更新
    sudo dnf list kernel --showduplicates
    
  2. 执行升级
    sudo dnf update kernel
    sudo reboot
    
    升级后的新内核通常会包含 CVE-2026-31431 的修复代码,或者允许将该模块改为可卸载模式。

📌 总结

由于你的系统是 builtin 模式:

  1. 不要再尝试 rmmod,会一直报错。
  2. 首选 方案 A(添加 initcall_blacklist 参数)来快速阻断漏洞。
  3. 最终 建议等待或执行内核升级以彻底解决问题。

如何确认 Module algif_aead is builtin ?

确认 algif_aead 模块是否为“内置(builtin)”状态,主要有以下三种方法。这些方法从“运行时状态”、“文件存在性”和“编译配置”三个维度进行验证。

方法一:使用 modinfo 命令(最直观)

modinfo 命令用于显示内核模块的详细信息。对于内置模块,它会明确提示。

执行以下命令:

modinfo algif_aead
  • 如果是内置模块
    系统会返回错误信息:

    modinfo: ERROR: Module algif_aead is builtin.
    这直接证实了该模块已编译进内核,没有独立的 .ko 文件。

  • 如果是独立模块
    系统会显示模块的详细信息,如 filename(路径)、descriptionlicense 等。


方法二:检查内核配置文件(最权威)

内核的编译配置决定了哪些功能是内置的(=y),哪些是模块化的(=m)。

执行以下命令:

grep CONFIG_CRYPTO_ALGIF_AEAD /boot/config-$(uname -r)
  • 输出 CONFIG_CRYPTO_ALGIF_AEAD=y
    确认是内置y 代表 "Yes",表示该功能被静态编译进了 vmlinuz 内核镜像中,无法卸载。

  • 输出 CONFIG_CRYPTO_ALGIF_AEAD=m
    表示它是模块。如果此时 rmmod 报错,可能是模块正被其他进程占用(Refcount > 0)。

  • 无输出或 is not set
    表示当前内核未包含该功能。


方法三:检查模块文件是否存在(辅助验证)

内置模块在内核模块目录中没有对应的实体文件。

执行以下命令:

# 尝试查找模块文件路径
modprobe -n -v algif_aead
  • 如果是内置模块
    通常会提示:modprobe: FATAL: Module algif_aead not found.
    这意味着 modprobe/lib/modules/$(uname -r)/ 目录下找不到该模块的 .ko 文件。

  • 如果是独立模块
    会输出文件的完整路径,例如:
    insmod /lib/modules/5.10.0-.../kernel/crypto/algif_aead.ko.xz

📌 总结

验证方法 命令 内置模块的特征
1. 信息查看 modinfo algif_aead 直接报错提示 is builtin
2. 配置检查 grep ... /boot/config-... 配置项值为 =y
3. 文件查找 modprobe -n -v ... 提示 not found (无实体文件)

结合你之前的报错 rmmod: ERROR: Module algif_aead is builtin方法一方法二 是最有力的确认手段。一旦确认为 =y,请务必按照之前的建议,使用 GRUB 黑名单(initcall_blacklist) 方式进行屏蔽,或者直接升级内核。

# modinfo algif_aead
name:           algif_aead
filename:       (builtin)
description:    AEAD kernel crypto API user space interface
author:         Stephan Mueller <smueller@chronox.de>
license:        GPL
file:           crypto/algif_aead

# grep CONFIG_CRYPTO_ALGIF_AEAD /boot/config-$(uname -r)
无输出

# modprobe -n -v algif_aead
无输出

根据你提供的最新命令输出,情况出现了一些反常。这表明 algif_aead 在你的系统中处于一种非常特殊的状态。

🔍 现状分析:矛盾的证据

  1. modinfo 说它是内置的
    输出 filename: (builtin) 明确告诉你,内核认为这个模块是编译在核心里的,没有独立的 .ko 文件。
  2. grep 配置文件却“无输出”
    通常如果是内置的,/boot/config-... 里应该有 CONFIG_CRYPTO_ALGIF_AEAD=y
    “无输出” 通常意味着:
    • 该配置项在当前内核中根本不存在(被移除了)。
    • 或者该配置项被隐藏了(例如被包含在 CONFIG_CRYPTO_USER_API 的大集合中,或者配置名变更)。
    • 或者 /boot/config 文件本身不完整。

🛑 这意味着什么?

这意味着你无法通过修改 GRUB 参数(initcall_blacklist)来禁用它
因为如果内核配置里连这个选项的开关都没有(或者被深度隐藏),你在启动参数里告诉内核“不要加载它”,内核也会忽略这个指令,因为它根本不知道有这个开关。

结论: 既然 modinfo 显示它是 (builtin),说明代码就在内存里跑着。你现在的处境是:删不掉(因为是 builtin),也屏蔽不了(因为配置里找不到开关)。


💡 此时该怎么办?

既然无法通过配置禁用,我们需要通过行为测试来确认它是否真的“活着”且“可利用”,并制定唯一的解决方案。

步骤 1:验证它是否真的“活着”(行为测试)

不要纠结于配置文件,直接测试系统是否允许调用这个功能。CVE-2026-31431 利用的是 AF_ALG 套接字。

请在终端执行以下 Python 命令(不需要 root 权限):

python3 -c "import socket; s = socket.socket(38, 5, 0); print('危险:模块功能可用,存在漏洞')" 2>&1
  • 情况 A:报错 OSError: [Errno 92] Protocol not supported

    • 好消息:虽然 modinfo 显示它存在,但内核实际上拒绝了该协议的调用。这可能是因为 openEuler 对该内核进行了安全加固(如 Seccomp 或默认策略)。
    • 对策:如果报错,说明漏洞利用面可能已经被阻断,风险较低。
  • 情况 B:没有任何输出(命令成功执行)

    • 坏消息:模块不仅在内核里,而且完全可用。这是最危险的状态。
    • 对策:必须升级内核。

步骤 2:唯一的解决方案 —— 升级内核

由于 grep 找不到配置项,说明你当前的内核版本(5.10.0-60.18...,发布于 2022 年)太老,或者是一个经过特殊裁剪的版本。

你无法通过“打补丁”或“改配置”来修复一个连配置项都找不到的内置模块。

请立即执行以下操作:

  1. 检查是否有新内核可用

    sudo dnf list kernel --showduplicates
    

    你需要寻找一个比 5.10.0-60.18 更新的版本。openEuler 22.03 LTS 的后续更新版本(如 .oe2203sp1 或更高补丁集)通常会修复此类问题。

  2. 升级

    sudo dnf update kernel
    sudo reboot
    
  3. 升级后再次检查
    重启后,再次运行 modinfo algif_aead

    • 在新版内核中,它可能会变成 filename: .../algif_aead.ko(变成独立模块,此时你可以用 rmmod 禁用)。
    • 或者新版内核直接修复了该漏洞的代码逻辑。

📌 总结建议

针对你现在的 grep 无输出modinfo 显示 builtin 的情况:

  1. 不要尝试修改 GRUB:找不到配置项,改了也没用。
  2. 先做 Python 测试:确认它是否真的能被调用。
  3. 必须升级内核:这是解决“幽灵般存在的内置模块”的唯一办法。你的当前内核版本过旧,无法通过配置手段规避此漏洞。
$ uname -a
Linux localhost 5.10.0-60.18.0.50.oe2203.x86_64 #1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux


$ grep CONFIG_CRYPTO_USER_API_AEAD /boot/config-$(uname -r)
CONFIG_CRYPTO_USER_API_AEAD=y

这一条命令的输出非常关键,它揭示了问题的根源。

🔍 现状分析:为什么之前查不到?

你之前的困惑解开了:

  1. 父级开关已打开CONFIG_CRYPTO_USER_API_AEAD=y 表示“用户态加密 API 的 AEAD 支持”被编译进了内核。
  2. 子模块“隐身”了:在 Linux 内核配置(Kconfig)中,algif_aeadCONFIG_CRYPTO_USER_API_AEAD 的子选项。
    • 当父级选项被强制设为 y(内置)时,子选项 CONFIG_CRYPTO_ALGIF_AEAD 往往不会单独出现在 /boot/config 文件中,或者它默认跟随父级也是 y
    • 这就是为什么你之前 grep CONFIG_CRYPTO_ALGIF_AEAD 查不到输出,但 modinfo 却告诉你它是 (builtin) 的原因。

结论: 你的内核确实把 algif_aead 编译进去了,而且没有给它留“开关”(配置项)。


🛑 坏消息与好消息

  • 坏消息

    • 无法通过修改 /etc/modprobe.d/ 禁用它(因为是内置的)。
    • 无法通过 initcall_blacklist=algif_aead_init 屏蔽它(因为代码被深度耦合在父级功能里,没有独立的初始化符号供黑名单调用)。
    • 你的内核版本是 5.10.0-60.18.0.50(2022年发布),而漏洞修复补丁(commit a664bf3d)是在 2026 年才合入的。你的内核代码里肯定包含这个漏洞。
  • 好消息

    • 既然确认了是“死局”(无法配置、无法卸载),我们就不需要再浪费时间尝试各种“禁用”命令了。

🚀 唯一的解决方案:升级内核

对于 openEuler 22.03 LTS 这种企业级系统,当遇到内置模块漏洞且无法通过参数屏蔽时,升级内核是唯一有效的修复手段

1. 检查可用内核版本

openEuler 的更新源中通常会有修复了 CVE 的新版本内核。请执行:

sudo dnf list kernel --showduplicates | grep oe2203

你需要寻找版本号明显高于 60.18.0.50 的版本(例如 60.18.0.xx 更高版本,或者 oe2203sp1oe2203sp2 等)。

2. 执行升级

一旦发现有更新的版本,立即执行:

# 升级内核及相关固件
sudo dnf update kernel kernel-core kernel-modules
sudo reboot

3. 验证修复

重启后,再次检查:

  1. 看版本uname -r 是否变了?
  2. 看模块modinfo algif_aead
    • 在新版内核中,它可能会变成 filename: .../algif_aead.ko(变成了独立模块),这时你就可以用 rmmodmodprobe blacklist 来禁用了。
    • 或者新版内核虽然还是内置,但代码逻辑已经修复了漏洞。

🛡️ 如果暂时无法升级(临时缓解)

如果你绝对无法升级内核(例如业务强依赖旧内核),你只能通过限制用户权限来缓解,因为没有技术手段能关掉这个内置模块:

  1. Seccomp 限制
    如果在容器环境(Docker/K8s),配置 Seccomp 策略,禁止 socket 系统调用中 family=38 (AF_ALG) 的操作。
  2. 严格的用户隔离
    不要给不可信的用户分配普通账号。因为这是一个本地提权漏洞,如果攻击者无法登录你的服务器,这个漏洞就无法利用。

总结建议: 别纠结配置项了,赶紧升级内核是解决 CVE-2026-31431 的唯一正解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容