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, 风险评分