CVE-2023-53593CVE-2023-53593是Linux内核cifs(Common Internet File System)模块中的一个资源管理漏洞。当使用fscache(文件系统缓存)功能时,在cifs_readpage_worker函数处理缓存命中(cache hit)的读取请求时,存在folio锁泄漏问题。根据VFS(虚拟文件系统)的文档规范,read_folio操作的被调用方在读取完成后(无论成功与否)应当释放folio锁。然而在当前实现中,当fscache缓存命中时,cifs_readpage_from_fscache函数仅将页面标记为clean,但未释放folio锁。这导致在后续通过mmap访问同一页面时,会在folio_wait_bit_common处发生死锁,需要重启系统才能恢复。该漏洞影响所有启用cifs和fscache功能的Linux内核版本,攻击者需要本地低权限访问权限即可触发,造成系统可用性完全丧失(系统挂起/死锁)。该漏洞由Linux内核社区修复,通过在__cifs_readpage_from_fscache成功路径中添加folio解锁逻辑,使cifs_readpage_worker的行为与cifs_readahead保持一致,从而修复了锁泄漏问题。
该漏洞的技术根源在于Linux内核cifs模块中folio锁管理的不一致。具体来说,cifs_readpage_worker函数被调用时,调用契约要求被调用者负责解锁folio。然而,当fscache缓存命中时,代码路径调用cifs_readpage_from_fscache,该函数内部调用__cifs_readpage_from_fscache,在成功路径中仅将folio标记为clean(通过folio_mark_uptodate),但没有释放folio锁。
问题在于cifs_readahead函数也调用cifs_readpage_from_fscache,但它在返回后会无条件释放锁。因此修复方案是使cifs_readpage_worker与cifs_readahead行为一致,在__cifs_readpage_from_fscache成功路径中释放锁。
利用方式:攻击者只需通过本地低权限账户挂载启用了fscache的cifs文件系统,然后通过mmap方式访问文件中的页面。当发生缓存命中时,folio锁被泄漏。当用户尝试再次通过mmap访问该页面时,内核会在folio_wait_bit_common处无限等待锁释放,形成死锁。触发后的堆栈信息显示调用链为:filemap_fault -> filemap_read_folio -> folio_wait_bit_common。攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性和完整性无影响,但对可用性影响为高(A:H),因为系统将完全挂起。