Android APP安全防护总结

2020-02-17 14:34:12 浏览数 (1)

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

0 人点赞