Android安全防护防护——加密算法:传送门https://www.cnblogs.com/huangjialin/p/9694488.html

组件安全

activity劫持

简单来说就是正常的activity被攻击者替换上一个假冒的activity,但是用户并不知道这是一个假冒的activity,所以用户在输入相关信息后,就直接被攻击者获取到了。通常像登录页面,支付页面,或者是其他数据较为敏感的页面都是很容易被攻击。

activity劫持的原理有两种

第1种:手机安装了木马程序,木马程序会注册一个Receiver,响应android.intent.action.BOOT_COMPLETED这个事件,这时候木马程序中的服务就会启动一个定时器,不停的循环当前运行的进程。一旦当前的进程正是我们要劫持的,并且运行在前台,就立刻使用FLAG_ACTIVITY_NEW_TASK来启动自己的木马程序中的页面并且处于栈顶,用户看到这个页面并不知道是木马程序的页面,就将一些信息输入,从而导致泄漏。

第2种:通常启动一个activity是通过startActivity(),这个方法的参数是intent,intent的设置有两种方式,第一种是通过设置action,让系统找到接收该action的activity,然后启动。第二种是通过包名+类名的方式进行启动。

当应用通过action来启动activity的时候,木马程序可以创建一个同样的action来接收activity。Android系统中,如果存在多个activity接收同一个action时,会提供一个列表让用户选择,一旦用户选错,就进入到木马程序中的页面。从而导致隐私信息泄漏。

解决方案

1、针对第一种情况,当我们的应用程序退到后台的时候,弹出提示信息提示用户,程序已经退出到后台。

2、自己写一个写一个反劫持程序。当一些敏感的页面时候,启动一个后台服务,然后显示一个悬浮框,我们可以获取到当前运行的进程名称,来提示用户。防止被一些木马程序欺骗。

3、针对第二种情况,启动activity的时候,通过包名+类名的形式进行启动,不要使用action方式。

下面用代码简单介绍一下劫持的原理

1、在恶意程序中启动一个服务,在服务中开启一个定时器,然后不断的获取当前的进程名。

 /**获取当前的运行在前台的进程,并且在前台运行*/
public static String getTopAppPackageName(Context context) {
try {
String packageName = "";
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {
final long end = System.currentTimeMillis();
final UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
if (null == usageStatsManager) {
return packageName;
}
final UsageEvents events = usageStatsManager.queryEvents((end - 60 * 1000), end);
if (null == events) {
return packageName;
}
UsageEvents.Event usageEvent = new UsageEvents.Event();
UsageEvents.Event lastMoveToFGEvent = null;
while (events.hasNextEvent()) {
events.getNextEvent(usageEvent);
if (usageEvent.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
lastMoveToFGEvent = usageEvent;
}
}
if (lastMoveToFGEvent != null) {
packageName = lastMoveToFGEvent.getPackageName();
}
}
return packageName;
}catch (Exception e){
return null;
}
}

这里简单的说明一下,Android不同的系统获取进程的方法是不一样,Google为了提高系统的安全性,不断的封堵,不过,上面的获取当前的进程名在我的魅族7.0是可以获取的,亲测。

2、然后通过获取到当前进程的显示类名,恶意程序通过监听到当前进程运行的类名是自己想要攻击的页面,就迅速的替换上自己假的activity,从而迷惑用户,窃取到用户的隐私信息。不过目前6.0以上的系统,Google不提供获取其他应用的当前类名。但是在以前的版本是可以获取的。很遗憾,由于我的系统是7.0,所以,我并没有成功的获取到其他进程的topActivity。

Service劫持,Service拒绝服务

Service劫持

Service是Android四大组件之一,没有界面,运行在后台。通常我们用来做一些耗时的任务,但是需要注意的是Service是运行在主线程中的。而通常ComponentName startService(Intent service)我们是通过这样的方式进行启动一个service。其中参数是intent。而intent的使用有两种情况

第一种:明确的说明好要启动那个服务,也就是说指定好包名和Service的名称。

第二种:通过设置action,接收到action的service就启动。

那么问题就来了,如果你设置的action,攻击者弄的service会不会也可以也接收到你的action。在Android系统中多个service接收到同一个action,则看priority值,就是谁的优先级高,谁高就先启动谁。如果priority值一样,则是谁先安装,就先启动谁。所以说如果说攻击者自己弄一个服务,然后接收action,那么很有可能这个启动的service就是伪装的。

解决方案:startService(),bindService()时直接指定类名,包名。不要使用action启动。

Service拒绝服务

如果攻击者以这种方式进行攻击的。那要么是攻击者为了显示自己的技术,要么是那家公司的老板抢了他的老婆。当然也有可能是双方是竞争关系。这种攻击的方式就是让你的程序崩溃,崩溃,崩溃。

漏洞造成的原因

Android系统中,主要是通过intent来携带数据进行跳转的。但是系统在内部对intent中数据的并没有进行一些处理,比如数据为空,数据有问题等等,一旦攻击者对intent中的数据进行改动,就导致程序崩溃。

解决办法

1、既然是intent数据有问题。那我们获取的时候,就钥先做一些判断处理,还有就是try…catch处理。

2、在AndroidMenifest.xml中加上android:exported这个属性,设置为false 。即将组件设置为不可导出。

3、将service设置为私有的

Content Provider

四大组件之一的ContentProvider,在应用中扮演是应用间数据共享桥梁的角色。如果ContentPrevider组件对外暴露,攻击者很容易通过该暴露的组件的openFile接口,对文件目录进行遍历,从而导致数据泄漏。那么该如何判断ContentPrevider是否暴露这个接口呢?通过对所有的openFile方法,如果未对传入的uri技能型安全判断,则就认为有漏洞风险

解决方法

1、将不必要暴露的ContentPrivider组件设置为私有的。

2、去除没必要的openFile接口

3、对目标的uri进行有效的判断。

WebView安全

webView是Android原生提供的一个实现H5页面的控件。除了具有一般view的属性和设置外,还可以URL请求,页面加载,渲染,页面交互等进行处理。

漏洞产生原因

1、js调用Android原生代码,可以通过WebView的addJavaScriptInterface()方法进行对象的映射。当拿到该对象的时候,就可以对该对象中的方法进行调用。攻击可以通过拿到该对象,然后调用对象中的任意方法。

2、在Android应用中,webview开启了file域的访问,且允许file域对http域进行访问,同时未对file域的路径做限制。攻击者通过URLScheme的方式,可远程打开并加载恶意的html文件,获取到app中的一些信息。这个漏洞触发的条件是1、webview中setAllowFileAccessFromFileURLs或者是setAllowUniversalAccessFromFileURLsAPI配置为true。2、webview可以直接被外部调用,并能够加载外部可控的HTML文件。

解决方案

1、针对第一个漏洞,Google也给出解决方案,在Android4.2之前规定,被调用的方法必须要加上@javascriptInterface这个注解。才能够调用。在4.2之前采用拦截prompt()方法来进行漏洞的修复。

2、针对第二个漏洞,前面说了漏洞触发条件有两个,所以主要办法就是对这两个条件进行修复。1、setAllowFileAccessFromFileURLs或setAllowUniversalAccessFromFileURLs两个API为false。(Android4.1版本之前这两个API默认是true,需要显式设置为false)2、如果需要开启file域的访问,则要对file域的访问范围要严格控制。

SharePreferences存储风险和SDCard存储风险

1、SharePreferences存储是一种轻量级的基于XML文件存储的键值对形式进行数据的存储的。存储的数据一般是比较小的。

存在风险:现在很多人将登录相关的信息明文存储到sp中,过度的依赖Android系统本身提供的安全存储机制。导致攻击者可以通过root手机来查看敏感的信息。

解决方案:一些敏感的信息不要明文进行存储,先使用加密算法进行加密,在存储。

2、SDCard

Android系统中存放的文件存储卡分为内置存储卡和外部存储卡

内置存储卡,是有权限控制的,现在Android系统如果要读区内置存储卡,必须要用户手动给予权限,否则的话不能够读取。相对来说比较安全。

外部存储卡,有点类似于U盘,这个是没有权限控制,所以说如果只要有SDCard的读写操作权限,就可以进行读写操作,电脑也可以读取。

存在风险:如果数据存在外部存储卡中,攻击者很容易就读取到里面的数据,造成数据泄漏。

解决方案:敏感的数据不要存储到SDCard中,防止数据被修改或者是数据泄漏。推荐存储在/data/data/packagename/目录下应用数据任意备份风险

当AndroidManifest.xml配置文件中没有设置allowBackup这个属性,或者是设置这个属性为true的时候(默认是true),应用程序的数据可以被任意的备份和恢复。攻击者就可以通过adb工具备份复制应用程序的数据。

解决方案:在AndroidManifest.xml文件中设置application的属性 android:allowBackup=”false”

密码软键盘安全问题

现在很多应用的键盘,特别是输入支付密码的键盘,都是自己写的一个键盘。虽然从性能上或者是用户体验上来说,系统键盘或者第三方的键盘都要由于我们自己写的。但是如果用系统键盘或者是第三方键盘,我们输入的数据很容易就被泄漏,比如输入数据监听攻击,键盘截屏攻击,输入数据篡改攻击等。

解决方案

1、自定义输入键盘。自定义键盘,网上有很多案例,这里就不具体了。

2、防截屏。在activity中的onCreate()方法中,在setContentView之前加上getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);就可以防止屏幕截屏了。设置这个flag后,系统会把当前窗口的内容视为安全隐私内容,系统会阻止这些内容被截屏或者在不安全可靠的场景显示出来。

其他

前面说了存在的安全问题及解决方案,在这里还提一下提高安全性的两个方案。

1、混淆。系统提供有proguard文件来将我们要定义的混淆规则定义在里面。被混淆过的项目通过反编译工具,如ApkTool ,dex2jar , jd-gui等编译出来后,一些代码是显示为a,b,c这样的形式,无法知道具体的类名或者其他。虽然混淆不能保证安全多少。但是,至少能够增强反编译的难度。再说了没有什么事百分之百的,我们所做的安全防护,都只是让攻击者不能这么轻易的就破解而已。

2、第三方加固工具

现在市场上用的比较多的第三方工具有阿里聚安全,腾讯云应用加固,360加固保,梆梆加固,爱加密第三方加固工具相当于在在我们自己的应用上加了一层壳,让攻击者没有这么简单的拿到我们的数据。

第三方加固的原理

我们拿到需要加密的Apk和自己的壳程序Apk,然后用加密算法对源Apk进行加密在将壳Apk进行合并得到新的Dex文件,最后替换壳程序中的dex文件即可,得到新的Apk,那么这个新的Apk我们也叫作脱壳程序Apk.他已经不是一个完整意义上的Apk程序了,他的主要工作是:负责解密源Apk.然后加载Apk,让其正常运行起来。

主要步骤:我们拿到需要加密的apk和自己的壳apk,然后用加密算法对源apk进行加密在壳apk进行合并得到新的dex文件,最后替换壳程序中的dex文件就可以了。得到新的apk,这个新的apk主要工作是:负责解密源apk,然后加载apk,让其正常的运行起来。

加固工具的对比

体积(体积小的为优):360 > 腾讯 > 爱加密 > 阿里 > 梆梆

兼容性: 阿里 > 腾讯 > 360 = 梆梆 > 爱加密

启动速度(时间短为优): 阿里 > 爱加密 > 360 = 梆梆 > 腾讯

漏洞: 腾讯 > 爱加密 > 360 > 梆梆 > 阿里

Android安全防护防护———Android 端常见的安全问题的更多相关文章

  1. Android应用安全防护和逆向分析 ——apk混淆成其他语言代码

    现在很多人对于app的安全是越来越重视了,尤其是金融相关的行业,对于app的防范可是下足了功夫.各种加固,各种加密算法,层出不穷.我个人觉得,在安全技术这块,没有绝对安全的.也许今天这个技术起到了防范 ...

  2. Android安全防护防护———加密算法

    摘要 这篇文章本来早就应该写了,但是由于项目一直开发新的需求,就拖后了.现在有时间了,必须得写了.现在Android应用程序对安全防范这方面要求越来越高了.特别是金融行业,如果金融app没有没有做好相 ...

  3. Android中ListView的几种常见的优化方法

    Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...

  4. Android利用LocalSocket实现Java端进程与C端进程之间的IPC

    Android是建立在Linux之上的OS,在涉及到安全.网络协议.文件加密等功能时,往往需要通过C语言调用底层API来实现,而如何发出指令让C端执行我们想要的功能,并且在执行之后有返回结果呢,这就需 ...

  5. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  6. Android客户端与PC服务端、android服务端通过WiFi通信

    前期准备:我的是Linux Mint操作系统(总之折腾的过程中怀疑过是不是系统的问题),首先是要创建wifi热点给android手机使用,这个时候笔记本作为通信的服务器端,android手机作为客户端 ...

  7. android 应用程序与服务端交互

    http://www.cnblogs.com/freeliver54/archive/2012/06/13/2547765.html 简述了Service的一些基础知识以及Service和Thread ...

  8. Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_196 Python自动化,大概也许或者是今年最具热度的话题之一了.七月流火,招聘市场上对于Python自动化的追捧热度仍未消减,那 ...

  9. Android学习笔记(七)——常见控件

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 给我们提供了大量的 UI控件,下面我们简单试试几种常用的控件. 一.TextView 在布局文 ...

随机推荐

  1. PAT 1003 我要通过!(20)(代码+思路)

    1003 我要通过!(20)(20 分)提问 "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下 ...

  2. ubuntu下常用操作

    屏幕截图: 可以用ubuntu自带的截图软件:gnome-screenshot. 该工具截图区域并且复制到剪切板命令为  gnome-screenshot -c -a,可以给该命令添加快捷方式,alt ...

  3. [BAT]通过schtasks.exe远程调用windows 2008 server上的计划任务,提示ERROR : Access is denied

    在windows 2008 server 上建了一个计划任务,想通过命令 schtasks /run /tn "IPADForAdvisor_QA_APITest" /s SZPC ...

  4. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  5. 深入浅出 JMS(三) - ActiveMQ 安全机制

    深入浅出 JMS(三) - ActiveMQ 安全机制 一.认证 认证(Authentication):验证某个实体或者用户是否有权限访问受保护资源. MQ 提供两种插件用于权限认证: (一).Sim ...

  6. Find the squareroot

    https://github.com/Premiumlab/Python-for-Algorithms--Data-Structures--and-Interviews/blob/master/Moc ...

  7. 管理型交换机IEEE 802.1Q VLAN设置应用实例

    转载标注: IEEE802.1Q 我粗略理解为对交换机入口规则和出口规则设置,入口打上VID,设置从哪些口可以出去,并且是否带标签. 一 VLAN的概念 VLAN(Virtual Local Area ...

  8. Devexpress VCL Build v2014 vol 14.2.1 beta发布

    已经快到2015 年了. 14.2.1 beta 才出来了. 还好,有一些新东西. 官网地址 VCL Gauge Control Designed to clearly convey informat ...

  9. 29. What Makes a True Leader ? 合格的领导者由何物决定 ?

    29. What Makes a True Leader ? 合格的领导者由何物决定 ? ① Reading leadership literature,you'd sometimes think t ...

  10. IntelliJ IDEA 2017版 spring-boot基础补充,原理详解

    一.Spring发展史  1.Spring1.x       版本一时代主要是通过XML文件配置bean,在java和xml中不断切换,在学习java web 初期的时候经常使用  2.Spring2 ...