研究人员发现了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恶意代码隐藏在图片中的更多相关文章

  1. 【CISP笔记】安全漏洞与恶意代码(1)

    恶意代码 类型二进制代码.脚本语言.宏语言等表现形式病毒.蠕虫.后门程序.木马.流氓软件.逻辑炸弹等 恶意代码的传播方式(1)移动存储 自动播放功能.Windows默认.自动执行autorun.inf ...

  2. 【Android漏洞复现】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗

    文章作者MG1937 CNBLOG博客:ALDYS4 QQ:3496925334 0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android ...

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

    转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...

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

    原文:Codelab for Android Design Support Library used in I/O Rewind Bangkok session--Make your app fanc ...

  5. Android 命名规范 (提高代码可以读性)

    android文件众多,根据名称来辨别用途很重要,因此命名要规范 这篇文章可参考:Android 命名规范 (提高代码可以读性) 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名 ...

  6. Android检测网络是否正常代码!

    在Android开发中,如果该应用程序需要连接网络请求,那么最好我们先做一个检测网络是否在线的判断,否则程序容易出现卡死或FC等Bug,应该判断如果手机离线则弹出提示让用户检查网络,如果正常则继续执行 ...

  7. [原创]Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析

    主入口为com.android.settings.Settings. 这只是一个wrapper的类, 它继承于 SettingsActivity类,并且声明了一堆公有的继承于SettingsActiv ...

  8. Android Stduio统计项目的代码行数

    android studio统计项目的代码行数的步骤如下: 1)按住Ctrl+Shift+A,在弹出的框输入‘find’,然后选择Find in Path.(或者使用快捷键Ctrl+Shift+F) ...

  9. Android应用开发中如何使用隐藏API(转)

    一开始需要说明的是,Google之所以要将一些API隐藏(指加上@hide标记的public类.方法或常量)是有原因的.其中很大的原因就是Android系统本身还在不断的进化发展中.从1.0.1.1到 ...

随机推荐

  1. windows安装mysql数据库

    一.下载安装包.进入mysql官网https://www.mysql.com/ 二.打开安装包安装 以上步骤直接点击next即可,遇到配置密码就配置下

  2. 使用PeopleSoft 异步操作设置步骤

    在手机端调PS接口或同步数据到中间库等程序中经常用到异步操作. 在主菜单>PeopleTools>集成代理程序>集成设置中添加了服务和服务操作后需要设置以下3步才能完成异步程序: 1 ...

  3. 【葡萄城报表】还在为画“类Word文档报表”而发愁吗?

    ​Word 是非常强大的文档编辑工具,一些行业制式文档都是使用Word来创建的,像教育行业的申请表,履历表,审批表等,像石油业的勘探记录表,记录报告,检测报告等,如房地产业的制式合同,不仅包含大量的文 ...

  4. 使用CSS 3创建不规则图形

    前言 CSS 创建复杂图形的技术即将会被广泛支持,并且应用到实际项目中.本篇文章的目的是为大家开启它的冰山一角.我希望这篇文章能让你对不规则图形有一个初步的了解. 现在,我们已经可以使用CSS 3 常 ...

  5. plsql 导出查询结果

      点击青色按钮即可 说明: 会将查询到的所有数据导出到指定文件,并不是只导出下面列表显示的几行数据: 也不用点击"获取最后页"那个按钮. 注意: 当你选择导出为excel文件时, ...

  6. leveldb源码分析--BloomFilter

    bloomfilter是leveldb中的一大性能利器,所以为了文章的表现完整性这里新启这么一篇文章.leveldb中的bloomfilter的实现在bloom.cc中,是一个较为简单的实现,所以就不 ...

  7. HDFS ErasureCode方案对比

    HDFS目前存储文件的方案是将一个文件切分成多个Block进行存储,通常一个Block 64MB或者128MB,每个Block有多个副本(replica),每个副本作为一个整体存储在一个DataNod ...

  8. JBoss EAP应用服务器部署方法和JBoss 开发JMS消息服务小例子

    一.download JBoss-EAP-6.2.0GA: http://jbossas.jboss.org/downloads JBoss Enterprise Application Platfo ...

  9. python selenium模拟登录163邮箱和QQ空间

    最近在看python网络爬虫,于是我想自己写一个邮箱和QQ空间的自动登录的小程序, 下面以登录163邮箱和QQ空间和为例: 了解到在Web应用中经常会遇到frame/iframe 表单嵌套页面的应用, ...

  10. 小米正式开源 SQL 智能优化与改写工具 SOAR

    近日,小米正式宣布开源 SOAR. 截至今日,该项目已经获得了 350 个「star」以及 44 个「fork」(GitHub项目地址:https://github.com/XiaoMi/soar) ...