一.Activity
漏洞
越权绕过漏洞
原理:
没有对调用activity的组件进行权限验证,就会造成验证的安全问题。
防护:
1. 私有activity是相对安全的,设置exported为false。
2. 公开activity应:谨慎处理接收的intent;返回数据不应包含敏感信息;不应发送敏感信息;收到返回数据时谨慎处理。
钓鱼欺诈劫持
原理:
启动一个activity时,加入标志位FLAG_ACTIVITY_NEW_TASK,能够使被启动的activity立马呈现给用户,可用于钓鱼欺诈。
防护:
1. 如果当前程序进入后台那么对用户进行提示该程序已经进入后台运行。
隐式启动intent
包含敏感数据
原理:
当存在两个应用具有相同的隐式启动activity需要的action时,一个应用的activity是导出的,一个应用的activity是不被导出的,那么当触发该action时,将会弹出选择哪一个activity的界面,进而能够启动那个不被导出的activity。(老版本才有,新版本已修复此漏洞,经测4.4版本无此漏洞)。
拒绝服务
原理:
本地组件启动时没有对Intent.getXXXExtra()获取或处理的数据进行异常捕获,从而导致攻击者可通过向受害者应用发送空数据、异常或者畸形数据来使该应用crash的目的。
防护:
1. 谨慎处理接收的intent以及其携带的信息。
2. 对接收到的任何数据做try catch处理,对于不符合预期的数据做异常处理,异常包括但不限于:空指针异常、类型转换异常、数组越界访问异常、类未定义异常、序列化反序列化异常(getSerializableExtra、getParcelableExtra)
Fragment注入
原理:
通过导出的PreferenceActivity的子类,没有正确处理Intent的extra值。攻击者可绕过限制访问未授权的界面。
防护:
当targetSdk大于等于19时,强制实现了isValidFragment方法;小于19时,在PreferenceActivity的子类中都要加入isValidFragment ,两种情况下在isValidFragment方法中进行fragment名的合法性校验。
二.Service
漏洞
权限提升
原理:
当一个具有高权限的service是被导出的时,如果没对调用这个Service进行权限限制和调用者的身份验证时,那么恶意的app将具有调用高权限的service的能力来执行高权限行为等。
Service
劫持
原理:
对于隐式启动的service,当存在同action名触发条件的service时,先安装应用的service优先级高,即使本应用使用startservice想要启动本应用的未导出的隐式service时也会被先安装的其他app的service劫持,因此想要劫持某个隐式启动的service时,只需要更早的在android系统中安装同action名的隐式启动的servic。(经测试,android4.4版本也有此问题;android5.0之后启动隐式的service时需要指明包名,因此理论上可以避免劫持的问题)。
消息伪造
原理:
对于被导出的service具有接收消息并进行相应操作时,如果不加权限控制和调用者的身份验证,那么将有可能具有消息伪造的安全隐患。
拒绝服务
原理:
同Activity漏洞->拒绝服务->原理
防护:
同Activity漏洞->拒绝服务->防护
Service
安全防护
1. 私有的service尽量不定义intent-filter并且设置exported为false。
2. 公开的service设置exported为true。
3. 尽量用显示的方式启动service。
4. 合作service需对合作方的app签名做校验。
5. Service接收到的数据需要谨慎处理。
6. 内部service需使用签名级别的protectionLevel来判断是否为内部应用调用。
7. Service不应在onCreate时决定是否提供服务,应在onStartCommand/onBind/onHandleIntent等方法被调用时做判断。
8. 当service有返回数据时,应判断接收数据的组件是否有信息泄露的风险。
9. 尽量不发送敏感信息。
三.Broadcast Receiver
漏洞
敏感信息泄露
原理:
发送intent的时候没有明确指定接收者,而是简单的通过action进行匹配,而如果这个intent里包含敏感数据,那么恶意应用就可以注册一个广播接收者,嗅探并且拦截这个广播并且窃取敏感数据。
防护:
使用LocalBroadcastManager来注册和发送广播只能被app自身广播接收器接收。
权限绕过漏洞
原理:
使用Context.registerReceiver()动态注册的广播默认是导出的,如果导出的BroadcastReceiver没有做权限控制,导致其可以接收一个外部可控的url、命令等信息来执行特定的功能,那么攻击者可以利用应用的这些功能来执行越权操作。
防护:
1.使用带权限检验的registerReceiver API进行动态广播的注册。
2.使用LocalBroadCastManager来动态注册广播,其有以下三点优势:
- 不必担心敏感数据泄露,通过这种方式发送的广播只能应用内接收。
- 不必担心安全漏洞被利用,因为其他应用无法发送广播给该应用。
- 它比系统的全局广播更高效。
消息伪造
原理:
对于必须暴露的Receiver来说,如果其对外接收Intent而没有进行权限控制和身份验证,那么攻击者则能够伪造Intent中的消息。
防护:
自定义声明权限,其protectionLevel为signature,在该暴露的Receiver中使用android:permission对其进行自定义权限限定,那么当其他应用如果和该应用的签名不一致时将无法申请该自定义权限,那么其他应用发出的不具有该自定义权限的同action广播是不会被该暴露的Receiver接收到的。
拒绝服务
原理:
同Activity漏洞->拒绝服务->原理
防护:
同Activity漏洞->拒绝服务->防护
Broadcast
安全防护
1. 私有广播接收器设置exported为false,尽量不配置intent-filter。
2. 私有广播尽量使用LocalBroadcastManag