Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

Andorid-APP 安全测试(三)

0
0

继上一篇Andorid-APP 安全测试(二)的内容

1、数据备份allowBackup 1

2、Debug调试 3

3、aapt的使用 3

4、App安全之网络传输安全问题 6

4.1散列算法 8

4.2对称加密之AES 8

4.3非对称加密之RSA 8

4.4加密算法漏洞 14

5、从任务栈到启动模式 15

5.1 如何看任务栈 16

5.2 dumpsys命令的使用 16

6、Android应用程序签名debug签名 17

6.1 debug签名的认识 17

6.2 android 如何判断Apk是否签名和签名是否一致 18

1、数据备份allowBackup

Android API Level 8 及其以上 Android 系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中 AndroidManifest.xml 文件中的 allowBackup 属性值,其属性值默认是 True。当 allowBackup 标志为 true 时,用户即可通过 adb backup 和 adb restore 来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。

Android 属性 allowBackup 安全风险源于 adb backup 容许任何一个能够打开 USB 调试开关的人从Android 手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore 容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即可在其他 Android 手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。

尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者 即可通过 adb backup 和 adb restore 进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此为了安全起见,开发者务必将 allowBackup 标志值设置为 false 来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。

不在 AndroidManifest.xml 文件设置 allowBackup 属性值,其默认值为 true,则应用可通过 adb 命令进行备份整个应用的数据

AndroidManifest.xml文件内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alibaba.jaq.allowbackuppoc"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:label="@string/app_name">
<activity android:name="LoginActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".HomeActivity"/>
</application>
</manifest>

在 AndroidManifest.xml 文件显示设置 allowBackup 属性值为 false,即android:allowBackup="false",则 Android 应用不可通过 adb 命令进行备份和恢复整个应用的数据

AndroidManifest.xml文件内容

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alibaba.jaq.allowbackuppoc"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<application
android:allowBackup="false"
android:label="@string/app_name">
<activity android:name="LoginActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".HomeActivity"/>
</application>
</manifest>

查看AndroidManifest.xml文件中是否有allowBackup,如果没有则allowBackup属性值,默认allowBackup值为True,则默认为可以备份应用数据,存在安全风险;如果allowBackup属性值为false,则不可以备份应用数据。

2、Debug调试

在Android中的AndroidManifest.xml文件中可以设置很多属性,其中有一项是debuggable属性,意为“可调试”,有true和false两种模式。

在准备发布应用之前要确保关闭debug属性,即设置AndroidMainifest.xml中android:debuggable="false",false表示关闭debug调试功能,true表示开启debug调试功能,但是有时候会忘记关掉这个属性。Debug调试开启会存在应用被调试的风险。

在发布之前最好进行测试,使用aapt工具(下面部分会介绍到appt的使用):

aapt list -v -a myfile.apk

这个命令将会打印和apk相关的所有详细信息,找到“android:debuggable",它的值分为:

0x0: debuggable false
0xffffffff: debugabble true

例如,在我的测试中,这一行的信息是:

A: android debuggable(0x0101000f)=(type 0x12)0x0

这说明我的Release Build已经关闭了debuggable!

3、aapt的使用

AAPT - Android Asset Packaging Tool

看全称,就可知道AAPT是Android资源打包工具。

在SDK的build-tools目录下。该工具可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件,尽管你可能没有直接使用过aapt工具,但是build scripts和IDE插件会使用这个工具打包apk文件构成一个Android 应用程序。在使用aapt之前需要在环境变量里面配置SDK-tools路径,或者是路径+aapt的方式进入aapt

按照上面aapt的方式配置好环境变量后,在终端中输入 aapt v 会得到aapt版本信息,如下:


Andorid-APP 安全测试(三)
aapt l[ist] [-v] [-a] file.{zip,jar,apk}

作用:列出压缩文件(zip,jar,apk)中的目录内容。

aapt l C:\Users\xianluo\Desktop\23.apk


Andorid-APP 安全测试(三)

可以看出来不加任何参数,aapt只是简单的罗列压缩文件中每一项的内容。

aapt l -v C:\Users\xianluo\Desktop\23.apk结果如下:


Andorid-APP 安全测试(三)

从图中可以看出,加上-v后,输出的内容很详细,并且以列表的形式标识出很多参数,其中表目有:

Length:原始文件的长度

Date:日期

Time:时间

Name:名称

Method:压缩方法,Deflate及Stored两种,即该Zip目录采用的算法是压缩模式还是存储模式;可以看出resources.arsc、*.png采用压缩模式,而其它采用压缩模式。

Ratio:压缩率

Size:这个是压缩省掉的大小,即如果压缩率是xx%。那Size是原始长度*(1-xx%)。

CRC-32:循环冗余校验。这个计算是有特定的算法的。

offset:zipfile中偏移量的意思

aapt l -a C:\Users\xianluo\Desktop\23.apk结果如下:


Andorid-APP 安全测试(三)

-a表示会详细输出压缩文件中所有目录的内容,详细到什么程度的,可以看上图,上图截取的只是很小的一部分。

aapt d[ump] [--values] [--include-meta-data] WHAT file.{apk} [asset [asset ...]]

作用:通过参数配置可以dump apk中各种详细信息。

打印apk中所有string资源表

aapt dump strings /Users/AAPTDemo/app/build/outputs/apk/app-debug.apk


Andorid-APP 安全测试(三)

主要应用:

aapt l

简单的罗列压缩文件中每一项的内容

aapt l -v XXX.apk

列表方式详细标识出压缩文件中的每一项和很多参数

aapt l -a

详细输出压缩文件中所有目录的内容

aapt dump strings

打印apk中所有string资源表

aapt dump badging

查看apk中的配置信息

更多使用方式可以参考官方使用文档。

4、App安全之网络传输安全问题

移动端App安全如果按CS结构来划分的话,主要涉及客户端本身数据安全,Client到Server网络传输的安全,客户端本身安全又包括代码安全和数据存储安全。所以当我们谈论App安全问题的时候一般来说在以下三类范畴当中。

App代码安全,包括代码混淆,加密或者app加壳。

App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密。

App网络传输安全,指对数据从客户端传输到Server中间过程的加密,防止网络世界当中其他节点对数据的窃听。

以上两点在之前的两篇文章中都涉及,本篇主要针对App网络传输安全,在对APP网络传输安全的问题。

对于App传输数据加密,一般会考虑三个方面

1) 可用性:客户端和服务端都可逆向破解

2) 较高的安全性:不容易被破解

3) 效率性:加密性能及资源占用方面不是很高

网络安全相关的概念非常之多,要在广度和深度上都有所造诣很困难。但如果只是站在保障App通信基本安全这个维度上,做到合理使用安全算法,比大部分人所预期的都要简单很多。以下这些基础概念是必备知识:

对称加密算法,代表算法AES

非对称加密算法,代表算法RSA,ECC

电子签名,用于确认消息发送方的身份

消息摘要生成算法,MD5,SHA,用于检测消息是否被第三方修改过

建议详细学习下HTTPS,HTTPS的安全握手流程完整的阐释了“加密”和“签名”这两个概念

1)对称性加密。如DES、AES、3DES等。这些加密方式的算法基本已公开,因此其特点为密钥/生成密钥的方法固定,因此这种加密方式的优点为性能效率较好,而且也较大的提升了解密的成本;但由于密钥固定,因此缺点也很明显了,则是在客户端和服务端上都能找到密钥或密钥的生成方法。因此其突破口为通过逆向客户端来寻找密钥。另外,这种加密方式可同时用于请求包和返回包。

2)非对称性加密。如RSA、Rabin等。这些加密方式的算法基本也已经公开,因此其特点为有一对公钥和私钥:客户端上保存公钥,用于加密;服务端上保存私钥,用于解密。因此这种加密方式的优点为安全性较高,客户端上只有用于加密的公钥,而没有用于解密的私钥;而弱点则为加解密效率不高,性能资源占用较大,所以目前很多App还是选用对称性加密。由于客户端上没有解密数据包的私钥,因此需要使用其他方法获取数据包明文才能进行数据包篡改。另外,由于只有一对公钥和私钥,所以这种加密方式一般只会出现在请求包,而返回包则一般为明文返回。

3)自定义算法加密。有少数App开发的技术人员还会使用自定义算法来对数据包进行加密,算法五花八门,大多为各种常见的编码(如Base64)和字节位移运算等混杂

Viewing all articles
Browse latest Browse all 12749