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

CVE-2023-53649 Linux内核perf trace内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2023-53649
漏洞类型
内存泄漏(Memory Leak)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(tools/perf 组件中的 perf trace 子系统)

相关标签

Linux Kernel内存泄漏Memory Leakperf tracetools/perf本地提权拒绝服务DoS可用性影响内核漏洞

漏洞概述

CVE-2023-53649是Linux内核perf工具中perf trace子系统存在的一个内存泄漏漏洞。该漏洞源于tools/perf/builtin-trace.c文件中evsel->priv区域释放逻辑的不一致问题。在提交3cb4d5e00e037c70中,代码仅在strcmp(evsel->tp_format->system, "syscalls")返回值为0时(即tp_format的system字段为"syscalls"时)才释放evsel->priv内存,但对应的初始化操作却是在该字段不为"syscalls"时执行的。这种条件判断的不一致导致了内存泄漏问题,每次执行perf trace命令时都会泄漏约80字节的内存(两次40字节的分配)。该漏洞通过AddressSanitizer(ASan)工具检测发现,会导致系统可用性下降,特别是在长时间或频繁使用perf trace命令的场景下,可能造成内存资源耗尽,影响系统稳定性。CVSS评分为5.5,属于中危级别,攻击向量为本地,攻击者需要低权限即可触发,无需用户交互,对系统可用性影响较高。

技术细节

该漏洞的技术原理在于perf trace子系统中evsel_trace__new()函数与evsel__delete()函数之间的资源管理逻辑不对称。具体而言:

1. 在evsel__init_raw_syscall_tp()函数中,当tp_format->system字段不等于"syscalls"时,会通过evsel_trace__new()调用zalloc()分配40字节的内存并保存到evsel->priv指针中。

2. 然而在释放阶段,原有代码使用strcmp()判断仅在system字段等于"syscalls"时才调用free()释放evsel->priv,这与初始化条件完全相反,导致非syscalls类型的evsel->priv内存永远不会被释放。

3. 每次调用perf trace命令时,会通过trace__add_syscall_newtp()函数触发两次分配(分别在builtin-trace.c的第3205行和3212行),每次泄漏40字节,共计80字节。

4. 漏洞的修复方法是停止使用strcmp条件判断,直接检查evsel->priv是否被设置,若已设置则使用预存在的evsel_trace__delete()函数进行释放,确保初始化与释放逻辑的对称性。

利用方式:本地低权限用户执行`perf trace sleep 1`等命令即可触发内存泄漏。虽然单次泄漏量较小(80字节),但在自动化脚本或监控工具频繁调用perf trace的场景下,累积泄漏可能导致系统内存耗尽,影响可用性。

攻击链分析

STEP 1
步骤1:本地访问
攻击者需要拥有目标系统的本地低权限账户访问权限(PR:L),通过SSH、控制台或其他本地会话登录系统。
STEP 2
步骤2:权限要求
perf工具通常需要特定权限才能执行完整功能,但基础的perf trace命令在某些Linux发行版中可被普通用户执行,用于追踪系统调用。
STEP 3
步骤3:触发内存泄漏
攻击者执行perf trace命令(如'perf trace sleep 1'),触发builtin-trace.c中trace__add_syscall_newtp()函数调用,进而调用evsel__init_raw_syscall_tp()分配evsel->priv内存。
STEP 4
步骤4:泄漏累积
由于释放逻辑与初始化逻辑条件不一致,分配的40字节内存(共两次,共80字节)不会被释放。攻击者可通过循环执行perf trace命令使泄漏累积。
STEP 5
步骤5:可用性影响
长时间运行或频繁调用perf trace导致内存持续泄漏,最终可能耗尽系统内存资源,影响系统可用性(A:H),造成拒绝服务效果。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC for CVE-2023-53649 - Linux Kernel perf trace Memory Leak # This PoC demonstrates the memory leak by repeatedly executing perf trace #!/bin/bash # CVE-2023-53649 PoC # Description: Triggers memory leak in perf trace via evsel->priv allocation # Usage: Run this script with low-privilege user account # Method 1: Simple trigger - execute perf trace once # Each execution leaks 80 bytes (2 x 40 bytes) perf trace sleep 1 # Method 2: Repeated execution to amplify the leak effect # Run in a loop to observe cumulative memory leak for i in $(seq 1 1000); do perf trace sleep 0.001 done # Method 3: Verify with AddressSanitizer build # Build perf with ASan: # make EXTRA_CFLAGS="-fsanitize=address" BUILD_BPF_SKEL=1 CORESIGHT=1 \ # O=/tmp/build/perf-tools-next -C tools/perf install-bin # Then run: # perf trace sleep 1 # Expected ASan output: # ==XXXXX==ERROR: LeakSanitizer: detected memory leaks # Direct leak of 40 byte(s) in 1 object(s) allocated from: # #0 in calloc # #1 in zalloc # #2 in evsel_trace__new (builtin-trace.c:307) # #3 in evsel__syscall_tp (builtin-trace.c:333) # #4 in evsel__init_raw_syscall_tp (builtin-trace.c:458) # SUMMARY: AddressSanitizer: 80 byte(s) leaked in 2 allocation(s).

影响范围

Linux Kernel(包含受影响perf trace子系统的版本,修复提交为3cb4d5e00e037c70之后修复的版本)
Linux Kernel stable 分支受以下commit修复:27f396f64537b1ae48d0644d7cbf0d250b3c0b33
Linux Kernel stable 分支受以下commit修复:62dd514c34be63d3d5cae1f52a7e8b96c6dd6630
Linux Kernel stable 分支受以下commit修复:7962ef13651a9163f07b530607392ea123482e8a
Linux Kernel stable 分支受以下commit修复:c3bc668581e71e7c3bc7eb1d647f25f8db222163

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)通过chmod或移除suid位限制perf工具的访问,仅允许特权用户使用;2)使用cgroups或systemd资源限制限制perf trace进程的内存使用上限,防止单个进程耗尽系统内存;3)监控perf trace相关进程,及时终止异常长时间运行的实例;4)在生产环境的关键系统中暂时禁用perf trace功能,使用其他性能分析工具替代。

参考链接

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