CVE-2023-53536CVE-2023-53536是Linux内核块设备加密子系统(blk-crypto)中存在的一个高危释放后使用(Use-After-Free)漏洞。该漏洞位于blk_crypto_evict_key()函数中,当该函数检测到密钥仍在使用中(由于bug)或->keyslot_evict操作失败时,函数仅返回而未将密钥从keyslot管理结构中解除链接。然而,调用方(如inode回收路径)无论blk_crypto_evict_key()的返回值如何,都会继续释放blk_crypto_key结构。这两个假设之间的不匹配导致在blk_crypto_reprogram_all_keys()中可能出现释放后使用漏洞。攻击者在获得本地低权限访问后,可利用此漏洞触发内核崩溃、信息泄露或权限提升。该漏洞的CVSS评分为7.8,属于高危级别,影响机密性、完整性和可用性。Linux内核维护者已通过多个稳定版本提交了修复补丁,确保blk_crypto_evict_key()在失败时也能正确解除密钥链接,防止use-after-free的发生。
该漏洞的技术原理如下:在Linux内核的blk-crypto子系统中,blk_crypto_evict_key()函数负责从keyslot管理结构中移除加密密钥。正常情况下,该函数会调用->keyslot_evict回调来驱逐密钥,然后解除密钥与keyslot管理数据结构的链接。然而,当出现以下两种异常情况时:(1) 密钥仍被引用(in-use),(2) ->keyslot_evict操作失败,函数当前仅返回错误码而未执行unlink操作。问题在于调用方(如文件系统inode回收逻辑)在调用blk_crypto_evict_key()后,无论返回值如何都会继续释放blk_crypto_key内存。这导致keyslot管理结构中仍保留着指向已释放内存的悬挂指针。当后续blk_crypto_reprogram_all_keys()遍历这些结构时,会访问已释放的内存,从而触发use-after-free。攻击者可通过以下方式利用:(1) 创建使用blk-crypto加密的块设备;(2) 触发导致keyslot_evict失败的错误条件(如并发竞争);(3) 强制inode回收路径执行;(4) 触发blk_crypto_reprogram_all_keys()调用以访问已释放内存。成功利用可导致内核panic、信息泄露或通过控制释放后内存内容实现权限提升。