GIF表情引发微信闪退?这里有最强技术分析

  5 月 17 日左右,微信群中出现了可使 iOS 版微信闪退的 GIF 表情,雷锋网(公众号:雷锋网)今早报道了关于该事件的大致情况。5 月 26 日傍晚,360 安全研究员宋申雷对雷锋网表示,微信知道这个漏洞两周了,但是拦截策略依然不行,第一个 crash 出现时就对样本做了 hash 拦截,这都两周了,改一个字节的版本都有多少个了。此外,他还指出,现在不在原图改字节了,直接把有漏洞的最后一帧构造到任意的 GIF 中。

  为了更好地促进读者了解其中的机制,360NirvanTeam 对于此事件进行了具体的技术分析。

  本文作者「360 涅槃团队的安全研究员王兆威」,授权雷锋网发布。

  一、背景情况

  5 月 17 日起,在各个微信群中流传着一个天线宝宝的 GIF 表情。在 iOS 版的微信上,只要打开了包含这个 GIF 表情的聊天窗口,就会造成微信闪退。

  在进行具体分析之前,对崩溃原因进行了猜测:(1)iOS 系统自带 GIF 解析功能存在问题;(2)微信自己实现 GIF 解析的功能,由于对输入数据的校验不严格,导致异常。经过测试,发现 iOS 版 QQ 不受影响,因此可以排除 iOS 的 GIF 解析问题。

  二、原因分析

  1. 样本精简

  初始的 GIF 样本有 1MB 之多,不利于定位引起问题的具体数据,因此我们需要对样本进行精简。通过 010 Editor 打开原始样本 GIF,利用 GIF 模板解析,发生解析异常,这就表示样本 GIF 的格式存在问题。

  从模板解析的情况显示,在 38 帧正常的图片数据后,出现了异常的数据。如图所示,因此我们将正常数据部分移除,仅保留异常数据,进行下一步精简。

GIF表情引发微信闪退?这里有最强技术分析

  可以看到,剩余的异常数据的部分有 10 多万个,通过二分法的方式进行测试和排除。具体就是,删除一半后,测试另外一半是否可以导致崩溃。如果崩溃了,说明引起异常的数据在保留的一半中,反之则说明在删除的部分中。

GIF表情引发微信闪退?这里有最强技术分析

  经过不断的排除后,发现异常的数据就在下图的紫色部分中。只要带有 GIF 的图像数据部分带有这些异常数据,就会导致 iOS 微信闪退。 

GIF表情引发微信闪退?这里有最强技术分析

  2. 调试分析

  经过样本精简,我们已经发现了引起异常的数据位置。那么,现在就需要结合实际的调试,来确定实际引起异常的数据。以 iOS 微信 6.5.7 版为例,崩溃发生时的调用栈如下,崩溃发生于微信内部,说明是微信自身的 GIF 解析功能存在问题。

GIF表情引发微信闪退?这里有最强技术分析

  经过对相关函数的逆向分析,最终确定了引起异常的数据。首先来观察 sub_100B6CBF0 这个函数,对于 GIF 中的数据进行循环查找,如果存在 0x21 和 0xF9,那么当前数据就表示是一个 GraphicControlExtension 结构,并接着对 GraphicControlExtension 数据进行解析。 

GIF表情引发微信闪退?这里有最强技术分析

GIF表情引发微信闪退?这里有最强技术分析

  如果当前查找到的数据为 0x2C,就表示搜索到了一个 ImageDescriptor,跳出 while 循环,进行实际图片数据的解析。这里也就是异常数据的起始位置! 

GIF表情引发微信闪退?这里有最强技术分析

  正常的帧数据的 ImageDescriptor 数据如下:

GIF表情引发微信闪退?这里有最强技术分析

  而引起异常的数据中,恰好存在 0x2C 这个关键的分隔符,导致下述红框中的数据被解析成了一个 ImageDescriptor。可以看到,ImageWidth 属性为0,ImageHeight 属性为 0x100。

GIF表情引发微信闪退?这里有最强技术分析

GIF表情引发微信闪退?这里有最强技术分析

  接下来,这部分异常的数据就会进入 sub_100B6CE90 函数进行解析。由于 ImageWidth 为0,导致与 ImageHeight 相乘后等于0,在 new buffer 时,传入的大小参数为0,这是第一个问题,但这并不会导致闪退,仍然可以分配一个很小的堆块。

GIF表情引发微信闪退?这里有最强技术分析

  引起崩溃的代码如下,在 else block 中,sub_100B6C4F0 的作用没有具体跟踪,猜测是进行 lzw 解压缩,并返回解压缩后的数据长度 v21。由于 v10 = 0x0000010000000000,截断成 unsigned int 后为0,这就导致 v10 – 1 – v21 为负数,作为 memset 第三个参数,相应的 unsigned int 形式就是一个很大的正数。在 memset 时,就会导致崩溃,这是第二个问题。

GIF表情引发微信闪退?这里有最强技术分析

  三、总结

  这个问题的根本原因是由于微信实现了自己的 GIF 解析功能,但由于对输入数据的校验不严格,导致异常的数据被解析,引起崩溃。

  在 5 月 17 日当天,这个 GIF 开始流传后,微信似乎在服务器端做了屏蔽,使得这个 GIF 无法被正常接收。但我们只要随便修改一下 GIF 中的任意一个字节,就能绕过这个屏蔽措施。同时由于 iOS 应用上架需要经过苹果审核,需要额外耗费一定时间。这就使得这个 Bug 即使修复后,所有用户也无法立刻更新。目前最新的 iOS 微信 6.5.8 版本仍然存在崩溃的问题。

PS:如果您想和业内技术大牛交流的话,请加qq群(527933790)或者关注微信公众 号(AskHarries),谢谢!

转载请注明原文出处:Harries Blog™ » GIF表情引发微信闪退?这里有最强技术分析

赞 (0)

分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址