CVE-2018-4407缓冲区溢出导致内核崩溃漏洞分析

2018-11-01 / 无评论

CVE-1028-4407是XNU操作系统内核中发现的堆缓冲区溢出漏洞,攻击者只要与受害者处于同一网络,无需任何用户交互,通过发送恶意数据包导致Mac或iOS设备的崩溃和重启。因为该漏洞存在于系统网络核心代码,经测试任何反病毒软件均无法防御。(该漏洞已经成功复现)

Apple公司在iOS12(9月17日)和macOS Mojave(9月24日)系统更新中已经修复完成。

以下操作系统版本和设备易受攻击:

即便是没有打开任何端口,恶意数据包仍然会触发该漏洞。由于攻击者可以控制堆缓冲区溢出的大小和内容,因此他们可能利用此漏洞在目标设备执行远程代码。但是实际上从漏洞种类来看,我觉得该漏洞应该属于DOS漏洞。

漏洞成因

    icp->icmp_code = code;
    m_copydata(n, 0, icmplen, (caddr_t)&icp->icmp_ip);
    nip = &icp->icmp_ip;

函数icmp_error使用该代码,目的是“生成错误数据包,以响应错误的数据包ip”。它使用ICMP协议发送错误消息,引发错误的数据报头包含在ICMP消息中,上述第339行代码调用m_copydata的目的是复制错误数据包的报头到ICMP消息。

问题在于报头对于目标缓冲区来说可能太大了。目标缓冲区是mbuf,mbuf是一种数据类型,用于存储传入和传出的网络数据包。在此代码中,n是一个传入的数据包(包含不受信任的数据),而m是传出的ICMP数据包。我们可以看到,icp是指向m的指针。m在如下进行部署:

    if (MHLEN > (sizeof(struct ip) + ICMP_MINLEN + icmplen))
        m = m_gethdr(M_DONTWAIT, MT_HEADER);    /* MAC-OK */
    else
        m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);

mtod用于获取m的数据指针:

    m->m_len = icmplen + ICMP_MINLEN; /* for ICMP header and data */
    MH_ALIGN(m, m->m_len);
    icp = mtod(m, struct icmp *);
    if ((u_int)type > ICMP_MAXTYPE) {
        m_freem(m);
        goto freeit;

mtod是宏命令,因此不会检查mbuf大小是否合适,数据也并未复制到icp,而是到了&icp->icmp_ip,即icp + 8 bytes。漏洞作者Kevin认为m_gethdr创建mbuf可容纳88字节,并通过实验发现触发缓冲区溢出时icmplen大于等于84即可。

参考链接:

https://lgtm.com/blog/apple_xnu_icmp_error_CVE-2018-4407

无回应:“CVE-2018-4407缓冲区溢出导致内核崩溃漏洞分析”

发表评论

电子邮件地址不会被公开。 必填项已用*标注