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

相关文章

来自专栏大数据和云计算技术

知识图谱扫盲

近两年来,随着Linking Open Data等项目的全面展开,语义Web数据源的数量激增,大量RDF数据被发布。互联网正从仅包含网页和网页之间超链接的文档万...

5036
来自专栏望昕宇的专栏

Guetzli:谷歌家的东西可能也没有想像的辣么美

这两天笔者的朋友圈被 Google 开源 JPEG 编码器 Guetzli 刷屏,“图片大小减小35%”、“质量不变”这样的字眼刺激了我们的肾上腺,如果这样的神...

1.4K0
来自专栏量子位

谷歌终于推出TensorFlow Lite,实现在移动设备端部署AI

安妮 编译整理 量子位 出品 | 公众号 QbitAI 还得从半年前说起。 今年5月的谷歌I/O大会上,安卓工程副总裁Dave Burke宣布将推出一个专门为移...

2979
来自专栏新智元

【解放程序员】MIT“创世纪”机器学习新系统,自动生成补丁修复Bug

【新智元导读】当您辛辛苦苦写了大半年程序,终于要享受一下国庆长假的时候,别让 bug 把您的假期毁了。MIT 研究团队开发了一个称为“创世纪”的系统,能够对以前...

3245
来自专栏PPV课数据科学社区

解析滴滴算法大赛---数据分析过程

目的和意义 很难有机会接触这么多的实际真实数据。 通过对于这些数据的分析,初步了解大数据的处理方式。 进一步掌握MongoDB的特性,熟练Excel的高级用法。...

34811
来自专栏机器之心

专栏 | 百度PaddlePaddle的新特性与大规模稀疏数据分布式模型训练

百度深度学习框架 PaddlePaddle 自 2016 年开源以来,受到了业界的广泛关注,PaddlePaddle 社区更是汇集了一大批 AI 技术开发者。开...

913
来自专栏嵌入式程序猿

温故而知新

做嵌入式开发控制系统,应该经常会用到PID(比例,积分,微分,proportional,integral,derivative)算法,PID 控制器以各种形...

40013
来自专栏人工智能

深入机器学习系列10-ALS

交换最小二乘 ? 1 什么是ALSALS是交替最小二乘(alternating least squares)的简称。在机器学习中,ALS特指使用交替最小二乘求解...

2136
来自专栏人人都是极客

自动驾驶的模型预测控制

我们实施了一个模型预测控制来驱动赛道上的赛车。但是这一次我们没有交叉错误,我们必须自己计算。另外,在连接延迟之上的执行命令之间有100毫秒的延迟。 这篇文章从非...

5104
来自专栏AI研习社

为什么PyTorch这么火?一线开发者这样说

编者按:2017 年初,Facebook 在机器学习和科学计算工具 Torch 的基础上,针对 Python 语言发布了一个全新的机器学习工具包 PyTorch...

4054

扫码关注云+社区