新闻动态
当前位置:首页 > 新闻动态

不重启,广覆盖:eBPF封堵高危提权漏洞

2026-05-06

近日,CVE-2026-31431(Copy Fail)公开披露。漏洞潜伏九年,核心利用逻辑代码只有 732 字节,无需 root、无需编译、无竞争条件,在几乎所有主流 Linux 发行版上 100% 可靠地获取 root 权限。

关于漏洞原理和受影响版本,各大安全媒体已有大量报道。本文不做重复,聚焦一个更具体的问题:面对这个漏洞,我们为什么选择 eBPF 作为第一响应手段,它是如何工作的,以及在生产环境中部署它到底安不安全。

作为操作系统研发团队,KeyarchOS 在漏洞披露后第一时间对攻击路径做了完整分析,并基于我们安全组件 KSecure 的 eBPF 能力完成了防护部署。以下是我们的分析过程和实践结论。

这个漏洞为什么难防

理解防御方案原理,需要先理解漏洞的关键特征。Copy Fail 的攻击路径由三步串联而成:

  ① 创建 AF_ALG socket,绑定 authencesn 算法

  ② splice(目标文件 → pipe → AF_ALG socket)(两次 splice 调用)

     第一次将目标文件的页缓存页以引用方式放入 pipe 缓冲区

     第二次将 pipe 中的页面引用传递给 AF_ALG socket 的输入缓冲区

     由于内核就地(in-place)处理的缺陷,这些页面同时出现在加密算法的输出 scatterlist 中

  ③ 触发 AEAD 解密

     authencesn 越界写 4 字节进入页缓存

     execve 加载被污染的页缓存 → root

难防的原因不在于攻击步骤复杂,恰恰相反——它太干净了:

• 全程使用合法系统调用,没有 shellcode,没有内存喷射

• 只改内存中的页缓存,磁盘文件完好无损,文件 hash 校验对它无效

• inotify 等文件系统监控感知不到页缓存的变化

• 完成整个攻击只需数百毫秒,全程无需人工干预,传统方案从检测到告警再到人工响应的链路根本来不及

 能防住它的手段,必须在内核层面、在攻击动作完成之前就介入。

常规手段的局限

面对这个漏洞,业界通常提到两种手段,这里简要说明它们的边界。

打内核补丁

打内核补丁是根本修复方案。漏洞根源是 2017 年引入的就地优化(commit 72548b093ee3),官方修复将 AEAD 操作恢复为输入输出分离模式,各稳定分支的修复 commit 分别为:6.18.22 对应 fafe0fa2995a ,6.19.12 对应 ce42ee423e58 ,7.0 主线对应 a664bf3d603d 。各发行版均已推送更新, apt upgrade  /  dnf update kernel  后重启即可。但重启内核意味着服务中断,在生产环境中需要协调停机窗口,从漏洞披露到完成重启往往需要数小时乃至更长时间。

关闭 algif_aead 模块

关闭 algif_aead 模块是另一种临时切断手段,CERT-EU 的官方缓解建议也是禁用此模块,并明确说明不影响 IPsec/XFRM、dm-crypt/LUKS 及 SSH 等业务。但这个方法存在一个根本性局限:在 RHEL 等主流发行版上, algif_aead  通常编译进内核而非独立模块, rmmod 命令运行不报错,实际上却没有任何效果——CloudLinux 的技术分析明确指出,这在 RHEL 系列上会造成虚假的安全感。

两种手段都需要评估业务影响、协调停机窗口,在漏洞披露到操作完成之间存在一段暴露期。

此外还有一个容易被忽视的覆盖盲区:上游补丁只发布在活跃维护的内核分支上。对于已停止维护的系统——如 CentOS 8(2021年EOL,内核 4.18)、部分较早的 Ubuntu LTS 版本——官方不会发布对应的安全补丁,用户只能依赖商业扩展支持或自行回移补丁,成本极高。而eBPF 防护只要内核版本达到 4.7 以上即可运行,不依赖上游是否发布针对该版本的安全更新,对这类系统同样有效

 这段暴露期,以及补丁无法覆盖的EOL 系统,是 eBPF 要解决的问题。

eBPF 防护方案

KSecure 是KeyarchOS 内置的系统安全组件,其内核行为监控模块基于 eBPF 实现运行时威胁检测与阻断——eBPF 运行在内核态、在系统调用入口触发、动态加载无需重启,满足防御 Copy Fail 的三个前提:必须在内核层面运行、必须在攻击完成前介入、不依赖重启或停服。针对 Copy Fail,我们在 KSecure 中实现了专项防护规则,以下是设计思路的完整说明。

选点:为什么盯住这一个系统调用

设计防护时,我们首先在攻击链里寻找这样一个点:攻击必须经过、正常业务几乎不经过、能在损害发生前介入。

Copy Fail 的攻击链里,第②步的  splice(pipe → AF_ALG socket)  同时满足这三个条件:

• 没有这一步,页缓存页就不会进入 scatterlist,后续越界写无从发生(必经节点)

• 正常业务的 splice 目标是普通socket 或文件,把数据 splice 进 AF_ALG socket 在真实代码库里极为罕见(误报率极低)

• splice 是系统调用,内核有明确的入口钩子,可以在系统调用执行前介入(时机最早)

防护逻辑只有一条规则:检测到任何进程将 splice 的目标(fd_out)指向 AF_ALG socket,立即终止该进程。

这是行为检测而非特征检测。不管攻击者用什么语言写脚本、用什么进程名伪装,只要行为出现,拦截就触发,无法通过换个马甲的方式绕过。

防护原理:钩子如何挂上去

本方案使用的是 tracepoint(内核静态跟踪点)机制。tracepoint 是内核开发者预先在关键路径上埋好的观测接口,sys_enter_splice  就是其中之一,位于  splice()  进入内核的第一行,此时 splice 尚未执行。

挂钩过程:以 root 权限运行防护程序,程序通过  bpf()  系统调用将 eBPF 字节码提交内核,经BPF Verifier 静态验证后通过JIT 编译为本机指令,注册到  sys_enter_splice  上。此后每当任何进程调用  splice() ,内核在执行 splice 逻辑之前都会先运行我们的检测代码:

1.png

eBPF防护钩子挂载流程示意图

与 kprobe(运行时动态插桩)相比,tracepoint是内核预埋的稳定接口,内核版本升级后接口不变,防护程序无需随之修改适配。

核心检测代码

2.png

与同类安全机制相比,eBPF 的优势在于能够深入内核上下文。SELinux 和 AppArmor 的策略语言工作在安全标签维度,无法表达 splice 目标是 AF_ALG socket 时拒绝这种基于内核对象类型的规则;AppArmor 虽然可以禁止 AF_ALG socket 的创建,但过于粗粒度,会影响合法加密业务。Seccomp-BPF 只能看到 fd_out 的原始数字,架构上无法追溯 fd 背后的内核对象类型。eBPF tracepoint 则可以沿内核数据结构解引用,精确确认 fd_out 是否为 AF_ALG socket,这是另外两种机制做不到的。

会不会引发系统崩溃

这是生产环境部署前最重要的问题。eBPF 有三道机制保证安全:字节码在加载前必须通过 BPF Verifier 的逐指令静态验证,任何指针越界或非法操作都会导致加载失败;程序只能调用内核白名单 helper 函数,无法操作任意内核数据结构;运行在独立栈帧上,异常退出后内核自动回收资源,不影响其他进程。Ctrl+C 终止守护进程,eBPF 程序即从 tracepoint 注销,内核恢复原状。

 普通内核模块没有上述任何限制。从系统稳定性角度,eBPF 防护程序比加载一个内核模块更安全。

对业务运行的影响

正常业务路径完全不受影响。 eBPF 程序只在  splice()  调用时触发,触发后立即判断 fd_out 类型。Web 服务、数据库、日志管道的 splice 目标是普通 socket 或文件,判断结果为否时直接返回,对业务透明。

仅命中检测条件的进程会被终止。 只有 splice 目标恰好是 AF_ALG socket 时才触发 SIGKILL。部署前可用以下命令排查是否存在持有 AF_ALG socket 的进程:

 ss -f alg# 查看是否有进程持有AF_ALG socket

若结果为空,可直接以阻断模式部署。

加载和卸载本身不中断业务。 不需要停止任何服务,不需要重启,上线和下线对业务无感——这是它与打补丁、关模块的核心区别。

性能影响

性能开销可忽略。 sys_enter_splice  是内核静态跟踪点,触发时仅执行一次轻量检测;且 eBPF 程序不轮询、不占用定时器,触发频次完全由业务的 splice 调用量决定,不引入任何额外开销。即使在以 splice 为核心的高吞吐代理或转发服务中,CPU 额外开销也低于 1%

日志写入不阻塞内核路径。 事件数据写入 ring buffer 后立即返回,用户态守护进程异步消费,两者之间无同步阻塞。

部署方式

KeyarchOS 用户:上述防护逻辑已集成在 KSecure 的内核行为监控模块中,可直接通过 KSecure 启用针对 CVE-2026-31431 的防护规则,无需手动编译或配置。


其他 Linux 发行版:可通过 BCC Python 版快速部署:


sudo apt install python3-bpfcc# Debian/Ubuntu
sudo dnf install python3-bcc # RHEL/Fedora 
sudo python3 copy_fail_bcc.py
# [ALERT] Blocked PID 12345 (python3) splice(fd_in=3, fd_out=5, len=4096) — sending SIGKILL


三种手段的协同关系

三种手段不是并列选项,而是按时间维度承担不同角色:


3.png

三种防护手段协同关系图


eBPF 是贯穿全程的核心防护层,负责在补丁落地之前填补暴露期,补丁落地之后作为纵深防御持续运行。

结语

Copy Fail 是一个很好的案例,让我们重新审视响应速度在漏洞防御里的意义。一个全程使用合法系统调用、数百毫秒内完成的攻击,传统检测告警再处置的方案存在滞后期。

内核补丁是终点,但从披露到打完补丁重启之间的窗口期,才是风险最集中的时段。eBPF 的价值恰好在这里:不改内核、不停业务、即时生效,把防线从事后响应推进到攻击路径上的实时阻断。

KSecure 将这种能力作为 KeyarchOS 的内置安全能力持续演进——不只是针对这一个漏洞,而是把在内核关键路径上实时感知和阻断异常行为作为系统安全的基础能力沉淀下来,让运维和安全团队在下一个漏洞出现时,能有更短的响应窗口。

关注我们

Copyright © 2024 浪潮信息 鲁ICP备13028953号-12

售前咨询

售后服务

回到顶部

回到顶部

售前咨询
售后服务