CVE-2023-53649CVE-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的场景下,累积泄漏可能导致系统内存耗尽,影响可用性。