CVE-2022-50488CVE-2022-50488是Linux内核块设备层BFQ(Budget Fair Queueing)调度器中的一个释放后使用(Use-After-Free, UAF)漏洞。该漏洞源于提交3bc5e683c67d("bfq: Split shared queues on move between cgroups")引入的逻辑变更:当进程从一个cgroup迁移到另一个cgroup时,系统会分配一个新的bfqq(BFQ queue),但旧的bfqq和新的bfqq可能同时指向同一个bic(bfq_io_cq)数据结构。
在特定竞争条件下,当进程退出且所有IO请求完成时,bic数据结构会被释放,但由于bfqq与bic之间的引用关系未被正确清除,可能导致bfqq继续持有已释放的bic指针。后续对该bfqq的访问将触发内核中的UAF漏洞,可能导致内核崩溃、信息泄露或权限提升。该漏洞在Linux内核5.10版本中被发现并报告,CVSS评分为7.8,属于高危级别漏洞。
由于该漏洞属于本地权限利用,需要攻击者已拥有系统的低权限账户才能触发,但一旦触发,可对系统的机密性、完整性和可用性均造成严重影响。
该漏洞的核心问题在于BFQ调度器中bfqq与bic之间的引用计数管理不当。具体技术原理如下:
1. **数据结构关系**:在BFQ调度器中,每个进程对应一个bic(bfq_io_cq)结构,每个bic可以关联一个或多个bfqq(BFQ queue)。正常情况下,bic的生命周期应长于或等于其关联的bfqq。
2. **漏洞触发路径**:当两个进程在同一cgroup中进行IO操作时,各自拥有独立的bfqq但共享相同的bic。当发生队列合并(merge)操作后,两个bfqq合并为一个共享队列(cooperative queue)。如果其中一个进程退出后,另一个进程迁移到新的cgroup,系统会分配新的bfqq3,但旧的bfqq2和新的bfqq3同时指向BIC2。
3. **UAF触发条件**:当所有IO请求完成后,进程退出导致BIC2被释放,但由于bfqq2仍然持有BIC2的指针(bfqq2->bic),且没有同步机制保证bfqq2在BIC2之前被释放,因此后续对bfqq2->bic的访问将访问已释放的内存。
4. **利用方式**:攻击者可以通过编写特定的程序,模拟上述场景:创建两个线程进行IO操作,触发队列合并,然后使一个线程退出,另一个线程迁移cgroup并继续IO操作,最终触发UAF。
5. **修复方案**:在内核补丁中,通过在bfqq从bic分离(detach)时清除bfqq->bic指针来解决该问题,确保引用关系的正确性。