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到 ...
随机推荐
- C# dynamic类型报错:“object”不包含“xxx”的定义
一.起因: 最近在做的一个项目,因为很多地方要用到同一套流程.为了后期维护,要求将共用流程进行抽离,创建为一个公用的类库.在抽离之前程序运行是没有问题的,然而在抽离之后就得到了如题错误: object ...
- Windows7安装 nginx+php 后访问.php文件出现 “No input file specified.” 的解决办法
在Windows7上安装了Nginx+PHP,参考教程为 https://www.cnblogs.com/anlia/p/5916758.html 启动 nginx 后,在浏览器中输入localhos ...
- LeetCode题解之Unique Email Addresses
1.题目描述 2.问题分析 将字符串中的 ‘.’ 去掉,将 ‘+’后面直到‘@’的字符串去掉,然后利用set的特性. 3.代码 int numUniqueEmails(vector<string ...
- windows系统相关命令及问题排查实践
1. 如何查看哪个端口被哪个程序占用? Netstat –ano|findstr "80" ->找到监听80端口的pid tasklist|findstr “<PID号 ...
- HDFS namenode 写edit log原理以及源码分析
这篇分析一下namenode 写edit log的过程. 关于namenode日志,集群做了如下配置 <property> <name>dfs.nameservices< ...
- nopcommerce
nopcommerce是国外的一个高质量的开源b2c网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基 ...
- win10 安装microsoft.net framework3.5
转载于:https://www.windows10.pro/win10-net-framework-3-5/ 之前手残不小心把microsoft.net framework3.5删了,结果导致Sql ...
- Oracle EBS 新增 OAFM 个数
在 $INST_TOP/ora/10.1.3/opmn/conf/opmn.xml中 找到 <process-type id="oafm" module-id="O ...
- 服务器重启可能会导致SQL Server中部分数据库变为single user mode
今天检查公司生产服务器的SQL Server数据库,惊讶的发现有三个生产数据库变为了single user mode.奇怪的是没有任何人和程序执行过SQL语句将这三个数据库设置为single user ...
- idea本地将本地现有的项目和gitlab进行管理并提交到线上
备注:通过这个操作可以让本地的项目与远程gitlab进行关联,并将本地的代码提交到gitlab上面 1.在idea的菜单项选择 VCS>Import into Version Control&g ...