开发的App在安全检测工具上监测到一些问题,故特开security栏研究android app 安全问题,此文为检测到的一些安全问题
AllowBackup 配置
Android API Level 8 及其以上 Android 系统提供了为应用程序数据的备份和恢复功能
此功能的开关决定于该应用程序中 AndroidManifest.xml 文件中的Application节点 allowBackup 属性值,其属性值默认是 True。当 allowBackup 标志为 true 时,用户即可通过 adb backup 和 adb restore 来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。
WebView JS交互问题
调用了高危API addJavascriptInterface,Android系统版本4.2以下可以导致远程命令执行
安全检测给出的修复建议:不使用addJavascriptInterface进行javascript层与java层的通信,可以使用shouldOverrideUrlLoading或着onConsoleMessage等函数进行通信
第三方平台授权信息写在了本地
微信登陆授权信息secret与appid写在了本地
检测平台修复建议:将信息放在服务器端,由服务器端来中转接口调用请求
BroadCastReceiver组件的数据接受
使用registerReceiver(mReceiver,intentFilter)的方式动态注册的BroadCastReceiver是公开的组件,外部应用可以给该动态注册的BroadCastReceiver发送恶意数据
检测平台修复建议:建议使用registerReceiver(BroadCastReceiver receiver,IntentFilter filter,String broadcastPermission,Handler scheduler)增加权限或使用LocalBroadCastManger
Intent劫持风险安全
使用隐式Intent来发送广播,恶意程序可以通过注册收听同样的action的broadcastreceiver来劫持Intent,如果Intent中有敏感信息,会造成敏感信息泄露
检测平台修复建议:如果Intent中包含敏感信息,那么在sendBoadcast之前需要显式指定component
Intent附带数据漏洞
将不必要的导出的组件设置为不导出,防止引起拒绝服务,尤其是杀毒、安全防护、锁屏防盗等安全应用; 在AndroidMenifest.xml文件中,将相应组件的“android:exported”属性设置为“false”,如下示例:
<activity android:name="XXXActivity" android:exported="false"/>
Intent处理数据时进行捕获异常通过Intent.getXXXExtra()获取的数据时进行以下判断,以及用try catch方式进行捕获所有异常,以防止应用出现拒绝服务漏洞:空指针异常 类型转换异常 数组越界访问异常 类未定义异常 其他异常
如果getIntent()的intent附带空数据、异常或畸形数据,在处理getXXXExtra()获取数据时没进行异常捕获,会出现ClassNotFoundException异常导致应用Crash
阿里聚安全建议
数据存储安全问题
避免使用MODE_WORLD_WRITEABLE和MODE_WORLD_READABLE模式创建进程间通信的文件
避免将密码等敏感数据信息明文存储在Shared Preferences中
避免滥用“Android:sharedUserId”属性
使用MODE_WORLD_READABLE模式创建Shared Preferences文件,使得其他应用对该Shared Preferences文件具备可读的权限;
使用MODE_WORLD_WRITEABLE模式创建Shared Preferences文件并含有“android:sharedUserId”属性值,使得其他应用对该应用的Shared Preferences文件具备可写的权限。
在具备root权限的程序或用户对任何应用程序通过任意模式创建的的Shared Preferences文件都具有可读可写的权限
使用MODE_WORLD_READABLE模式创建存储文件或使用MODE_WORLD_WRITEABLE模式创建存储文件并含有"android:shareUserId" 属性值和测试签名
存在安全问题的数据存储 Shared Preferences、Intentnal Storage、Android Database
风险条件
风险原理
修复建议
Content Provider 文件目录遍历漏洞
将不必要导出的Content Provider设置为不导出
去除没有必要的OpenFile()接口
对openFile访问的文件路径进行有效判断
使用签名验证来控制Content
Provider共享数据的访问权限:设置protectionLevel=”signature”
对外暴露的Content Provider实现了openFile()接口,其它应用可以调用该Content Provider 并调用它的openFile()方法进行数据访问,如果没有对访问权限和目标文件Uri进行有效的判断,就可以遍历访问任意可读文件
对外暴露的Content Provider组件实现了opneFile()的接口
且没有对文件的Uri进行有效的判断和过滤
风险触发条件
漏洞原理
修复建议