CVE-2023-53557CVE-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程序来触发系统崩溃。