Ping死你! | Apple CVE-2018-4407 内核漏洞利用与修复

发表于:2018-10-31 14:08:22 来源:  安全客 阅读数(0人)



写文档没保存啊?来来来,我帮你关电脑


昨天Kevin Backhouse发布的一条推特火了,他在推特中提到,只要利用CVE-2018-4407的PoC就可以使同一Wifi下的macOS High Sierra与iOS11设备崩溃,同时附带了16秒的小视频演示。


实际上这是昨天Apple发布的更新回顾中提到的漏洞,这个漏洞作者已经及时上报给了Apple并在iOS12(9月17日)和macOS Mojave(9月24日)系统更新中已经修复完成。




Kevin Backhouse在博客中简单分析了漏洞


CVE-2018-4407是Kevin发现的XNU系统内核中的堆缓冲区溢出漏洞,Apple把它分为了远程代码执行漏洞,攻击者有可能利用缓冲区溢出进行远程代码执行。不过目前Kevin给出的PoC仅仅是造成系统崩溃重启。


漏洞影响范围


iOS11及早期版本所有设备


MacOS High Sierra 10.13.6及早期版本所有设备


漏洞严重性及防护措施


该漏洞是XNU系统内核中网络部分堆缓冲区溢出,因此会同时影响macOS和iOS。要触发该漏洞,攻击者也只需向目标设备发送特殊数据包即可。(当然,需要和目标设备处在同一网络下)但是处在同一网络下并发现设备对攻击者来说是较为容易做到的,更不用说可能造成的远程代码执行,因此这个漏洞潜在危害还是蛮高的。同时,目前基本所有杀毒软件都没法防御这种攻击。


针对此攻击的防护除了更新外只有一种方法,那就是开启macOS防火墙设置中的拒绝全部连接。


漏洞产生


错误产生于icmp代码模块中(bsd/netinet/ip_icmp.c:339)


m_copydata(n, 0, icmplen, (caddr_t)&icp->icmp_ip);

这段代码处于icmp_error函数中,注释中可以看到它是为了在收到损坏数据包时生成一个报错数据包,并通过ICMP协议返回。上文函数目的是将损坏数据包的报头复制到ICMP消息中,但报头如果过大的话,就会导致缓冲区mbuf出现问题。(mbuf是存储出入站数据包的数据类型)。在这部分代码中,n为入站数据包,m为出站ICMP数据包,而m在294-296行进行内存分配。


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);

接着在314行通过mtod得到m数据指针


icp = mtod(m, struct icmp *);

mtod是宏命令,因此不会检查mbuf大小是否合适,数据也并未复制到icp,而是到了&icp->icmp_ip,即icp + 8 bytes。


不过作者没再继续单步调试,基于源码的分析,作者认为m_gethdr创建mbuf可容纳88字节,并通过实验发现触发缓冲区溢出时icmplen大于等于84即可。




参考链接


https://twitter.com/kevin_backhouse/status/1057352656560287746


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


相关新闻

大家都在学

课程详情

信息安全意识教育

课程详情

小白入门之旅

课程详情

信息安全基础