rejhums-cloud/SafeIntent-Mobile-Security
GitHub: rejhums-cloud/SafeIntent-Mobile-Security
一个Android移动安全项目,通过受害者和攻击者两个应用演示Intent劫持漏洞,并给出显式Intent和非导出组件的防御方案。
Stars: 0 | Forks: 0
# SafeIntent: 演示与防御 Android Intent 劫持
## 概述
SafeIntent 是一个移动安全项目,演示了 Android 应用间通信中的 Intent 劫持。该项目展示了当 Android 应用使用隐式 Intent 发送数据时,敏感数据可能如何泄露。同时,它也演示了如何使用显式 Intent 和非导出的内部组件来保护同一通信过程。
该项目包含两个 Android 应用:
1. **SafeIntent 受害者应用**
2. **SafeIntent 攻击者应用**
受害者应用包含脆弱和安全的通信流程。攻击者应用模拟一个恶意应用,注册了匹配的 Intent 过滤器,并捕获受害者应用发送的敏感数据。
## 项目动机
Android Intent 是活动、应用和系统组件之间通信的核心机制。然而,不安全地使用隐式 Intent 可能会将敏感数据暴露给非预期的应用。如果应用在不指定显式接收者的情况下将机密信息作为 Intent 附加数据发送,Android 的 Intent 解析系统可能会将数据传递给任何具有匹配 Intent 过滤器的应用。
该项目具有现实意义,因为 Intent 劫持是一个实际的移动安全问题,涉及不安全的进程间通信、组件暴露和数据泄露。该项目对 Android 开发者很有用,因为它同时演示了脆弱的实现和安全的缓解技术。
## 项目目标
该项目的主要目标是实现 Android Intent 劫持的技术攻防演示。
该项目实现了以下目标:
1. 演示使用隐式 Intent 的不安全应用间通信。
2. 展示恶意接收者如何滥用 Android Intent 解析。
3. 提取并显示 Intent 元数据,如动作名称、附加键、附加值、接收者类型和风险级别。
4. 在攻击者应用中实现风险评分系统。
5. 使用显式 Intent 实现安全的通信流程。
6. 使用 `android:exported="false"` 减少组件暴露。
7. 比较脆弱和安全的实现。
8. 为开发者提供防止 Intent 劫持的建议。
9. 记录攻击流程、缓解流程、截图、源代码和测试步骤。
## 包含的应用
### 1. SafeIntent 受害者应用
受害者应用包含:
- 脆弱的隐式 Intent 发送器
- 安全的显式 Intent 发送器
- 安全的内部接收者活动
- 安全报告屏幕
- 针对脆弱和安全流程的 Logcat 日志记录
受害者应用有三个主要按钮:
- **以不安全方式发送秘密数据**
- **以安全方式发送秘密数据**
- **为什么这很危险?**
### 2. SafeIntent 攻击者应用
攻击者应用包含:
- 用于劫持隐式 Intent 的匹配 Intent 过滤器
- Intent 元数据分析
- 捕获的秘密显示
- 风险评分计算
- 推荐的修复说明
- 用于攻击验证的 Logcat 日志记录
## 演示的漏洞
### 漏洞名称
**Android Intent 劫持**
### 类别
**不安全的应用间通信 / IPC 误用**
### 根本原因
受害者应用使用隐式 Intent 发送敏感数据,未指定确切的接收者。
### 影响
恶意外部应用可以注册匹配的 Intent 过滤器并接收敏感数据。
### 示例敏感数据
```
SESSION_TOKEN_12345
```
## 脆弱流程
脆弱流程使用隐式 Intent。
```
Intent intent = new Intent("com.safeintent.ACTION_SEND_SECRET");
intent.putExtra("secret", "SESSION_TOKEN_12345");
startActivity(intent);
```
在这种情况下,接收者没有明确定义。任何具有匹配 Intent 过滤器的应用都可以接收数据。
## 攻击者应用 Intent 过滤器
攻击者在 `AndroidManifest.xml` 中声明了匹配的 Intent 过滤器。
```
```
由于这个匹配的动作,Android 的 Intent 解析系统可以将受害者应用的隐式 Intent 传递给攻击者应用。
## 动态攻击流程
1. 用户打开受害者应用。
2. 用户点击 **以不安全方式发送秘密数据**。
3. 受害者应用使用隐式 Intent 发送秘密令牌。
4. Android 搜索具有匹配 Intent 过滤器的应用。
5. 攻击者应用接收隐式 Intent。
6. 攻击者应用从 Intent 附加数据中提取秘密。
7. 攻击者应用显示捕获的数据和风险分析。
预期的攻击者输出:
```
Captured Secret Data:
SESSION_TOKEN_12345
Intent Metadata Analysis
Action:
com.safeintent.ACTION_SEND_SECRET
Intent Type:
Implicit Intent
Extra Key:
secret
Extra Value:
SESSION_TOKEN_12345
Receiver Type:
External Application
Risk Score:
100/100
Risk Level:
HIGH
```
## 风险评分计算
攻击者应用执行简单的基于规则的风险计算。
| 风险因素 | 分数 |
|---|---:|
| 发现敏感附加数据 | +40 |
| 发现隐式 Intent 动作 | +30 |
| 涉及外部接收者 | +20 |
| 无权限保护 | +10 |
| **总计** | **100/100** |
风险等级:
| 分数范围 | 风险等级 |
|---|---|
| 80-100 | 高 |
| 50-79 | 中 |
| 0-49 | 低 |
## 安全流程
安全流程使用显式 Intent。
```
Intent intent = new Intent(MainActivity.this, SecureReceiverActivity.class);
intent.putExtra("secret", "SESSION_TOKEN_12345");
startActivity(intent);
```
在这里,接收者被显式设置为受害者应用内部的 `SecureReceiverActivity`。外部应用无法劫持此通信流程。
## Manifest 级别的安全性
安全接收者被声明为非导出。
```
```
这意味着外部应用无法直接启动此内部组件。这减少了受害者应用的攻击面。
## 脆弱实现 vs 安全实现
| 安全方面 | 脆弱版本 | 安全版本 |
|---|---|---|
| Intent 类型 | 隐式 Intent | 显式 Intent |
| 接收者选择 | Android Intent 解析器 | 固定的内部组件 |
| 外部拦截 | 可能 | 不可能 |
| 敏感附加数据暴露 | 是 | 否 |
| 组件暴露 | 较高 | 较低 |
| 权限保护 | 无 | 内部组件限制 |
| 风险等级 | 高 | 低 |
| 缓解措施 | 无 | 显式 Intent + `exported=false` |
## 项目架构
```
SafeIntent-Mobile-Security/
│
├── SafeIntentVictim/
│ ├── MainActivity.java
│ │ ├── Insecure sender using implicit intent
│ │ ├── Secure sender using explicit intent
│ │ └── Security report screen launcher
│ │
│ ├── SecureReceiverActivity.java
│ │ └── Receives secret only through internal explicit flow
│ │
│ ├── InfoActivity.java
│ │ └── Shows vulnerability explanation and mitigation
│ │
│ └── AndroidManifest.xml
│ └── SecureReceiverActivity exported=false
│
├── SafeIntentAttacker/
│ ├── MainActivity.java
│ │ ├── Receives hijacked intent
│ │ ├── Extracts intent extras
│ │ ├── Performs risk scoring
│ │ └── Displays metadata analysis
│ │
│ └── AndroidManifest.xml
│ └── Matching intent-filter for com.safeintent.ACTION_SEND_SECRET
│
├── screenshots/
│ ├── victim_home.png
│ ├── attacker_attack_log.png
│ ├── security_report.png
│ └── secure_receiver.png
│
└── README.md
```
## 如何运行
### 步骤 1:打开攻击者应用
1. 在 Android Studio 中打开 `SafeIntentAttacker`。
2. 构建并在模拟器或 Android 设备上运行。
3. 保持其安装在同一个设备上。
### 步骤 2:打开受害者应用
1. 在 Android Studio 中打开 `SafeIntentVictim`。
2. 构建并在同一个模拟器或设备上运行。
### 步骤 3:测试脆弱流程
1. 打开受害者应用。
2. 点击 **以不安全方式发送秘密数据**。
3. 攻击者应用应被打开。
4. 攻击者应用应显示捕获的秘密和 Intent 元数据分析。
### 步骤 4:测试安全流程
1. 再次打开受害者应用。
2. 点击 **以安全方式发送秘密数据**。
3. 受害者应用内部的 Secure Receiver 屏幕应打开。
4. 攻击者应用不应接收到数据。
### 步骤 5:查看安全报告
1. 打开受害者应用。
2. 点击 **为什么这很危险?**
3. 阅读漏洞解释、影响和缓解措施。
## 预期结果
### 不安全的结果
攻击者应用捕获秘密:
```
Captured Secret Data:
SESSION_TOKEN_12345
```
### 安全的结果
受害者应用在内部接收秘密:
```
Received safely inside Victim App:
SESSION_TOKEN_12345
```
## 使用 ADB 和 Logcat 进行动态测试
该项目也可以使用 Android 调试桥进行测试。
### 检查已安装的包
```
adb shell pm list packages | findstr safeintent
```
预期输出:
```
package:com.safeintent.victim
package:com.safeintent.attacker
```
### 观察运行时日志
标签:Android安全, Android开发, Intent劫持, IPC安全, JS文件枚举, XML 请求, 中间人攻击, 后台面板检测, 域名枚举, 安全开发, 攻击演示, 显式Intent, 目录枚举, 移动安全, 组件暴露, 隐式Intent, 风险评分