写文档没保存啊?来来来,我帮你关电脑
昨天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
发表评论
您还未登录,请先登录。
登录