Android漏洞——将Android恶意代码隐藏在图片中
研究人员发现了Android上又一个严重的安全漏洞:将Android恶意代码隐藏在图片中(Hide Android Applications in Images)。
在该漏洞向外界公开之前,Google已经发布了补丁。不过,仍然有大量Android手机用户没有选择升级。
恶意程序研究人员Axelle Apvrille和逆向工程师Ange Albertin开发了一种定制的工具AngeCryption(Python脚本)加密恶意程序的APK文件(Android application package),使恶意的APK看起来像一个有效的PNG图像文件(其它图像格式也可以),他们之后又创建了另一个APK文件,能解密和安装加密的图像文件。

AngeCrypt使恶意软件包看起来像一个正常的图片
恶意程序因为加了密,所以杀毒和安全工具无法检测出。在测试中,他们的合法墙纸应用在试图安装恶意应用时会弹出权限请求。
研究人员声称可以通过使用DexClassLoader防止权限请求窗口出现。
相关知识点介绍
密码学中,块密码的工作模式允许使用同一个块密码密钥对多于一块的数据进行加密,并保证其安全性。块密码自身只能加密长度等于密码块长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据也需要使用合适填充方式将数据扩展到符合密码块大小的长度。一种工作模式描述了加密每一数据块的过程,并常常使用基于一个通常称为初始化向量(IV,Initialization Vector)的附加输入值以进行随机化,以保证安全。
初始化向量(IV,Initialization Vector)是许多工作模式中用于随机化加密的一块数据,因此可以由相同的明文,相同的密钥产生不同的密文,而无需重新产生密钥,避免了通常相当复杂的这一过程。
密码块链接(CBC,Cipher-block chaining)模式。在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。

若第一个块的下标为1,则CBC模式的加密过程为
- Ci=EK(Pi⊕Ci−1),C0=IV
而其解密过程则为
- Pi=DK(Ci)⊕Ci−1,C0=IV
没有一点小窍门,我们是不能将一个给定的文件加密成图片文件的。AngeCryption是如何工作的呢?
一个PNG文件的格式如下:

PNG文件格式
我们要得到一个PNG文件,文件格式必须包括以下几个部分:
文件头. PNG以固定的8字节'signature'标识开头:0x89 PNG 0x0d 0x0a 0x1a 0xa.为了识别为一个有效的PNG文件,这8字节必须是正确无误的。
垃圾数据块:我们把代码插入到这里,工具会把它忽略而将文件识别为图片。
每个数据块由4个部分组成,如下:
| 名称 | 字节数 | 说明 |
| Length (长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过(231-1)字节 |
| Chunk Type Code (数据块类型码) | 4字节 |
数据块类型码由ASCII字母(A-Z和a-z)组成 我们使用一个虚假的类型使工具忽略这个数据块 |
| Chunk Data (数据块数据) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
| CRC (循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。但是事实上图片识别工具在这方面并没有做出严格的限制。
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。
图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
为了得到这样的一个文件,我们需要这样做:
(1)选择一个合适的IV. 我们希望我们的第一个加密块C1与PNG文件的“文件头 (8 bytes) + 数据块长度(4 bytes) + 数据块类型码(4 bytes)”相等,碰巧这也与AES块大小相同(16字节长)。另外,我们知道P0为输入文件(被隐藏文件)的第一个区块,我们也知道K的值。所以, 我们可以以下面的方式选择IV:

换句话说,要选择合适的IV,必须获取我们需要的第一个加密块。注意在真实的案例中,IV是随机选择的。
(2)生成一个修改了的输入文件,在文件末尾附加了一些数据,这些数据是解密的“CRC32检验码+ 目标图片文件块+ 结尾数据块”。为什么要这样做呢?因为当我们加密这些解密的数据就能获取到原始的数据,也就是说如果我们加密这些解密的图像数据块,我们就获得了原始的图像数据块。


注意,AngeCryption独立于AES,CBC和PNG。它只是要求:
- 第一个密码块是可控的;
- 源文件格式是可以容忍附加数据的;
- 文件头和数据块的数据大小与块大小相吻合。
AngeCryption工具的下载地址:http://corkami.googlecode.com/svn/trunk/src/angecryption/angecrypt.py
使用方法:python angecrypt.py inputfile targetimage modifiedinput key algorithm
- inputfile:欲加密的文件
- targetimage:加密后的目标格式,如PDF, PNG, JPG, FLV等
- modifiedinput:被angecrypt.py修改后的输入文件
- key:加密key
- algorithm:当前为AES128-CBC或3DES-EDE2-CBC, 无填充。

另外还有一种隐藏代码到图片的原理在文章《一种在图片里隐藏你的程序代码的技术》有介绍。
相关资料:https://www.blackhat.com/docs/eu-14/materials/eu-14-Apvrille-Hide-Android-Applications-In-Images.pdf
Android漏洞——将Android恶意代码隐藏在图片中的更多相关文章
- 【CISP笔记】安全漏洞与恶意代码(1)
恶意代码 类型二进制代码.脚本语言.宏语言等表现形式病毒.蠕虫.后门程序.木马.流氓软件.逻辑炸弹等 恶意代码的传播方式(1)移动存储 自动播放功能.Windows默认.自动执行autorun.inf ...
- 【Android漏洞复现】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗
文章作者MG1937 CNBLOG博客:ALDYS4 QQ:3496925334 0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android ...
- 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...
- Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
原文:Codelab for Android Design Support Library used in I/O Rewind Bangkok session--Make your app fanc ...
- Android 命名规范 (提高代码可以读性)
android文件众多,根据名称来辨别用途很重要,因此命名要规范 这篇文章可参考:Android 命名规范 (提高代码可以读性) 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名 ...
- Android检测网络是否正常代码!
在Android开发中,如果该应用程序需要连接网络请求,那么最好我们先做一个检测网络是否在线的判断,否则程序容易出现卡死或FC等Bug,应该判断如果手机离线则弹出提示让用户检查网络,如果正常则继续执行 ...
- [原创]Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析
主入口为com.android.settings.Settings. 这只是一个wrapper的类, 它继承于 SettingsActivity类,并且声明了一堆公有的继承于SettingsActiv ...
- Android Stduio统计项目的代码行数
android studio统计项目的代码行数的步骤如下: 1)按住Ctrl+Shift+A,在弹出的框输入‘find’,然后选择Find in Path.(或者使用快捷键Ctrl+Shift+F) ...
- Android应用开发中如何使用隐藏API(转)
一开始需要说明的是,Google之所以要将一些API隐藏(指加上@hide标记的public类.方法或常量)是有原因的.其中很大的原因就是Android系统本身还在不断的进化发展中.从1.0.1.1到 ...
随机推荐
- css 解决图片下小空隙问题
http://baijiahao.baidu.com/s?id=1581004863053583633&wfr=spider&for=pc 这篇讲的挺清楚,也有解决办法
- Dynamics 365Online 通过插件中的retrievemultiple消息来过滤产品视图
本篇中要讲的是对产品视图基于某个条件进行过滤显示,而手段就是通过插件中的retrievemultiple消息,可能很多人都写过对它都不陌生. 先来看张插件注册的截图,插件的message是retrie ...
- 前端开发笔记(3)css基础(中)
上一篇中我们学习了html的标准文档流,下面我们先来看看如何脱离标准流. 脱离标准流 css中一共有三种方法脱离标准流 浮动 绝对定位 固定定位 浮动 我们要搞清楚什么是浮动,先来看一个标准文档流的例 ...
- php对文件的操作
如何让自己磁盘中的文件夹和目录显示在网页上?那就来看一下,用php是怎么来操作他们的吧 php中文件,一般包含两块内容,文件和目录先来一句一句的看代码,及他的作用 运行后看一下结果 file 指的是文 ...
- VMware Linux下拖拽补丁vmtools的安装和卸载
Linux下拖拽补丁vmtools的安装和卸载 by:授客 QQ:1033553122 Vmware 8.0.4为例子 步骤1.VM->Install Vmware Tools... 步骤2.查 ...
- idea 关联 jdk
1.打开IntelliJ IDEA 2.选择 "File" 菜单 3.找到 "other settings" 4.选择 “Structure for new P ...
- StretchBlt和StretchDIBits
StretchBlt:从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩,如果目标设备是窗口DC,则意味着在窗口绘制位图,大致的使用代码如下: void DrawImag ...
- CSS 小结笔记之em
1.为什么使用em em也是css中的一种单位,和px类似.很多人会疑惑为什么有了px之后还要使用em,而且em使用起来相对于px来讲比较麻烦. em主要是应用于弹性布局,下面给出一个小栗子说明em的 ...
- JavaScript动画:offset和匀速动画详解(含轮播图的实现)
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. offset简介 我们知道,三大家族包括:offset/scroll/c ...
- ssh中文手册
ssh-keygen 中文手册 sshd_config 中文手册 sshd 中文手册