Android四大组件常见漏洞
字数 2879 2025-09-01 11:26:17
Android四大组件安全漏洞与防护指南
1. Activity组件安全
1.1 Activity基本概念
启动方式:
- 显式启动:通过
putExtra和getStringExtra传参 - 隐式启动:需匹配
<action>和<category>内容 - 外部程序启动:通过
Uri.parse,需配置<data>标签
数据传递:
- 使用
startActivityForResult()启动活动,通过onActivityResult接收返回结果
生命周期:
- 标准模式(standard)
- 单顶模式(singleTop)
- 单任务模式(singleTask)
- 单实例模式(singleInstance)
1.2 Activity常见漏洞
越权绕过:
exported="true"或Android12以下未设置exported属性(默认true)- 有
<intent-filter>的Activity默认导出 - 攻击方法:
adb forward tcp:31415 tcp:31415 run app.activity.start --component com.example.login com.example.login.SuccessActivity adb shell am start -n com.victim.app/.SensitiveActivity adb shell am start -a com.example.SENSITIVE_ACTION
Activity劫持:
- 攻击方法:
run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity - 表现:劫持后背景消失
拒绝服务攻击:
- 通过intent发送空数据、异常或畸形数据
- 组件未进行异常捕获导致崩溃
1.3 Activity安全防护
-
私有Activity:
- 不定义
intent-filter - 设置
exported="false" - 不设置
launchMode和taskAffinity - 设置
excludeFromRecents="true"
- 不定义
-
公开Activity:
- 明确配置
intent-filter - 设置权限控制(
android:permission) - 对合作方app签名做校验
- 明确配置
-
其他防护措施:
- 校验Intent来源和参数
- 使用
try-catch捕获异常 - 设置调用频率限制
- 校验顶层应用:
topActivity.getPackageName
2. Service组件安全
2.1 Service基本概念
启动方式:
startService:必须用stopService结束bindService:可用unbindService结束或随Activity自动结束- 混合方式:同时使用
stopService和unbindService
通信机制:
- 显式启动
- 隐式启动:
- 用Action启动
- 用包名启动
bindService采用client-server模式,通过IBinder接口交互
2.2 Service常见漏洞
权限提升:
-
案例1:猎豹清理大师内存清理权限泄露漏洞(4.0.1及以下)
- 泄露权限:
android.permission.RESTART_PACKAGES - 攻击者可结束后台进程
- 泄露权限:
-
案例2:乐phone手机任意软件包安装删除漏洞
- 通过构造参数,可安装/删除任意Package
Service劫持:
- 隐式启动services时,先安装的同名services优先级高
消息伪造:
- 案例:优酷Android 4.5客户端升级漏洞
- 升级过程未验证下载地址,可指定任意地址
拒绝服务:
- 同Activity组件
2.3 Service安全防护
-
私有Service:
- 不定义
intent-filter - 设置
exported="false"
- 不定义
-
公开Service:
- 明确配置
intent-filter - 设置权限控制(
android:permission)
- 明确配置
-
其他防护措施:
- 对合作方app签名做校验
- 校验Intent来源和参数
- 使用
try-catch捕获异常 - 设置调用频率限制
3. Broadcast Receiver组件安全
3.1 Broadcast基本概念
基本角色:
- 消息订阅者
- 消息发布者
- 消息中心
注册方式:
- 静态注册:在
<receive>标签声明,不受组件生命周期影响 - 动态注册:通过
Context.registerReceiver(),随组件生命周期变化
广播类型:
- 按发送方式:
- 标准广播(异步)
- 有序广播(同步)
- 按内容:
- 普通广播
- 系统广播
- 有序广播
- 粘性广播
- App应用内广播
3.2 Broadcast常见漏洞
敏感信息泄露:
- Intent未明确指定接收者,仅通过action匹配
- 恶意应用可注册接收者拦截广播
权限绕过:
- 动态注册的广播默认导出
- 案例:小米MIUI手电筒漏洞
- TorchService未验证广播来源,可任意打开/关闭手电筒
消息伪造:
- 案例:百度云盘手机版漏洞
- 广播接收器未验证消息
- 可推送任意通知,利用webview盗取文件和执行代码
拒绝服务:
- 传递恶意畸形intent数据导致接收器崩溃
3.3 Broadcast安全防护
-
私有广播接收器:
- 不定义
intent-filter - 设置
exported="false"
- 不定义
-
内部app间广播:
- 使用
protectionLevel='signature'验证签名
- 使用
-
其他防护措施:
- 敏感广播使用显示意图指定接收者
- 对接收的广播进行验证
- 使用
LocalBroadcastManager限制广播范围
4. Content Provider组件安全
4.1 ContentProvider基本概念
功能:
- 不同应用间共享数据
- 跨进程通信
- 统一数据访问方式
URI结构:
- 标准前缀:
content:// - 唯一标识ContentProvider及其数据
操作方法:
- 通过
ContentResolver进行增删改查 - 获取方式:
Activity.getContentResolver()
4.2 ContentProvider常见漏洞
信息泄露:
- 权限控制不当
- 攻击方法:
- 分析provider进程名和授权URI
- 构造URI通过contentresolver读取数据
SQL注入:
- 未对用户输入过滤
- 未采用参数化查询
目录遍历:
openFile()接口未进行权限控制和URI验证- 可访问任意可读文件
4.3 ContentProvider安全防护
-
内部app数据交换:
- 设置
protectionLevel="signature"验证签名
- 设置
-
公开content provider:
- 确保不存储敏感数据
-
其他防护措施:
- 使用
Context.checkCallingPermission()验证调用者权限 - 使用参数化查询(如
SQLiteStatement) - 过滤用户输入
- 去除不必要的
openFile()接口 - 过滤
../等路径遍历字符 - 限制跨域访问,验证目标文件路径
- 使用
5. 通用安全建议
- 最小权限原则:仅暴露必要的组件
- 输入验证:对所有外部输入进行严格验证
- 异常处理:使用try-catch捕获所有可能的异常
- 签名验证:对合作方应用进行签名校验
- 敏感操作:添加权限控制和频率限制
- 组件导出:谨慎设置exported属性,Android12+必须显式声明
通过实施上述安全措施,可有效降低Android四大组件面临的安全风险,保护应用数据和用户隐私。