让 iPhone “崩溃” 又有了新方法:只需要一个视频

作者:马彬

导语

一则新闻“ iOS 又曝新漏洞,播放特定视频导致自动关机 ”在媒体上广泛传播,实际上玄武实验室在10月15日就发现了该视频样本,在深入分析后,我们在微信后台对能够触发这种漏洞的恶意视频进行检测和拦截,保护了大量用户免遭攻击。

一、 概述

11月23日,一则新闻“iOS又曝新漏洞,播放特定视频导致自动关机”在媒体上广泛传播。任何苹果设备在播放某个视频后,就会在几秒内卡死,无法响应任何操作,持续3-5分钟后整个系统自动重启。由于从iOS 5到最新的iOS 10.1系统都会受到影响,且部分媒体贴出了恶意视频样本,一时间这个恶意视频被通过各种渠道大范围传播。

我们实验室在10月15日捕获了该恶意视频样本。经过深入分析,我们写出了针对该漏洞的检测工具,并通过我们实验室和微信安全中心的相关合作项目,在微信后台对该恶意视频进行检测和拦截,保护了大量用户免遭攻击。

苹果在刚刚发布的iOS 10.2中除修复我们实验室报告的8个漏洞之外,也已经修复了该漏洞,因此在这里分享一下我们对这个问题的研究。

二、 分析

1. 排查原因

我们拿到的样本是一段秒拍的视频,自然首先想到可能是秒拍的问题或者人为的利用iOS 0day构造传播。考虑到视频中嵌有作者信息,因此我们找到视频的作者,用该作者的其他视频进行播放测试。在作者发布的仅有的3个视频中,均使用同样的视频模版,视频长度也几近相同。我们进行对比播放后,发现只有样本视频会crash,其他视频均播放正常。考虑到视频样本在秒拍上的转发量较小,因此排除人为构造的情况。

进一步的使用010editor对比两个mp4文件,除了Duration字段和mdat(编码后的视频数据区)内容区别外,其他文件头字段内容均相同。因此排除了视频文件格式的问题,我们基本确定问题出在iOS的硬解码处理上。

2. 分析原因

为了分析清楚问题原因,我们对H264的文档进行了非常艰苦的学习。

在H.264中,图像以frame为单位进行组织,即我们平时所说的“帧”。每一个frame的数据可以分为多个slice(片),片分为I片、B片、P片,slice header和data通过NAL进行封装。一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像,H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。每一个slice又由多个MB(宏块)组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。如下图所示,视频数据经过层层编码成为了mp4文件中的mdat数据,因此h264的解码也要经过frame decode、NAL decode、Slice decode、MB decode等等,中间还会有熵解码、帧内预测等各种复杂的流程,会导致非视频行业人员理解起来非常抽象和困难。

在熟悉了H264编码相关知识后,我们发现问题可能出在视频样本的第126帧,对应的数据如下图。其中”00 00 00 C5“代表了NAL单元的长度,”05“代表了第一个Slice 为IDR Slice,之后的数据为slice data。

H264解码时会进行宏块预测,在宏块预测的时候需要用到当前宏块左边、上左、上边,上右位置的宏块有关的信息,因此在预测前需要先填充这些信息。如果填充完成后没有对宏块是否可用检测,在不可用的block上进行帧预测,就会发生错误。

而该视频的第126帧数据的偏移0xED(11101101)和0xFF(11111111)两个字节恰好会导致解码过程出现上述错误。采用哥伦布编码方式对其进行解码运算后,对按照特定方式进行填充cache,进而导致top block不可用。通过010editor把ED和FF改为E0和00后, 我们将修改后的视频用iOS设备测试发现并不会crash,因此确认问题出现在ED和FF这两个字节。

3. 将任意mp4畸形化

上述视频样本是由于ED和FF两个字节导致的crash,那么是不是在任意帧内加入ED和FF两个字节就会触发漏洞呢?

答案是否定的。由上述分析可知,根本原因是MB中的top block或left block不可用才导致的crash,因此必须在熵解码时候对应的字节处修改,而且不一定必须修改为ED和FF两个字节。

将恶意视频的那一帧直接拷贝到一个正常的视频中也是不可行的,这是因为iOS视频解码部分还会对帧的长度进行判断,最重要的是解码过程中还要受SPS和PPS影响,当两个视频的SPS和PPS不同时,解码时就会有差异。

在研究中,我们写了一个自动化的工具,能够很快的将一个任意mp4变成攻击视频,而且不影响视频的播放画面。考虑到iOS 10.2刚刚推出,还有很多人未更新,这种危险的东西就不分享出来了。

三、 检测

基于上述分析,开发出100%检测率的工具并不困难。但由于恶意字节可能出现在视频的任意一帧中,因此检测工具需要逐帧解析,因而理论上如果要确保100%的检测率,就不可能实现很高的检测效率。于是我们基于实际运营中遇到的情况,针对流行样本变异规律,开发出了既能应对各种变种样本,又有极高检测效率的轻量型的检测工具,平衡了准确率和检测效率,取得了较好的效果。在开发机上基于1000个mp4文件作测试,平均每个检测时间0.003秒。以最大视频19M为例(微信最大支持20M),检测只需要0.22秒。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏磐创AI技术团队的专栏

DrQA基于维基百科数据的开放域问答机器人实战教程

【磐创AI导读】:本文主要向大家推荐一个开放域问答机器人的实战项目。欢迎大家点击上方蓝字关注我们的公众号:磐创AI。

591
来自专栏量子位

摄像头训练的吃豆人,我还是没活几集 | TensorFlow.js

上个周末,面向JavaScript开发者的TensorFlow.js在TF开发者峰会上发布。

672
来自专栏人工智能头条

用机器学习怎样鉴别不可描述的网站

前两天教师节,人工智能头条的某个精神股东粉群里,大家纷纷向当年为我们启蒙、给我们带来快乐的老师们表达感激之情。

1052
来自专栏大数据文摘

视频更新|斯坦福CS231n深度学习与计算机视觉课时12-神经网络训练细节part2(下)

1785
来自专栏IT大咖说

Apache顶级开源项目——机器学习库MADlib简介与应用实例

摘要 Apache MADlib是Pivotal与UCBerkeley合作的一个开源机器学习库,提供了精确的数据并行实现、统计和机器学习方法对结构化和非结构化数...

3328
来自专栏企鹅号快讯

Unity机器学习代理ML-Agents v0.2版本发布

Unity机器学习代理最新版ML-Agents v0.2现已发布!在本版本里,我们作了以下改进: 为Unity SDK和Python API增加了新特性 更多新...

3506
来自专栏人人都是极客

基于树莓派和Tensowflow的物体识别-brain

近来这篇文章很火:How to build a robot that “sees” with $100 and TensorFlow (作者是Lukas,Cro...

39710
来自专栏企鹅号快讯

Apache顶级开源项目——机器学习库MADlib简介与应用实例

内容来源:2017年11月4日,Pivotal Greenplum Madlib研发工程师梅靖怡在“Greenplum和机器 学习客户研讨会”进行《Machin...

27610
来自专栏新智元

【44.99美元】谷歌推出树莓派计算机视觉盒子,自己动手组装深度学习套件

来源:blog.google 编译:弗格森 【新智元导读】 谷歌为树莓派制作了一个具有设备上的神经网络加速功能的套件,在没有云连接的情况下提供强大的计算机视觉能...

38912
来自专栏大数据挖掘DT机器学习

Microsoft 时序算法——结果预算+下期彩票预测篇)

前言 本篇我们将总结的算法为Microsoft时序算法的结果预测值,是上一篇文章Microsoft时序算法的一个总结,上一篇我们已经基于微软案例数据库的销售历史...

4465

扫码关注云+社区