最近公司的app通过第三方安全检测公司进行了一次安全检测,当然ios,android都有,对于检测出来的漏洞及安全问题,我把android与ios对比了下简直不忍直视,难怪ios上线各种检测,不过话说回来我觉得android系统本来就存在一些漏洞,今天的主题就是关于漏洞及处理方案:
1.漏洞分类
通常漏洞分为三类:低危漏洞,中危漏洞,高危漏洞.
- 低危漏洞就是对app用户数据及敏感信息无影响的漏洞比如:release版本残留的log日志,硬编码url,网络环境检测等等.这类安全性问题能处理则处理,不能处理就完全可以忽略.
- 中危漏洞:一般来说这类安全性问题归纳为:数据及应用资源未采取加密措施比如:本地重要的资源文件未加密,数据库,sp创建,数据使用弱加密,数据保存在外部存储等等,对于中危漏洞我需要严谨一点,往往这类安全问题可以影响到用户数据或者应用程序的敏感数据了。因此要尽量完全处理.
- 高危漏洞:高危漏洞顾名思义,就是说此类安全问题威信度极高,这种漏洞往往存在第三方对用户数据,应用程序敏感信息进行获取。导致信息泄露。比如:在manifest.xml里面配置的四大组件,应该程序入口application,数据库操作。因此这类问题必须彻底解决。
当然对于app的一些漏洞我们不是每个都能在应用层处理的或者说通过本地代码能够处理的,比如:第三方sdk配置,api,本地资源文件加密,apk中java代码加壳等等.
2.常见的漏洞及处理方案
1.manifest.xml配置四大组件存在的漏洞:在配置文件里面注册四大组件的时候我们一般都没有设置android:exported这个属性,这个属性有什么作用呐:它表示当前注册的组件是否能够被其他应用程序调用。false表示不能别其他应用程序调用,true反之.特别注意:如果我们注册的组件没有设置隐士意图也就是intent-filter标签,那么这个值就是false,反之就是true。
2.manifest.xml配置application应用程序入口问题。一般来说我们配置application的时候都没有设置android:allowBackup="false"这个属性,首先android:allowBackup表示应用程序是否应许数据备份,设置false表示不能,true表示可以被其他应用程序备份。
3.滥用权限问题:这个也是在manifest.xml里面处理:一般来说我们需要的权限都是直接在manifest.xml里面配置,但是权限也有低危权限,高危权限之分,对于一些高危权限我们需要进行权限等级配置.android:protectionLevel="signature"(不必要的权限切记一定要删除)
4.注册广播:静态注册必须加上android:exported="false",动态注册必须使用registerReceiver(BroadcastReceiver, IntentFilter, broadcastPermission,android.os.Handle),其中第一个参数为:广播接收器,第二个隐士意图,第三个自定义权限,第四个可传null
5.https:信任问题,我们在使用https进行网络请求的时候需要对ca证书进行指定信任,不能信任全部证书,另外也可以对主机域名配置(如果指定信任证书就不需要对主机域名配置了)
6.webview远程代码执行漏洞:升级工程最低sdk17,且js函数与android交互都用最新的方法比如:evaluateJavascript(),shouldOverrideUrlLoading()等 ,如果必须使用addJavascriptInterface接口需要允许被JavaScript调用的函数必须以@JavascriptInterface进行注解
7.发布release版本的时候存在残留的log,或者敏感url,或者硬编码url,这时候需要我们在发布版本时候进行排查。
8.对于用户敏感数据信息无论是保存在外部存储,内部存储,sp, sqlite数据库,都要进行加密保存(当然建议保存在内部存储)因为保存在外部存储数据容易盗取
9.操作本地数据库的时候一定要利用标准的sql语句,不要使用拼接字符串形式构造的SQL语句去查询底层SQLite 数据库,比如:
query中使用拼接字符串形式构造的SQL语句去查询底层SQLite 数据库,使用selectionArgs进行参数化查询。
selection = "name=?"; String[] selectionArgs = new
String[]{et_name.getText().toString()}; cursor = sqldb.query( "addressbook",null, selection, selectionArgs, null,null,null,null);
10.so文件加载问题:建议使用System.loadLibrary()函数动态加载SO文件,不要使用System.load()函数。
11,防调试,在发布正式版本后需要判断当前是否处于调试状态,如果处于就退出程序
12.防止activity中间劫持:这个需要根据各自需求进行处理,在这里给大家说下我的处理方案:在个别重要的页面进行判断,判断当前activity是否执行onstop,执行就提示用户。(activity中间劫持就是当用户在当前页面输入敏感信息的时候第三方页面把我们app的页面进行遮盖了,用户输入的信息就被盗取)
13:activity防止截屏:其实这类安全性跟上面防止activity中间劫持类似,都是根据各自需求去处理,一般来说我们都是在对用户敏感数据页面处理,比如登录,支付,注册等:
14:代码混淆:正确的增强代码混淆
最后如果公司对app安全性有一定要求建议找个靠谱的第三方公司进行app加固后再来排查漏洞