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

时间: 2024-10-09 04:34:09

Android漏洞——将Android恶意代码隐藏在图片中的相关文章

Android漏洞——将Android恶意应用隐藏在图片中

研究人员发现了Android上又一个严重的安全漏洞:将Android恶意代码隐藏在图片中(Hide Android Applications in Images). 在该漏洞向外界公开之前,Google已经发布了补丁.不过,仍然有大量Android手机用户没有选择升级. 恶意程序研究人员Axelle Apvrille和逆向工程师Ange Albertin开发了一种定制的工具AngeCryption(Python脚本)加密恶意程序的APK文件(Android application package

Android恶意代码分析与渗透测试

这篇是计算机类的优质预售推荐>>>><Android恶意代码分析与渗透测试> 从环境构建到分析,涵盖服务体系全过程:以线上线下技巧为基础,展现虚拟环境渗透测试真方法 编辑推荐 从环境构建到分析,涵盖服务体系全过程 以线上/线下技巧为基础,展现虚拟环境渗透测试真方法 内容简介 本书由"恶意代码分析"和"移动服务诊断"两大主题组成.各章节包含了分析步骤,作者们还亲自编写了黑客大赛应用程序试题,读者可以借此复习学过的内容. Androi

Android恶意代码编年史

概述 目前Android 已然成为市场占有量最大的移动智能设备平台,同时也成为了移动恶意应用最大的温床,移动互联网的安全无疑已是当今主流安全威胁之一.相比传统PC恶意代码,移动恶意代码的发展更具有爆发性,各种开发技术.攻击技术和防御手段也在更加快速的迭代演变和发展. 统计2011年至今的移动恶意代码病毒库,可以看到 Android 平台下的恶意软件数量增长可谓极其迅速,年份间的数量差距几近鸿沟.从整个移动恶意代码病毒库中,可以发现不少具有典型恶意行为的手机应用软件,从它们身上可以观察到恶意软件发

【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

译者地址:[翻]Android Design Support Library 的 代码实验--几行代码,让你的 APP 变得花俏 原文:Codelab for Android Design Support Library used in I/O Rewind Bangkok session--Make your app fancy with few lines of code 原文项目 demo: Lab-Android-DesignLibrary 双语对照地址: [翻-双语]Android D

android开发——Eclipse环境下代码编辑最常用快捷键集锦(来了就不能空手而归)

Ctrl+D:删除光标所在行 Ctrl+/ :注释选中行 :Ctrl+\:注销选中行 Ctrl+Shift+/:注释选中的java或xml代码块: Ctrl+Shift+\:注销选中的Java或xml代码块.(形式:/*      */ 或 <!--      -->) shift + alt + j或/**+Enter(回车键):添加javadoc头注释,形如/** * * * * * */(个人更习惯用/**+Enter(回车键)) Ctrl+K:向前查找与当前选定内容相同的代码(如查找与

Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

译者地址:[翻]Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏 原文:Codelab for Android Design Support Library used in I/O Rewind Bangkok session----Make your app fancy with few lines of code 原文项目 demo: Lab-Android-DesignLibrary 双语对照地址: [翻-双语]Android

Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究

在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态.本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好.现将针对软键盘的显示/隐藏状态的监听/监控方法做一些总结,以备后用. 一.点击空白处隐藏软键盘 这是具有编辑框焦点的页面对输入法软键盘状态监听的一般需求和解决方法. 首先获得InputMethodManager:        InputMethodManager manager = (InputMethodManager) getS

【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏

转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏 Jul 1, 2015 译者地址:[翻]Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏 原文:Codelab for Androi

Xamarin,mono for android 用一个APP启动其他隐藏应用程序

花费了好几个小时测试最终搞定了,Mono for android用一个APP启动其他隐藏应用程序. 直接看代码: 隐藏APP(被启动)要在manifest文件配置如下,去除原本的两个标签,修改成只有一个data <Activity> <activity android:icon="@drawable/icon" android:label="IOCPDroid" android:name="iocpdroid.IOCPActivity&q