前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android组件安全

Android组件安全

作者头像
信安之路
发布2018-08-01 16:22:02
2.3K1
发布2018-08-01 16:22:02
举报
文章被收录于专栏:信安之路信安之路

组件是一个Android程序至关重要的构建模块。Android有四种不同的应用程序组件:Activity、Service、Content Provider和Broadcast receiver。组件的安全对于android应用来说不容忽视,下面介绍常用的android组件安全的测试方法。

工具:Drozer,AndroidKiller,adb
样例apk:sieve.apk,goatdroid.apk

Activity组件暴露问题

Activity 为一个用户交互提供一个单独的界面。如果组件暴露,且应用对权限控制不当,可以绕过登录界面直接访问登陆后界面。

检测方法

通常检测这种问题的方法有两个,一个是逆向反编译apk,查看AndroidManifest.xml的内容,一个是使用adb调试查看。

反编译apk

反编译apk后查看AndroidManifest.xml的内容,查找android:exported="true"的activity标签,如下:

代码语言:javascript
复制
<activity android:clearTaskOnLaunch="true" android:excludeFromRecents="true" android:exported="true" android:finishOnTaskLaunch="true" android:label="@string/title_activity_pwlist" android:name=".PWList"/>

或者配置了intent-filter而未设置android:exported=“false”的activity标签。 如下:

代码语言:javascript
复制
<activity android:excludeFromRecents="true" android:label="@string/app_name" android:launchMode="singleTask" android:name=".MainLoginActivity" android:windowSoftInputMode="adjustResize|stateVisible">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
</activity>

说明这些activity组件(com.mwr.example.sieve.PWList,com.mwr.example.sieve. MainLoginActivity)存在问题。

adb调试

使用工具Drozer,在其命令行下执行以下命令:

代码语言:javascript
复制
dz> run app.activity.info -a com.mwr.example.sieve
利用方式
使用adb
代码语言:javascript
复制
adb shell am start -a action -n com.mwr.example.sieve/com.mwr.example.sieve.PWList
使用Drozer
代码语言:javascript
复制
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList

绕过了登陆页面,直接启动了登陆后的页面:

如何修复

1.如果App的Activity组件不用导出,或者组件配置了intentfilter标签,设置组件的“android:exported”属性为false

2.如果组件需要给外部应用使用,应对组件进行权限控制

Content provider组件暴露

content provider负责管理应用程序的数据共享集。你可以通过文件系、SQLite数据库、网站,或者其它的你的应用程序可以访问的持久化存储位置来存储数据。通过content provider,其它的应用程序可以查询甚至修改你的数据(如果这个content provider允许它们这么做)。每个Content Provider都对应一个以”content://”开头的特定URI,任何应用都可以通过这个URI操作Content Provider 应用的数据库。如果应用对权限控制不当就会造成信息泄露。

检测方法

与上一个问题检测方法类似。

反编译apk

在AndroidManifest.xml文件中查找android:exported="true"的provider标签,或者配置了intent-filter的及未设置android:exported=“false”的provider标签,例如:

代码语言:javascript
复制
<provider android:authorities="com.mwr.example.sieve.DBContentProvider" android:exported="true" android:multiprocess="true" android:name=".DBContentProvider">
        <path-permission android:path="/Keys" android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS"/>
</provider>
<provider android:authorities="com.mwr.example.sieve.FileBackupProvider" android:exported="true" android:multiprocess="true" android:name=".FileBackupProvider"/>
使用Drozer

使用工具Drozer,在其命令行下执行以下命令:

代码语言:javascript
复制
dz> run app.provider.info -a  com.mwr.example.sieve
Content provider注入
代码语言:javascript
复制
dz> run scanner.provider.injection -a com.mwr.example.sieve
代码语言:javascript
复制
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/
如何修复

1.将不需要导出的Content Provider组件设置为android:exported="false"

2.对访问的目标文件的路径进行有效判断

Broadcast receiver组件暴露

broadcast receiver 是一个用来响应系统范围内的广播的组件。很多广播发自于系统本身。

例如, 通知屏幕已经被关闭、电池低电量、照片被拍下的广播。应用程序也可以发起广播。

例如, 通知其它程序,一些数据被下载到了设备,且可供它们使用。虽然广播并不提供用户交互界面,它们也可以创建一个状态栏通知来提醒用户一个广播事件发生了。尽管如此,更多的情形是,一个广播只是进入其它组件的一个“门路”,并试图做一些少量的工作。 如果组件暴露,且存在配置不当则其他应用可以伪装发送广播从而可造成信息泄露,拒绝服务攻击等。

检测方法
反编译apk

在AndroidManifest.xml文件中查找android:exported="true"的receiver标签,或者配置了intent-filter的及未设置android:exported=“false”的receiver标签。例如:

代码语言:javascript
复制
<receiver android:label="Send SMS" android:name=".broadcastreceivers.SendSMSNowReceiver"><intent-filter>
      <action android:name="org.owasp.goatdroid.fourgoats.SOCIAL_SMS"/>
</intent-filter></receiver>
使用Drozer
代码语言:javascript
复制
dz> run app.broadcast.info -a org.owasp.goatdroid.fourgoats
利用方式
使用adb
代码语言:javascript
复制
adb shell am broadcast -a org.owasp.goatdroid.fourgoats.SOCIAL_SMS -e phoneNumber 123456 -e message hehe!
使用Drozer
代码语言:javascript
复制
dz> run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 123456 --extra string message hehe!
如何修复

1.如果应用的Content Provider组件不必要导出,建议显式设置组件的“android:exported”属性为false

2.如果必须要有数据提供给外部应用使用,建议对组件进行权限控制

Service组件暴露

service是一个运行在后台的组件。它用于执行耗时操作或者远程进程。 一个service并不提供用户交互界面。如果组件暴露,且应用对权限控制不当,导致其他应用可以启动被测应用的Service。

检测方法
反编译apk

在AndroidManifest.xml文件中查找android:exported="true"的service标签,例如:

代码语言:javascript
复制
<service android:name=".services.LocationService"><intent-filter>
    <action android:name="org.owasp.goatdroid.fourgoats.services.LocationService"/></intent-filter></service>
使用Drozer
代码语言:javascript
复制
dz> run app.service.info -a com.mwr.example.sieve
Service 拒绝服务
使用adb
代码语言:javascript
复制
adb shell am startservice -a org.owasp.goatdroid.fourgoats.services.LocationService
使用Drozer
代码语言:javascript
复制
dz> run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService
如何修复

1.如果App的Service组件不需要导出,或者组件配置了intent filter标签,应设置组件的“android:exported”属性为false

2.如果组件要提供给外部应用使用,建议对组件进行权限控制

参考连接

http://android-doc.com/guide/components/fundamentals.html

http://www.droidsec.cn/android-activtity-security/

http://www.droidsec.cn/android-service-security/

http://www.droidsec.cn/android-broadcast-security/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 信安之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工具:Drozer,AndroidKiller,adb
  • 样例apk:sieve.apk,goatdroid.apk
  • Activity组件暴露问题
    • 检测方法
      • 反编译apk
      • adb调试
    • 利用方式
      • 使用adb
      • 使用Drozer
    • 如何修复
    • Content provider组件暴露
      • 检测方法
        • 反编译apk
        • 使用Drozer
      • Content provider注入
        • 如何修复
        • Broadcast receiver组件暴露
          • 检测方法
            • 反编译apk
            • 使用Drozer
          • 利用方式
            • 使用adb
            • 使用Drozer
          • 如何修复
          • Service组件暴露
            • 检测方法
              • 反编译apk
              • 使用Drozer
            • Service 拒绝服务
              • 使用adb
              • 使用Drozer
            • 如何修复
            • 参考连接
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档