四字节的力量:Linux内核CVE-2021-26708漏洞利用分析
漏洞概述
CVE-2021-26708是Linux内核虚拟套接字实现中的五个竞争条件漏洞。这些漏洞由内核版本5.5-rc1中引入的多传输支持功能隐式引入,影响CONFIG_VSOCKETS和CONFIG_VIRTIO_VSOCKETS模块。
漏洞原理
漏洞存在于net/vmw_vsock/af_vsock.c中的同步原语错误处理。关键问题是在lock_sock()调用前将vsk->transport指针复制到局部变量,此时该值可能在未持有锁的情况下被修改。
|
|
利用过程
竞争条件触发
通过两个线程协作触发竞争条件:
- 线程1调用setsockopt(),复制transport指针后尝试获取锁
- 线程2通过connect()调用改变传输类型,导致原transport被释放
内存破坏
当transport->notify_buffer_size()被调用时,使用已释放的virtio_vsock_sock结构:
|
|
利用开发
- 堆喷射技术:使用add_key()和msgsnd()系统调用在释放的内存位置分配新对象
- msg_msg结构利用:覆盖msg_msg.security字段实现任意内存释放
- 信息泄露:通过内核警告信息泄露内核地址
- 权限提升:通过sk_buff对象实现任意代码执行
防御措施
- SLAB_QUARANTINE:内存隔离技术
- MODHARDEN:防止非特权用户自动加载模块
- unprivileged_userfaultfd:限制userfaultfd使用
- kernel.dmesg_restrict:限制内核日志访问
- Control Flow Integrity:控制流完整性保护
- ARM MTE:内存标记扩展
- AUTOSLAB:对象特定内存分配
结论
CVE-2021-26708的利用展示了如何将有限的四字节写入能力转化为完整的系统控制。该研究为Linux内核安全防护提供了有价值的见解,推动了内核安全机制的改进。
演示视频展示了完整的利用过程,成功在Fedora 33 Server上实现权限提升。