🔐 Android 中的 Intent 参数传递机制与安全审计全解析
📌 Intent 是什么?
在 Android 中,Intent
是各个组件之间进行通信的核心机制。无论是启动一个 Activity
、唤起一个 Service
、还是广播事件,几乎所有的系统组件调用,底层都是通过 Intent
来实现参数传递和调度的。
通俗理解:Intent 就是 Android 的“快递单”或“信封”,可以塞参数进去、指定投递地址,再交给系统分发。
✅ Intent
的参数传递逻辑
当你写一个组件(比如 Service
)的入口方法长这样:
public void onStartCommand(Intent intent, int flags, int startId)
或者在 IntentService
中:
protected void onHandleIntent(Intent intent)
你就可以通过:
String value = intent.getStringExtra("key");
来获取从外部传进来的参数。
🔁 对应到 ADB 命令是这样的:
adb shell am startservice -n com.example.vuln/.YourService --es key "value"
🔍 实际等价于 Java 中执行了:
Intent intent = new Intent();
intent.putExtra("key", "value");
startService(intent);
然后你的服务代码中就能拿到:
String value = intent.getStringExtra("key"); // value = "value"
🧪 举个列子:命令执行漏洞
假设你写了一个导出服务类:
public class ExecService extends Service {
public int onStartCommand(Intent intent, int flags, int startId) {
String cmd = intent.getStringExtra("cmd");
Runtime.getRuntime().exec(cmd);
return START_NOT_STICKY;
}
}
对应的 ADB 利用命令就是:
adb shell am startservice -n com.example.vuln/.ExecService --es cmd "ls /sdcard/"
📋 Intent 参数传递类型 & 安全审计对照表
类型 | 传递方式示例 | Java 接收方法 | 审计要点 |
---|---|---|---|
字符串 | --es key "val" | getStringExtra("key") | 是否拼接进敏感函数,如命令、SQL |
整型 | --ei key 123 | getIntExtra("key", def) | 是否用作数组索引、循环计数 |
布尔值 | --ez key true | getBooleanExtra("key", def) | 控制逻辑分支?绕过校验? |
Bundle | – | getExtras() | 是否存储多个参数,需深入检查 |
URI | Intent.setData(Uri.parse("content://...")) | getData() | 用于文件/资源操作?可被滥用? |
Component Name | setComponent(...) | getComponent() | 指定调用目标组件?是否越权调用? |
☠️ 常见漏洞类型与审计要点
漏洞类型 | 意图参数例子 | 漏洞特征 | 审计关键点 |
---|---|---|---|
命令执行 RCE | --es cmd "rm -rf /sdcard" | 参数拼接进 exec() | Runtime.getRuntime().exec(...) |
SQL 注入 | --es name "' OR 1=1 --" | SQL 拼接语句中使用 Intent 参数 | rawQuery , + 参数 + |
权限绕过 | --es pkg "com.android.settings" | 使用了敏感 API 而无调用者校验 | getCallingUid() 缺失 |
服务滥用 | 重复调用 startService() | 消耗资源导致 ANR、DoS | 是否限制调用频率 |
信息泄露 | bindService() 后调用敏感 Binder 方法 | exported=true 且返回敏感信息 | 是否权限控制、是否对调用方校验 |
🚀 ADB 快速利用命令对照表
场景 | ADB 命令 |
---|---|
命令执行(RCE) | adb shell am startservice -n com.vuln/.ExecService --es cmd "id" |
SQL 注入 | adb shell am startservice -n com.vuln/.QueryService --es name "' OR 1=1 --" |
权限绕过删除应用 | adb shell am startservice -n com.vuln/.DeleteAppService --es pkg "com.xxx" |
触发大量计算卡顿 | adb shell am startservice -n com.vuln/.HeavyService |
✅ 总结
Android 四大组件(Activity、Service、BroadcastReceiver、ContentProvider)之间的通信,核心就是通过
Intent
实现的——除了ContentProvider
用的是ContentResolver
模式,其余三个组件主要都靠Intent
来传递数据和发起调用。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容