CVE-2023-53616CVE-2023-53616是Linux内核中JFS(Journaled File System)文件系统的一个高危安全漏洞,CVSS评分为7.8。该漏洞由syzbot模糊测试工具发现,位于fs/jfs/jfs_imap.c文件的diUnmount函数中。漏洞的根因在于JFS_IP(ipimap)->i_imap指针在释放后未被设置为NULL,导致在特定条件下发生双重释放(double-free)问题。当jfs_remount()函数释放了JFS_IP(ipimap)->i_imap指向的内存,但在后续的diMount()调用失败时,该指针仍然指向已释放的内存区域。当文件系统卸载(umount)操作再次执行diUnmount时,会再次尝试释放同一块内存,从而触发KASAN检测到的双重释放错误。此漏洞可被本地低权限用户利用,通过触发文件系统重新挂载失败并随后执行卸载操作,可能导致内核崩溃(拒绝服务)或进一步的内核内存破坏,对系统的机密性、完整性和可用性均产生高影响。
该漏洞的技术原理如下:JFS文件系统使用ipimap结构来管理inode分配映射,其中i_imap字段指向动态分配的内存区域。在正常的文件系统卸载流程中,diUnmount函数负责释放该内存。但在异常路径上,当jfs_remount()成功释放了i_imap指向的内存后,如果后续的diMount()调用失败,代码路径会直接返回而不会重新分配i_imap。此时i_imap指针仍然保留着已释放内存的地址(悬空指针)。当用户随后执行umount操作时,diUnmount函数会再次检查并释放i_imap指向的内存,从而触发KASAN报告的双重释放错误(BUG: KASAN: double-free)。
从利用角度看,攻击者作为本地低权限用户,需要:1)挂载一个JFS文件系统;2)触发remount操作并使其在diMount阶段失败;3)执行umount操作触发diUnmount中的双重释放。这可以通过精心构造文件系统状态或利用其他内核缺陷导致diMount失败来实现。双重释放可能导致slab分配器的元数据损坏,进而被利用进行内核堆利用攻击,实现权限提升或任意代码执行。
修复方案是在diUnmount函数释放i_imap后立即将其设置为NULL,确保即使发生重复调用也不会再次释放已释放的内存。