CVE-2023-53676CVE-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(),该函数接受偏移量和缓冲区大小参数,能够在写入前检测是否超出缓冲区边界,超出时返回错误而非继续写入,从而彻底杜绝缓冲区溢出的可能性。