Android中其他常见的安全问题

0x01.app备份风险

在AndroidManifest.xml文件中为了方便对程序数据的备份和恢复在Android API level 8以后增加了android:allowBackup属性值。默认情况下这个属性值为true,故当allowBackup标志值为true时,即可通过adb backup和adb restore来备份和恢复应用程序数据。
备份文件命令格式:
adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>]

-f用来指定要将备份数据写到那个文件中,如果不指定的话,则默认保存在当前目录的“backup.ab”文件中。

-apk参数指定要连着程序的apk文件一起备份;而-noapk参数刚好相反,只备份数据,不备份程序本身。两个参数只能选其一,如果不指定的话,默认是-noapk。
-obb参数要求备份的时候包含程序的一些连带的扩展数据(即obb文件,例如大型游戏的数据包文件);
而-noobb参数相反,要求备份的时候不包含程序的扩展数据。两个参数只能选其一,如果不指定的话,默认是-noobb。
-shared参数要求备份程序存放在SD卡上的数据;而-noshared参数相反,不要备份程序存放在SD卡上的数据。两个参数只能选其一,如果不指定的话,默认是-noshared。
-all参数要求备份设备上所有安装程序的数据,前提是程序允许备份。
如果命令包含-all参数的话,还可以选择是否备份系统自带程序的数据,-system表示备份系统自带程序的数据,而-nosystem表示不备份系统自带程序的数据。两个参数只能选其一,如果不指定的话,默认是-system。
packages参数 如果你只想备份指定程序数据的话,可以在命令中逐一列出它们的包名。

恢复文件命令格式:
adb restore <file>    
file文件就是我们利用adb备份的文件。

安全建议
从数据安全的情况考虑,建议将allowBackup参数设置为false。
android:allowBackup="false"

参考链接
http://blog.csdn.net/Roland_Sun/article/details/44495231



0x02.log敏感信息泄露风险

开发人员在调试程序的过程中,会利用log的函数Log.v() Log.d() Log.i() Log.w() 以及 Log.e()输出调试信息,当调试信息中包含用户名和密码等敏感信息时,有可能会造成敏感信息泄露风险。

1、Log.v 输出日志的详细信息。
2、Log.d 输出debug调试信息。
3、log.i 输出一般提示性信息。
4、log.w 输出warning警告信息。
5、log.e 输出error错误信息。

logcat常用命令格式
[adb] logcat [<option>] ... [<filter-spec>] ...

选项:
-b <buffer> 指定要查看的日志缓冲区,可以是system,events ,radio,main . 默认值是system和main 。
-c 清楚屏幕上的日志. 
-d 输出日志到屏幕上. 
-f <filename> 指定输出日志信息的<filename> ,默认是stdout . 
-g 输出指定的日志缓冲区,输出后退出. 
-n <count> 设置日志的最大数目<count> .,默认值是4,需要和 -r 选项一起使用。 
-r <kbytes> 每<kbytes> 时输出日志,默认值为16,需要和-f 选项一起使用. 
-s 设置默认的过滤级别为silent. 
-v <format> 设置日志输入格式,默认的是brief 格式,要知道更多的支持的格式,参看Controlling Log Output 
参数<filter-spec>
参数<filter-spec>用于对某类的tag的日志输出进行过滤。每一个输出的Android日志信息都有一个tag和它的优先级.日志的标签是系统部件原始信息的一个简要的标志。这个tag就是Log.i,Log.d,Log.i,Log.w,Log.e,Log.wtf系列函数中的tag.对于System.out.print系列函数所对于的tag,其实就是"System.out"<filter-spec>以“tag:priority”的形式来对日志输出进行过滤的.
优先级priority有以下几种,按照从低到高顺利排列如下:
V — Verbose (lowest priority) 对应于Log.i()系列函数
D — Debug 对应于Log.d()系列函数
I — Info 对应于Log.i()系列函数
W — Warning 对应于Log.w()系列函数
E — Error 对应于Log.e()系列函数
F — Fatal 对应于Log.wtf()系列函数
S — Silent (highest priority, on which nothing s ever printed)

例子
显示tag为tag的info以及以上优先级的所有日志,
adb logcat -s tag:i

安全建议
注释掉log函数或者不要用log输出敏感信息。

参考链接
http://blog.csdn.net/polly_yang/article/details/49765785


0x03.uri泄露用户敏感信息

Url泄露敏感信息风险
Url中包含用户敏感信息和可能产生web常见的安全漏洞,形成了攻击服务器端的入口。

安全建议: 
1.用url获取服务器的敏感信息需进行验证。
2.对传输的url数据进行加密处理


0x04.zip文件目录遍历漏洞

当zip压缩包中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变zip文件存放的位置,当文件已经存在是就会进行覆盖,如果覆盖掉的文件是so、dex或者odex文件,就有可能造成严重的安全问题。

漏洞产生的代码,没有对文件的路径名进行判断直接进行解压

package com.pc.ziptest;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ZipTest {
      public static final int BUFFER = 512;
      
      public static void main(String[] args) throws Exception {
         BufferedOutputStream dest = null;
         ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream("C:\\Users\\pc\\Desktop\\test.zip")));
         ZipEntry entry;
         while ((entry = zis.getNextEntry()) != null){
         
             int count;
             byte data[] = new byte[BUFFER];
             String entryName = entry.getName();
             /*
             if (entryName.contains("..")){
                 throw new Exception("unsecurity zipfile!");
             }
             */
             FileOutputStream fos = new FileOutputStream(entryName);
             //System.out.println("Extracting:" + entry);
             dest = new BufferedOutputStream(fos, BUFFER);
             while ((count=zis.read(data,0,BUFFER)) != -1){
                 dest.write(data, 0, count);
             }
             dest.flush();
             dest.close();
         }
         zis.close();
      }
}

安全建议

1.对路径进行判断,存在".."时抛出异常
安全代码示例如下,
String entryName = entry.getName();
if (entryName.contains("..")){
    throw new Exception("unsecurity zipfile!");
}
FileOutputStream fos = new FileOutputStream(entryName);

参考链接
http://www.cnblogs.com/alisecurity/p/5610654.html


0x05.初始化IVParameterSpec函数出错

使用固定初始化向量,结果密码文本可预测性会高得多,容易受到字典式攻击。

iv的作用主要是用于产生密文的第一个block,以使最终生成的密文产生差异(明文相同的情况下),使密码攻击变得更为困难,除此之外iv并无其它用途。因此iv通过随机方式产生是一种十分简便、有效的途径。

正确的使用方法示例,

package com.pc.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Random;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import javax.crypto.spec.IvParameterSpec;

public class Test {
      
      public static void main(String[] args) throws Exception {
          byte[] rand = new byte[16];
          SecureRandom r = new SecureRandom();
          System.out.println(r);
          r.nextBytes(rand);
          IvParameterSpec iv = new IvParameterSpec(rand);
          System.out.println(iv.getIV());
          //IvParameterSpec iv_ = new IvParameterSpec("1234567890123456".getBytes()); //错误的使用方式
          //System.out.println(iv_.getIV());
      }
}

修复建议:
禁止使用常量初始化矢量参数构建IvParameterSpec


0x06.PendigIntent误用风险

1.使用PendingIntent时,使用了空Intent,会导致恶意用户劫持修改Intent的内容。
2.PendingIntent以其发送方应用的权限使用该PendingIntent包含的Intent,如果该Intent
为隐式的,可能造成隐私泄露和权限泄露。大致和Intent使用时原理相同,可以参考Intent安全使用内容。 

安全建议
第一种情况:
1.禁止使用空Intent去构造,构造PendingIntent的Intent一定要设置ComponentName或者action
2.
第二种情况:
1.使用PendingIntent时,建议使用显示Intent
http://wooyun.jozxing.cc/static/drops/papers-3912.html

参考链接
http://wolfeye.baidu.com/blog/pendingintent-leak-information/
http://blog.csdn.net/u013107656/article/details/51954223


0x07.安卓程序可被调试风险

在AndroidMainifest.xml中最好不设置android:debuggable属性置,而是由打包方式来决定其值,使用Eclipse运行这种方式打包时其debug属性为true,使用Eclipse导出这种方式打包时其debug属性为法false.在使用ant打包时,其值就取决于ant的打包参数是release还是debug.


检测android:debuggable的值,如果debuggable0xffffffff为则值true,0x0则值为false

有很多博客用的命令是aapt list -a -v myapk.apk,但是我在运行时会爆出aapt停止工作,而使用aapt l -a do.apk工作正常

E:\> aapt l -a  do.apk
...
Android manifest:
N: android=http://schemas.android.com/apk/res/android
  E: manifest (line=2)
    A: android:versionCode(0x0101021b)=(type 0x10)0x3
    A: android:versionName(0x0101021c)="1.3" (Raw: "1.3")
    A: android:installLocation(0x010102b7)=(type 0x10)0x1
    A: package="com.sms.tract" (Raw: "com.sms.tract")
    A: platformBuildVersionCode=(type 0x10)0x15 (Raw: "21")
    A: platformBuildVersionName="5.0-1521886" (Raw: "5.0-1521886")
    E: uses-sdk (line=8)
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x8
      A: android:targetSdkVersion(0x01010270)=(type 0x10)0x11
    E: uses-permission (line=12)
      A: android:name(0x01010003)="android.permission.RECEIVE_BOOT_COMPLETED" (Raw: "andro
id.permission.RECEIVE_BOOT_COMPLETED")
    E: uses-permission (line=13)
      A: android:name(0x01010003)="android.permission.RECEIVE_USER_PRESENT" (Raw: "android
.permission.RECEIVE_USER_PRESENT")
    E: uses-permission (line=14)
      A: android:name(0x01010003)="android.permission.RECEIVE_SMS" (Raw: "android.permissi
on.RECEIVE_SMS")
    E: uses-permission (line=15)
      A: android:name(0x01010003)="android.permission.SEND_SMS" (Raw: "android.permission.
SEND_SMS")
    E: uses-permission (line=16)
      A: android:name(0x01010003)="android.permission.READ_PHONE_STATE" (Raw: "android.per
mission.READ_PHONE_STATE")
    E: uses-permission (line=17)
      A: android:name(0x01010003)="android.permission.BROADCAST_SMS" (Raw: "android.permis
sion.BROADCAST_SMS")
    E: application (line=18)
      A: android:label(0x01010001)=@0x7f040001
      A: android:icon(0x01010002)=@0x7f020000
      A: android:persistent(0x0101000d)=(type 0x12)0xffffffff
      A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff   //debuggable为0xffffffff为true,0x0为false
      A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff
      E: activity (line=23)
...


安全建议

1.使用Eclipse导出这种方式打包是其debugging的值为false。


0x08.Fragment注入漏洞

漏洞详细信息

http://blog.csdn.net/wangkaiblog/article/details/41682465

http://blog.csdn.net/l173864930/article/details/17279165

0x09.android寄生兽漏洞

漏洞详细信息

http://www.360doc.com/content/15/0703/17/21412_482407627.shtml
http://www.cnblogs.com/goodhacker/p/4619521.html

0x10动态dex文件加载风险

在使用动态加载类DexClassLoader去加载应用程序之外的dex文件时,没有正确的防御可能会被恶意代码注入,从而导致执行恶意代码。建议将所需要动态加载的DEX文件放置在APK内部或应用私有目录中,如果必须将加载的dex文件放在其他应用可以任意读写的目录下,建议对加载的文件进行完整性校验。

0x11敏感数据传输风险

敏感数据的传递建议使用Android针对IPC提供的相关功能,例如可以使用Intent,Binder,messenger,service以及BroadcastReceiver等android IPC机制并为每种IPC机制设置相应的安全策略来保障敏感信息传输的安全。

对于android客户端到服务器敏感数据的传输建议使用https安全传输协议进行传输,如果服务器未配置https服务,建议使用AES对称加密算法对敏感数据加密后利用http协议进行传输。

0x12敏感变量或方法泄露风险

由于apk容易被反编译,反编译过后会暴露代码逻辑或变量,对于一些敏感的变量和方法即使混淆了也很容易获取变量和方法的逻辑,建议把敏感变量和方法编译成so文件之后利用JNI去访问,达到变量和方法不被泄露的目的。

对于一些重要的逻辑判断方法(比如是否支付成功,是否抽奖成功等逻辑判断),尽量在服务端进行判断或验证,在Android客户端进行结果显示,避免攻击者篡改逻辑重新编译打包对验证进行绕过。



猜你喜欢

转载自blog.csdn.net/nextdoor6/article/details/52727918