Android 4大组件攻击面分析

Android Activity

攻击面:

1)本地认证绕过;2)本地拒绝服务;3)界面劫持;

安全建议:

  • app内使用的私有Activity不应配置intent-filter,如果配置了intent-filter需设置exported属性为false。

  • 使用默认taskAffinity

  • 使用默认launchMode

  • 启动Activity时不设置intent的FLAG_ACTIVITY_NEW_TASK标签

  • 谨慎处理接收的intent以及其携带的信息

  • 签名验证内部(in-house)app

  • 当Activity返回数据时候需注意目标Activity是否有泄露信息的风险

  • 目的Activity十分明确时使用显示启动

  • 谨慎处理Activity返回的数据,目的Activity返回的数据有可能是恶意应用伪造的

  • 验证目标Activity是否恶意app,以免受到intent欺骗,可用hash签名验证

  • When Providing an Asset Secondhand, the Asset should be Protected with the Same Level of Protection

  • 尽可能的不发送敏感信息,应考虑到启动public Activity中intent的信息均有可能被恶意应用窃取的风险

测试方法:

查看activity:

  • 反编译查看配置文件AndroidManifest.xml中activity组件(关注配置了intent-filter的及未设置export=“false”的)

  • Drozer扫描:run app.activity.info -a packagename

启动activity:

  • adb shell:am start -a action -n package/componet

  • drozer: run app.activity.start –action android.action.intent.VIEW …

Android Service

攻击面:

1)提权;2)Service劫持;3)拒绝服务;4)消息伪造;

安全建议:

  • exported属性明确定义

  • 私有service不定义intent-filter并且设置exported为false

  • 公开的service设置exported为true,intent-filter可以定义或者不定义

  • 内部/合作service设置exported为true,intent-filter不定义

  • 只被应用本身使用的service应设置为私有

  • service接收到的数据需需谨慎处理

  • 内部service需使用签名级别的protectionLevel来判断是否未内部应用调用

  • 不应在service创建(onCreate方法被调用)的时候决定是否提供服务,应在onStartCommand/onBind/onHandleIntent等方法被调用的时候做判断.

  • 当service又返回数据的时候,因判断数据接收app是否又信息泄露的风险

  • 有明确的服务需调用时使用显示意图

  • 尽量不发送敏感信息

  • 合作service需对合作公司的app签名做效验

测试方法:

  • service不像broadcast receicer只能静态注册,通过反编译查看配置文件xml即可确定service,若有导出的service则进行下一步

  • 方法查看service类,重点关注onCreate/onStarCommand/onHandleIntent方法

  • 检索所有类中startService/bindService方法及其传递的数据

  • 根据业务情况编写测试poc或者直接使用adb命令测试

Android Content Provider

攻击面:

1)敏感信息泄漏;2)目录遍历;3)SQL注入;

安全建议:

  • minSdkVersion不低于9

  • 不向外部app提供的数据的私有content provider设置exported=“false”避免组件暴露(编译api小于17时更应注意此点)

  • 使用参数化查询避免注入

  • 内部app通过content provid交换数据设置protectionLevel=“signature”验证签名

  • 公开的content provider确保不存储敏感数据

  • decode() before use ContentProvider.openFile()

  • 提供asset文件时注意权限保护

测试方法:

  • 反编译查看xml(drozer扫描)文件定位content provider是否导出,是否配置权限,确定authority

  • 反编译查找path,关键字addURI、hook api动态监测

  • 确定authority和path后根据业务编写POC;使用drozer、使用小工具Content Provider Helper、adb shell // 没有对应权限会提示错误

Android Broadcast Receiver

攻击面:

1)拒绝服务;2)敏感信息泄漏;3)权限绕过;

安全建议:

  • 私有广播接收器设置exported=’false’,并且不配置intent-filter。(私有广播接收器依然能接收到同UID的广播)

  • 对接收来的广播进行验证

  • 内部app之间的广播使用protectionLevel=’signature’验证其是否真是内部app

  • 返回结果时需注意接收app是否会泄露信息

  • 发送的广播包含敏感信息时需指定广播接收器,使用显示意图或者

  • sticky broadcast粘性广播中不应包含敏感信息

  • Ordered Broadcast建议设置接收权限receiverPermission,避免恶意应用设置高优先级抢收此广播后并执行abortBroadcast()方法。

测试方法:

  • 查找动态广播接收器:反编译后检索registerReceiver(),

  • 查找静态广播接收器:反编译后查看配置文件查找广播接收器组件,注意exported属性

  • 查找发送广播内的信息检索sendBroadcast与sendOrderedBroadcast,注意setPackage方法于receiverPermission变量。

你可能感兴趣的:(Android 4大组件攻击面分析)