Android 安全之组件安全
1. 暴露Activity组件
漏洞利用的目的:
通过当前已经暴露的组件跳转访问到私有组件界面。
漏洞利用过程:
根据反编译可以看出,触发通过的条件是传入值为1的int变量key和值为“hello”的String变量value。
1 | private void a() { |
由此,利用adb命令访问activity组件:
1 | adb shell am start -n com.example.bughunter/com.example.bughunter.ComponentSecurity.ExportActivity --ei key 1 -e value "hello" |
利用start访问activity组件,其中“-n”后面是“包名/类名”,“–ei”表示传入int类型值,“-e”表示传入String值。由此,即可进入私有隐藏界面。
2. 暴露Service组件
漏洞利用的目的:
成功访问暴露的Service。
漏洞利用过程:
根据反编译可以看出,触发通过的条件是传入值action为”exportService”。
1 | public int onStartCommand(Intent paramIntent, int paramInt1, int paramInt2) { |
由此,利用adb命令访问service组件:
1 | adb shell am startservice -n com.example.bughunter/com.example.bughunter.ComponentSecurity.ExportService -a "exportService" |
利用startservice访问service组件,其中“-n”后面是“包名/类名”,“-a”表示传入的action。由此,即可成功运行暴露的Service。
3. 暴露Broadcast组件
漏洞利用的目的:
访问暴露的广播组件。通过传参访问广播组件并发送自定义内容的广播。
漏洞利用过程:
根据反编译可以看出,触发通过的条件是传入值action为”broadcast”。传入标题为“title”,传入内容为“content”。
1 | private void sendNotification(String paramString1, String paramString2, Context paramContext) { |
由此,利用adb命令访问broadcast组件:
1 | adb shell am broadcast -n com.example.bughunter/com.example.bughunter.ComponentSecurity.ExportReceiver -a "broadcast" -e "title" "Success" -e "content" "Successfully_delivered!" |
利用broadcast访问broadcast组件,其中“-n”后面是“包名/类名”,“-a”表示传入的action“broadcast”,“-e”后的“title”和“content”表示自定义的下拉内容。由此,即可成功通过传参访问广播组件并发送自定义内容的广播。
4. 组件劫持
漏洞利用的目的:
劫持带有个人数据(此处为IMEI码)私有组件,获取个人数据。
漏洞利用过程:
根据反编译可以看出,私有组件启动intent的方式是以指定action的方式,action为“hijack”。
1 | private void a() { |
由此,编写了一个APK,声明同样名字的action的暴露组件。当点击运行带参跳转的私有组件时,即可触发同样名字action的暴露组件,获得私有隐私数据IMEI码。
APK编写的过程是:
- 设置intent-filter使得action为“hijack”的intent可以通过过滤。
1 | <intent-filter> |
- 创建筛选出符合过滤器要求的intent的函数isActionSupport。当筛选符合过滤器要求的intent以后,获取intent,选择action为“hijack”的intent,获取名叫“imei”的String,利用Toast弹出“imei”的值。
1 | public void onStart() { |
5. 动态注册广播
漏洞利用的目的:
当前组件发送一个动态广播,对此实现获取个人数据、使组件崩溃和日志泄露。
漏洞利用过程:
根据反编译可以看出,组件发送广播和接收广播的过程,其中传递的私有数据为“imei”,action为“broadcast”。
1 | private void initView() { |
创建通过接收广播获取私有数据的函数并执行。
1 | public class MyBroadcast extends BroadcastReceiver { |
点击bug hunter的发送广播按钮,即可收到私有数据“imei”码。
创建发送空数据广播的函数send_null如下。
1 | private void send_null() { |
由于bug hunter一直保持接收广播的状态,一运行发送空广播的函数,即可看到bug hunter停止运行crash。
由于未注销广播可以导致intent泄露,反复打开当前界面,利用adb的logcat命令
1 | adb logcat | grep -E *leak* > 2.txt |
可以获取当前的含有leak的泄露日志,如下图所示。
6. Provider组件暴露
漏洞利用的目的:
获取当前组件写入暴露provider组件的个人数据。
漏洞利用过程:
根据反编译可以看出,provider处理的query操作。
1 | public Cursor query(Uri paramUri, String[] paramArrayOfString1, String paramString1, String[] paramArrayOfString2, String paramString2) { |
又根据反编译的代码获得URI和目录。
1 | MATCHER.addURI("com.example.bughunter.ComponentSecurity.ExportProvider", "info", 1); |
由此编写获取数据库个人数据的代码。
1 | public class MainActivity extends AppCompatActivity { |
运行代码,即可在系统输出中看到“imei”。