四字节的力量:Linux内核CVE-2021-26708漏洞利用分析

本文详细分析了Linux内核虚拟套接字实现中的竞争条件漏洞CVE-2021-26708,展示了如何通过四字节的内存写入实现任意读写和系统完全控制,并探讨了可能的防御措施。

四字节的力量: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
2
3
4
5
sk = sock->sk;
vsk = vsock_sk(sk);
transport = vsk->transport;  // 竞争条件发生处

lock_sock(sk);

利用过程

竞争条件触发

通过两个线程协作触发竞争条件:

  1. 线程1调用setsockopt(),复制transport指针后尝试获取锁
  2. 线程2通过connect()调用改变传输类型,导致原transport被释放

内存破坏

当transport->notify_buffer_size()被调用时,使用已释放的virtio_vsock_sock结构:

1
2
3
4
5
void virtio_transport_notify_buffer_size(struct vsock_sock *vsk, u64 *val)
{
    struct virtio_vsock_sock *vvs = vsk->trans;  // 使用已释放内存
    vvs->buf_alloc = *val;  // 可控的四字节写入
}

利用开发

  1. 堆喷射技术:使用add_key()和msgsnd()系统调用在释放的内存位置分配新对象
  2. msg_msg结构利用:覆盖msg_msg.security字段实现任意内存释放
  3. 信息泄露:通过内核警告信息泄露内核地址
  4. 权限提升:通过sk_buff对象实现任意代码执行

防御措施

  • SLAB_QUARANTINE:内存隔离技术
  • MODHARDEN:防止非特权用户自动加载模块
  • unprivileged_userfaultfd:限制userfaultfd使用
  • kernel.dmesg_restrict:限制内核日志访问
  • Control Flow Integrity:控制流完整性保护
  • ARM MTE:内存标记扩展
  • AUTOSLAB:对象特定内存分配

结论

CVE-2021-26708的利用展示了如何将有限的四字节写入能力转化为完整的系统控制。该研究为Linux内核安全防护提供了有价值的见解,推动了内核安全机制的改进。

演示视频展示了完整的利用过程,成功在Fedora 33 Server上实现权限提升。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计