CVE-2025-21756:Linux内核微小漏洞如何引发完整Root提权攻击(含PoC发布)
漏洞技术分析
安全研究员Michael Hoefler最新研究揭示了CVE-2025-21756漏洞的全貌,这是一个影响Linux内核vsock子系统的释放后重用(Use-After-Free,UAF)漏洞。该漏洞源于vsock_remove_sock()函数几行代码的行为修改,最终导致本地权限提升(LPE)和内核代码执行的完整攻击路径。
Hoefler解释道:"当内核中对象的引用计数器归零时,该对象会被释放给对应的内存管理器。理想情况下,在释放vsock对象后,我们可以触发某种UAF来获得更好的攻击原语并提升权限。"
漏洞成因与利用限制
该漏洞的根本原因在于传输重分配期间对套接字绑定状态处理不当。具体而言,vsock代码错误地减少了已解绑套接字的引用计数器,导致vsock对象被过早释放。补丁分析指出:"传输重分配会触发vsock_remove_sock,进而调用vsock_remove_bound错误地减少vsock对象的引用计数器。"这引入了危险的UAF条件,攻击者可利用其获得强大的攻击原语。
初期利用尝试导致内核崩溃,显示AppArmor通过Linux安全模块(LSM)钩子在套接字释放时清除了sk_security指针,阻碍了直接函数指针破坏。Hoefler强调:"内核给了我们一个悬垂指针,但AppArmor确保我们在能利用它之前就会崩溃。"因此,攻击者必须寻找不受AppArmor保护的内核函数继续利用。
绕过防护机制
为绕过内核地址空间布局随机化(kASLR)且不依赖受AppArmor保护的函数,Hoefler转向了不受保护的netlink诊断工具vsock_diag_dump()功能。通过用精心构造的管道缓冲区回收已释放的vsock套接字,并利用vsock_diag_dump作为侧信道,Hoefler暴力破解了有效的skc_net指针,从而绕过kASLR。
Hoefler回忆道:"在陷入困境时,我求助于kernelctf社区,@h0mbre建议使用vsock_diag_dump作为侧信道暴力破解skc_net指针。"这使得攻击者能够以已知内存偏移完全控制悬垂套接字对象。
最终攻击链
为实现代码执行,Hoefler利用了不受AppArmor保护的vsock_release()函数。攻击可劫持sk->sk_prot->close函数指针并转向ROP(面向返回编程)链:"我们最感兴趣的是对sk->sk_prot->close(sk, 0)的调用。由于我们控制着sk,所以需要一个指向函数指针的有效指针。"
最终的ROP链调用commit_creds(init_cred),为攻击者授予root权限并干净地返回用户空间。
图片:Michael Hoefler