前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android APP安全防护总结

Android APP安全防护总结

作者头像
天钧
发布2020-02-17 14:34:12
1.5K0
发布2020-02-17 14:34:12
举报
文章被收录于专栏:渗透云笔记渗透云笔记

1. 资源混淆(从文件资源下手)

使用Lint对无用资源进行清理,而Lint则可以检查所有无用的资源文件,只要使用命令./gradlew lint或者在Android Studio工程中点击Analyze->Inspect Code,选择Whole Project点击ok就行。它在检测完之后会提供一份详细的资源文件清单,并将无用的资源列在“UnusedResources: Unused resources” 区域之下。只要你不通过反射来反问这些无用资源,你就可以放心地移除这些文件了。

https://www.jianshu.com/p/3ba16f34bba9 -- AndResGuard教程 https://github.com/shwenzhang/AndResGuard -- AndResGuard项目 https://www.cnblogs.com/lsdb/p/9340761.html https://blog.csdn.net/wei11556/article/details/83275469

2. 代码混淆(从代码优化)

提高代码可读性,使得程序更加难以理解。此方法基本都要做,用的最多的当Proguard莫属。

https://www.jianshu.com/p/e9d3c57ab92f?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq Android 代码混淆 混淆方案

3. 签名校验

检查APP中自己写入的私钥hash值与当前签名中的私钥hash值是否相一致。一致则说明APP没有被改动,允许APP运行;不一致则说明APP被二次打包,APP就自我销毁进程。

签名验证可以在两个地方做,一个是在MainActivity.java的OnCreate函数中做,一个是在原生代码文件的JNI_OnLoad函数中做。

https://www.cnblogs.com/lsdb/p/9340761.html

4. 反调试

第一:因为一个进程同时最多只能被一个进程所调试,那么我们就给自己附加进程,假装自己在调试自己,占住调试位置,用该方法来拒绝别的进程的调试请求。

第二:轮训检查自身status中的TracerPid字段值,如果发现TracerPid的值不等于0则代表有进程在调试,就要杀死自己。

第三:签名校验是不可或缺的一个选择,本地校验(前端)和服务器端校验双管齐下。

第四:借助系统API判断应用调试状态和调试属性,这是最基础最基本的防护。

第五:轮训检查Android_server调试端口信息和进程信息, 防护IDA动态调试的一种有效方式。

http://www.520monkey.com/archives/1000

5. 组件安全

四大组件的安全防护其实无非就是访问权限控制。

在创建组件时,如果是私有的组件,android:exported属性一律设置为false。如果是公有的,就设置android:exported为true。不管公有的还是私有的组件,处理接收的intent时都应该进行验证的数据验证。公有组件防止信息泄露和接收外部数据时进行严格的处理。如果对私有组件没有进行相应的配置,可能导致组件被其他程序调用,敏感信息泄露,拒绝服务器攻击和权限绕过等漏洞。

这里对LocalBroadcastManager说明一下,其基于Handler实现的,拥有更高的效率与安全性。安全性主要体现在数据仅限于应用内部传输,避免广播被拦截、伪造、篡改的风险。但是LocalBroadcastManager不支持Sticky、order特性,多线程并发性能不高,在某些需要后注册Receiver也可以收到信息的特殊需求无法实现。

6. WebView的代码执行漏洞

WebView远程代码执行相关的漏洞主要有CVE-2012-6336、CVE-2014-1939、CVE-2014-7224,这些漏洞中最核心的漏洞是CVE-2012-6336,另外两个CVE只是发现了几个默认存在的接口,下面就具体说明这些漏洞的情况。

CVE-2012-6336 Android <= 4.1.2 受影响

CVE-2014-1939 Android <= 4.3.1 受影响

CVE-2014-7224 Android <= 4.4.0 受影响

可以发现其实都是些低版本系统漏洞,目前已经发展到Android 10了,理论上说不存在WebView漏洞,属于老漏洞。修复方法就是升级最新系统版本。

7. 加固:360加固、梆梆加固、网易加固、腾讯乐固

8. 编码安全

编码安全就是反编译,反编译不好防,只能提高破解难度,例如加固、混淆、so文件函数加密等等。反编译后能干什么?当然是二次开发,冒充正版植入广告或者恶意程序,一旦有用户下载了山寨版的,那么就有极大概率获取手机的控制权限及本人的敏感信息。

9. 使用HTTPS链接

避免被恶心的运营商劫持,插入广告,影响用户体验。(比如我爱我家APP被挂博彩),我觉得这个很有必要,不仅仅是因为安全,包括微信公众号,googleplay 都在强制要求开发者必须使用HTTPS。(这里为什么运营商会搞鬼呢,因为运营商看你的网站或者APP量大,想利用你的流量做广告推广,可能就几分钟)

10. 密码明文保存漏洞

由于WebView默认开启密码保存功能,所以在用户输入密码时,会弹出提示框,询问用户是否保存。若选择保存,则密码会以明文形式保存到/data/data/com.package.name/databases/webview.db中,这样就有被盗取密码的危险。所以我们应该禁止网页保存密码,设置WebSettings.setSavePassword(false)。

11. 防抓包分析,两个方案:

A. System.getProperty("http.proxyHost");System.getProperty("http.proxyPort");//正常这两行代码获取的是null,如果返回不为空,就是挂代理了,那么就可以考虑是否给数据了。

B. System.setProperty("key","value");

https://www.jianshu.com/p/4a99f524e0dc 具体解释可以看看这篇文章,这里不做过多笔墨,前辈们已经总结得很好。

12. 数据存储安全

A. 隐藏数据存储位置

B. 存储内容不要使用明文

C. 代码中禁止硬编码重要信息内容

D. 存储到手机内部存储上

13. 慎重使用allowBackup属性,设置是否支持备份,默认值为true,如无必要,将值设置为false,避免应用内数据通过备份造成的泄露问题。

14. 自定义键盘

关于这一点,其实笔者不知道此做法对安全性有多大作用,我也特意去下载了一些热门应用做调查,发现还是比较多APP应用使用手机自带的或默认的键盘,所以笔者不清楚其危害性有多大,个人觉得可有可无。若是各位师傅们对此理解深切,希望纠正~

15. 账号与设备绑定

如果发现与常用设备不符合,增加短信登录形式进行重新登录。此做法笔者觉得很有效防止任意用户登录。

16. 将classes.dex哈希值存放在服务器端

为了防止被破解,软件发布时的classes.dex哈希值应该存放在服务器端。

17. 检测手机是否root

如果root了,就禁止某些核心功能。

检测是否root代码

18. 检测手机是否装Xposed

若是检测到有则隐藏核心功能模块。代码可以看看简书的这篇文章

https://www.jianshu.com/p/c37b1bdb4757

Android防护手段都有很多,具体还要结合业务的实际情况进行加固,毕竟产品的安全性和性能都同时兼顾是很难做到的,我们需要在这两者之间做平衡。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 渗透云笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
移动应用安全
移动应用安全(Mobile Application Security,MS)针对移动应用普遍存在的破解、篡改、重打包等各类安全风险,提供Android应用加固、iOS源码混淆、SDK加固等多种加固技术,拥有丰富的行业经验,已服务于金融、互联网、车联网、物联网,运营商等多个行业。稳定、简单、有效,让移动安全建设不再是一种负担。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档