CVE-2026-23410Linux内核中的AppArmor模块存在一个安全漏洞,该漏洞源于对rawdata解引用的竞态条件。由于rawdata inode未进行引用计数,攻击者可以在打开rawdata文件的同时,通过移除对应的配置文件等操作释放最后一个引用,导致`struct aa_loaddata`结构体被释放。此时,当`seq_rawdata_open`函数被调用时,会访问悬空指针`i_private`,从而引发释放后重用漏洞。该问题可能导致系统崩溃、权限提升或代码执行。
该漏洞的核心在于AppArmor处理rawdata文件时的引用计数机制缺陷。在原有的设计中,为了避免循环引用,rawdata inode未被正确引用计数,而是依赖profile对rawdata的引用来保持存活。然而,在profile移除过程中存在一个时间窗口,VFS(虚拟文件系统)的操作与profile的销毁过程产生竞争。
具体利用场景为:本地低权限攻击者并发执行两个操作,一是通过`open()`系统调用打开AppArmor的rawdata文件,二是触发移除对应profile的操作(导致rawdata引用归零并释放`struct aa_loaddata`)。如果在`open()`调用尚未执行到`seq_rawdata_open`读取`i_private`指针之前,内存已经被释放,攻击者即可导致内核访问已释放的内存区域。
成功利用此漏洞可能导致内核崩溃(DoS),或者通过精心构造的内存布局实现本地权限提升(LPE),甚至执行任意内核代码。修复方案采用了双重引用计数机制,确保在inode引用完全释放前,rawdata不会被释放,从而切断竞态条件。