Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >QEMU 虚拟机逃逸漏洞(CVE-2019-14378)漏洞分析

QEMU 虚拟机逃逸漏洞(CVE-2019-14378)漏洞分析

作者头像
用户1423082
发布于 2024-12-31 12:08:17
发布于 2024-12-31 12:08:17
9600
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

这是qemu在网络实现的时候的一个指针错误,当重组大量的ipv4分段数据包时会触发错误,这还是大牛通过代码审计发现的,厉害啊。

漏洞细节

qemu的网络有两部分 1、为虚拟机提供的虚拟网卡(比如PCI网卡) 2、与网络接口控制器交互的网络后端(就是将网络数据包给到主机网络)

默认情况下,QEMU将为guest虚拟机创建SLiRP用户网络后端和适当的虚拟网卡(例如e1000 PCI网卡)

而本漏洞是在SLiRP中的数据包重组中出现的错误。

数据包重组那就需要了解ip分片,ip层的结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

分片在Flags那里,主要是低3个bit

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Bit 0: 保留为, 必须为0
Bit 1: (DF) 0 = 分片, 1 = 不分片.
Bit 2: (MF) 0 =最后一个ip包, 1 = 后面还有分片
Fragment Offset: 13 bits

下面看下相关的结构体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct mbuf {
    /* header at beginning of each mbuf: */
    struct mbuf *m_next; /* Linked list of mbufs */
    struct mbuf *m_prev;
    struct mbuf *m_nextpkt; /* Next packet in queue/record */
    struct mbuf *m_prevpkt; /* Flags aren't used in the output queue */
    int m_flags; /* Misc flags */

    int m_size; /* Size of mbuf, from m_dat or m_ext */
    struct socket *m_so;

    char *m_data; /* Current location of data */
    int m_len; /* Amount of data in this mbuf, from m_data */

    ...

    char *m_ext;
    /* start of dynamic buffer area, must be last element */
    char m_dat[];
};

mbuf是储存接收到的ip层的信息。有两个buffer,一个是m_dat ,另一个是m_ext,他是m_dat不足以储存的时候,通过在堆上分配内存解决不足的问题

在nat转换的时候,如果传入的数据包是分片的,则应在编辑和重新传输之前重新组装它们。 这个重组由ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp)函数完成。 ip包含当前的IP数据包数据,fp是包含分段数据包的链表。

ip_reass执行以下操作: 1、如果第一个分配的fp为NULL,创建重组队列并将ip插入此队列。 2、检查片段是否与先前收到的片段重复,然后丢弃它。 3、如果收到所有分段的数据包,则重新组装它。 通过修改第一个数据包的头部为新的ip header。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * Take incoming datagram fragment and try to
 * reassemble it into whole datagram.  If a chain for
 * reassembly of this datagram already exists, then it
 * is given as fp; otherwise have to make a chain.
 */
static struct ip *ip_reass(Slirp *slirp, struct ip *ip, struct ipq *fp)
{

    ...
    ...

    /*
     * Reassembly is complete; concatenate fragments.
     */
    q = fp->frag_link.next;
    m = dtom(slirp, q);

    q = (struct ipasfrag *)q->ipf_next;
    while (q != (struct ipasfrag *)&fp->frag_link) {
        struct mbuf *t = dtom(slirp, q);
        q = (struct ipasfrag *)q->ipf_next;
        m_cat(m, t);
    }

    /*
     * Create header for new ip packet by
     * modifying header of first packet;
     * dequeue and discard fragment reassembly header.
     * Make header visible.
     */
    q = fp->frag_link.next;

    /*
     * If the fragments concatenated to an mbuf that's
     * bigger than the total size of the fragment, then and
     * m_ext buffer was alloced. But fp->ipq_next points to
     * the old buffer (in the mbuf), so we must point ip
     * into the new buffer.
     */
    if (m->m_flags & M_EXT) {
        int delta = (char *)q - m->m_dat;
        q = (struct ipasfrag *)(m->m_ext + delta);
    }

这个漏洞在于计算变量delta的值有问题,而上面这个代码假定了第一个分片数据包不会在external buffer中分配(m_ext)。 当分片数据在mbuf-> m_dat(q将在m_dat内)时,计算q-m-> dat有效(q是包含分片链表和数据包数据的结构)。

否则,如果分配了m_ext缓冲区,则q将位于external buffer ,那么delta的计算就是错误的。

q的数据结构是ipasfrag:就是有一个前向指针跟后向指针,以及包含了一个ip头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
 * Ip header, when holding a fragment.
 *
 * Note: ipf_link must be at same offset as frag_link above
 */
struct ipasfrag {
    struct qlink ipf_link;
    struct ip ipf_ip;
};

struct qlink {
    void *next, *prev;
};

我们可以调试看看q的某个时刻的状态是怎样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gdb-peda$ p *q
$30 = {
  ipf_link = {
    next = 0x7f9e08084ed0,
    prev = 0x7f9e0808487c
  },
  ipf_ip = {
    ip_hl = 0x5,
    ip_v = 0x4,
    ip_tos = 0x0,
    ip_len = 0x8,
    ip_id = 0x7f3a,
    ip_off = 0x8,
    ip_ttl = 0x40,
    ip_p = 0x1,
    ip_sum = 0x95e3,
    ip_src = {
      s_addr = 0xf02000a
    },
    ip_dst = {
      s_addr = 0x202000a
    }
  }
}

可以看到确实是两个ipasfrag前后指针还有ip头信息

我们继续调试运行到下面地方

我们查看下数据结构,可以看到确实此时的q在m_ext的后面,而m_dat在老前面了,那么q - m->m_dat就是负数了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gdb-peda$ p q
$41 = (struct ipasfrag *) 0x7f9e0808882c
gdb-peda$ p *m
$42 = {
  m_next = 0x7f9e080881a0,
  m_prev = 0x7f9e080874c0,
  m_nextpkt = 0x0,
  m_prevpkt = 0x0,
  m_flags = 0xd,
  m_size = 0xcde,
  m_so = 0x0,
  m_data = 0x7f9e08088850 "",
  m_len = 0xc98,
  slirp = 0x563aa67a6380,
  resolution_requested = 0x0,
  expiration_date = 0xffffffffffffffff,
  m_ext = 0x7f9e08088810 "",
  m_dat = 0x7f9e08086eb0 ""
}
gdb-peda$ p *q
$43 = {
  ipf_link = {
    next = 0x7f9e0808487c,
    prev = 0x7f9e08087520
  },
  ipf_ip = {
    ip_hl = 0x5,
    ip_v = 0x4,
    ip_tos = 0x1,
    ip_len = 0xc90,
    ip_id = 0x7f3e,
    ip_off = 0x0,
    ip_ttl = 0x40,
    ip_p = 0x1,
    ip_sum = 0x1c43,
    ip_src = {
      s_addr = 0xffffff8b
    },
    ip_dst = {
      s_addr = 0x0
    }
  }
}

简单的示意图如下:(忽略了分配了m_ext缓冲区,则q将位于external buffer)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+------------------------------+
|                              |
|                              |
|                              |
|                              |
| m_dat 0x7f9e08086eb0         |
|                              |
|                              |
+------------------------------+
|                              |
|m->m_ext 0x7f9e08088810       |
|                              |
|                              |
|q 0x7f9e0808882c              |
|                              |
|                              |
|                              |
+------------------------------+

之后,新计算的指针q被转换为ip结构并且修改部分字段。由于错误地计算了delta,ip将指向不正确的位置,并且ip_src和ip_dst可用于将我们可控的数据写入错误计算的ip的位置。 如果计算出的ip位于没有映射的内存区域,这就会使qemu崩溃。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slirp/src/ip_input.c:ip_reass
    ip = fragtoip(q);   //转换
    ip->ip_len = next;
    ip->ip_tos &= ~1;
    ip->ip_src = fp->ipq_src;
    ip->ip_dst = fp->ipq_dst;

参考

https://blog.bi0s.in/2019/08/24/Pwn/VM-Escape/2019-07-29-qemu-vm-escape-cve-2019-14378/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FL Studio21中文版水果编曲DJ软件
FL Studio21,中文名“水果音乐工作室”,零基础也能帮你实现音乐梦想!作为一款全能型的音乐制作软件,该软件具有集录音、剪辑、编曲为一体的音乐创作界面,其中包括80多种乐器和效果插件,涵盖自动化,样本回放/操纵,合成,压缩,延迟,均衡滤波,镶边,定相,合唱,混响,失真,位破碎等,更强大的是,它本身也可以作为插件,在Cubase、Logic、Orion等软件中使用。对于唱作人来说,一款优秀、全能的音乐制作软件,能帮助他们在创作上获得更多的灵感、以及为歌曲带来更多的变化。能够支持制作各种音乐类型,除了擅长的电子音乐制作以外,还可以创作任何风格的流行音乐、古典音乐、民族音乐、乡村音乐、爵士乐等等,不会受到音乐类型的限制,让你的音乐突破想象力限制。并且用户还可以通过该软件的MIDI连接器,为歌曲录制吉他、钢琴等音乐素材,丰富歌曲的层次感。
用户7442547
2023/03/13
9290
FL Studio2023免费升级到21中文版本
电音制作,自然少不了适合做电音的软件,市面上可以进行电音制作的软件不少,可是如果在这些软件中只能选择一款的话,想必多数人会把票投给编曲软件FL Studio,毕竟高效率是永远不变的真理,今天就让我们来看看如何用音乐编曲软件FL Studio做电音吧!FL Studio21绿色版本下载末尾查阅!
用户7442547
2022/11/22
7700
FL Studio21中文版DAW数字音频工作站
编曲是通过DAW(数字音频工作站软件)完成的,也就是我们常说的宿主软件。现在有很多优秀的宿主软件,例如Cubase、Studio One、FL Studio等。
用户7442547
2023/03/04
3990
FL Studio水果最新21版本下载新版功能讲解
Image Line的FL Studio是软件领域的一股重要力量,在更广泛的意义上被称为“DAW”(数字音频工作站),包括从“软件槽盒”到“音乐制作中心”再到“影视后期制作”的所有内容。
用户7442547
2022/11/04
4920
FL Studio21.0.0中文最新版更新内容介绍
FL Studio 21.0.0官方中文版重磅发布纯正简体中文支持,更快捷的音频剪辑及素材管理器,多样主题随心换!Mac版新增对苹果M2/1家族芯片原生支持。编曲、剪辑、录音、混音,20余年的技术积淀和实力研发,FL Studio 已经从电音领域破圈,成功蜕变为瞩目的全能DAW,把电脑变成全功能音乐工作室,接下来我们会为您一一展示!
用户7442547
2023/03/04
9770
FL Studio21水果软件有哪些新的功能优化?
首先是FL Studio(以下简称FL)的逻辑和其它宿主软件都不太一样,FL的逻辑就与众不同。FL的逻辑也可以分为三部分:通道机架、混音台和播放列表。在Live里每个发送轨都可以插入一个乐器以及若干个效果器。你有200个发送轨,你就可以插入200个乐器,和200*n个效果器。但是FL不是这样。在FL里,通道机架挂载乐器,乐器需要在通道机架上链接至混音台,才能在混音台上挂载效果器,否则该乐器将直接被发送到混音台的Master轨道,也就是主轨。这样一看好像也没问题,但是当工程大起来的时候,FL的短板就会明显起来。首先是FL的混音轨道只有125个,一旦需要添加效果器的乐器/采样增多,混音轨道就很可能不够用。其次FL中每个混音轨道只有10个插槽,也就是说,在不借助第三方效果器链插件的情况下,只能放置至多10个效果器,这对于一些需要探索极限搞音色设计的用户来说是难以接受的(例如Skybreak喜欢一个音色砸10个Disperser上去233)。
用户7442547
2023/01/31
1K0
Logic Pro X for Mac(专业级音频制作软件)
Logic Pro X 是苹果公司推出的一款专业音频制作软件,适用于 macOS 平台。它是 Logic Pro 系列软件中最新版本,提供了丰富的音乐制作工具和强大的录音、混音、编曲和效果处理功能。
Mac小小心
2023/04/24
4890
Logic Pro X for Mac(专业级音频制作软件)
Image Line FL Studio v21.0.3.3517 Producer版全插件版WIN免费下载完整版
原文链接:https://blog.csdn.net/tubage2023/article/details/132130229
用户10542704
2023/08/06
3490
Image Line FL Studio v21.0.3.3517 Producer版全插件版WIN免费下载完整版
水果编曲软件FL Studio 21中文版功能介绍/下载/安装/激活图文教程及配置要求
各位,大家好,今天兔八哥给大家带来最新最新2023水果编曲软件FL Studio 21中文版下载安装激活图文教程。我们一起先了解一些FL Studio 。FL Studio21是目前流行广泛使用人数最多音乐编曲宿主制作DAW软件,这款软件相信广大网友并不陌生,今天带来的是FL Studio 21中文版本,所有的功能都能在线编辑,用户直接就能操作,同时因为是水果FL Studio V21.0.2.3399是最新版,所以增加了新的功能,拥有八十多种乐器和效果插件,还包括效果链、音频发送、侧链控制、高级自动化、插件延迟补偿等,帮助用户制作出更加流行的音乐作品。
用户9208731
2023/03/12
1.8K1
水果编曲软件FL Studio 21中文版功能介绍/下载/安装/激活图文教程及配置要求
Image Line – FL Studio v21.0.3.3517 – Producer版全插件版免费下载完整版
Image Line – FL Studio v21.0.3.3517 – Producer版全插件版WIN免费下载完整版是最好的DAW 为 Windows 提供世界上最好的音乐
用户10371284
2023/07/24
5150
Image Line – FL Studio v21.0.3.3517 – Producer版全插件版免费下载完整版
什么是FL Studio水果音乐制作软件
如今,越来越多的音乐人选择使用音乐制作软件来进行音乐的创作,一台电脑、一款软件以及一个外接MIDI就是一个小型的音乐工作站。FL Studio成了音乐界萌新的首选,目前最新的版本为FL Studio21.0.3.3517版本。
用户10623414
2023/07/25
4400
什么是FL Studio水果音乐制作软件
如何自己编曲做歌 可以写歌作曲的软件有哪些。DAW宿主软件FL Studio怎么样?
如何自己编曲做歌?新手学习制作原创音乐推荐从电子音乐、Beats入手。可以写歌作曲的软件有哪些?市面上几款宿主软件都可以轻松完成写歌作曲工作,例如FL Studio、Cubase、Ableton Live等。
用户10371284
2023/03/16
9430
如何自己编曲做歌 可以写歌作曲的软件有哪些。DAW宿主软件FL Studio怎么样?
编曲宿主DAW是什么 编曲宿主软件哪个好用
编曲宿主DAW是什么?宿主软件,全名数字音频工作站,英文简写为DAW。编曲宿主软件哪个好用?不同的宿主软件各有特点,我们可以根据自己的不同需求来进行选择。
用户9208731
2022/12/06
2.3K0
编曲宿主DAW是什么 编曲宿主软件哪个好用
FL Studio水果21最新中文版详细功能介绍
水果具有独特的底层逻辑,其开创了编曲“块”的思维。用FL Studio编曲的流程是在把一个样式编辑好,然后将编辑好的样式当做音频块,在播放列表中像“搭积木”一样任意编排,形成一首歌,这种模式非常利于电子音乐编曲。
用户7442547
2023/03/06
4.6K0
FL Studio 21测试版更新、新功能和AI智能编曲插件
FL Studio 21测试版已经发布,有许多令人兴奋的新更新和插件可供用户使用,以帮助他们创建和工作流程。新功能是由一个专注于开发新插件的团队创建的,而不是FL Studio本身的团队。
用户9208731
2022/11/21
5720
FL Studio 21测试版更新、新功能和AI智能编曲插件
FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版
原文链接:https://blog.csdn.net/tubage2023/article/details/132127953
用户10542704
2023/08/06
3880
FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版
FL Studio2023高级版本下载FL21版本水果软件
如果你正在学习或正想要学习编曲,如果你有一台电脑,那么你只需要准备以下几个工具就可以开始编曲制作学习之旅啦。本次将为你带来“编曲小白设备编曲软件”包括了DAW的选择,及其他需要用到的编曲设备清单,你想要知道的内容以及你还没有想到的问题,都会一一为你解答。帮助你从音乐制作新手走向专业制作人,你不必买昂贵的设备,也不必具备音乐天赋——您所需要的只是对制作音乐的热爱。
用户7442547
2022/12/05
4120
Fruity Loops Studio2023水果软件有什么新功能?
在我看来软件只是工具.不管哪个都可以做任何风格的音乐,区别只是软件操作相对而言fl studio更容易上手,在国内也很受欢迎,弱项应该是混音上如果你做电音的话 还是FL更好一些 ,因为他就是为舞曲而生的!flstudio内配置音源、插件、录音软件、混音效果!而FLStudio则更偏向于电子音乐的创作和编配,是电子音乐创作者更喜欢的DAW。
用户7442547
2022/11/21
6200
强大的cubase编曲音乐软件中文版,cubase软件下载安装教程
Cubase中文版是一款非常专业的音乐制作软件,凭借其无与伦比的灵活工具,用户可以快速和直观地创造任何类型的音乐。此外,Cubase中文版还支持环绕声混音,全参数自动控制,使工作更加自由、更加方便、更加简单。
用户10436734
2023/04/01
9150
强大的cubase编曲音乐软件中文版,cubase软件下载安装教程
FL Studio最新版20.9水果软件安装教程
FL Studio随着近年来摇滚、电音的发展,越来越多的人开始对电子音乐编曲感兴趣,而电音编曲的首要条件,就是需要一个好的DAW(数字音频工作站),常用的DAW有很多,例如Cubase、Nuendo、Pro Tools、 SONAR等等,但以小编的个人体验感而言,最顺手的还是FL Studio。
用户7442547
2022/06/01
1.5K0
推荐阅读
相关推荐
FL Studio21中文版水果编曲DJ软件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验