研究人员发现了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