让 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 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

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

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

3836
来自专栏AI研习社

博客 | Github开源人体姿态识别项目OpenPose中文文档

人体姿态识别与估计的应用场景:抖音尬舞机、体育动作教学、3D健身教练、3D试衣、绘画辅助、游戏人物动作采集。

1.3K4
来自专栏数据猿

【每周一本书】之《Microsoft Power BI 数据可视化与数据分析》

【数据猿导读】随着大数据研究热潮的兴起,各种数据可视化图表层出不穷,大数据生动呈现就成为了具有挑战性的工作,随之出现了大量的可视化软件 编辑 | abby 官网...

37611
来自专栏媒矿工厂

TICO : UHD生产系统中的Mezzanine Codec

本帖参考M. Miyazaki等人发表在SMPTE Motion Imaging Journal的文章UHDTV-2 Mezzanine Compression...

2792
来自专栏机器之心

业界 | 英伟达开源硬件加速项目NVDLA:一种标准化的推断加速框架

3619
来自专栏ATYUN订阅号

2017最流行的十大Python库

年末是你需要思考过去一年的成就的时候。对于程序员来说,这通常是回顾今年发布的或者最近流行的开源库,因为它们是解决特定问题的绝佳工具。 在过去的两个多年中,我们都...

4377
来自专栏生信技能树

芯片数据分析,so easy?

我最早接触的高通量数据就是RNA-seq,后来接触的也基本是高通量测序结果而不是芯片数据,因此我从来没有分析过一次芯片数据,而最近有一个学员在看生信技能树在腾讯...

2573
来自专栏ios 技术积累

ios 百度地图设置BMKAnnotationView层级

产品有一个新需求,就是百度地图上显示的BMKAnnotationView,根据数值越大的放在最上层,原因是因为BMKAnnotationView很多并且有重叠的...

3334
来自专栏Albert陈凯

R语言的优劣

https://www.zhihu.com/question/19611094 作者:艾华丰 链接:https://www.zhihu.com/questio...

2603
来自专栏腾讯移动品质中心TMQ的专栏

【Android场景化性能测试】UI流畅度篇

承接《Android场景化性能测试-方向与框架篇》,本篇详述UI流畅度的测试方法,重点在于获得流畅度SM数据之后,如何利用好。

8694

扫码关注云+社区

领取腾讯云代金券