# 漏洞案例库

## 概述

本文档收集了Android系统开发中常见的安全漏洞案例，包括漏洞分析、利用方式、防护措施等，帮助开发者避免类似问题。

## 漏洞分类

### 1. 权限相关漏洞

#### 案例1: 权限提升攻击
**漏洞描述**: 应用通过权限提升获得不应有的权限

**漏洞原因**:
- 权限检查不严格
- 权限授予逻辑错误
- 权限泄露

**利用方式**:
```java
// 恶意应用尝试获取系统权限
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.system.app", 
    "com.system.app.ProtectedActivity"));
// 如果权限检查不严格，可能成功启动
startActivity(intent);
```

**防护措施**:
- 严格权限检查
- 验证调用者身份
- 使用签名权限
- 最小权限原则

**相关链接**: [[权限管理框架]]

#### 案例2: 权限泄露
**漏洞描述**: 应用将权限泄露给其他应用

**漏洞原因**:
- 组件导出且未设置权限
- 权限检查绕过
- 数据泄露

**利用方式**:
```xml
<!-- 错误配置：组件导出且无权限保护 -->
<activity
    android:name=".SensitiveActivity"
    android:exported="true" />
```

**防护措施**:
- 设置组件权限
- 限制组件导出
- 验证调用者
- 数据访问控制

### 2. 数据泄露漏洞

#### 案例3: 日志泄露敏感信息
**漏洞描述**: 日志中输出敏感信息，被恶意应用读取

**漏洞原因**:
- 开发时添加调试日志
- 生产环境未移除
- 日志级别设置不当

**利用方式**:
```java
// 错误示例：日志中输出敏感信息
Log.d("TAG", "User password: " + password);
Log.d("TAG", "API key: " + apiKey);

// 恶意应用可以读取日志
Process process = Runtime.getRuntime().exec("logcat -d");
BufferedReader reader = new BufferedReader(
    new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
    // 解析日志，获取敏感信息
}
```

**防护措施**:
- 生产环境移除调试日志
- 使用ProGuard混淆
- 敏感信息脱敏
- 设置日志级别

#### 案例4: 文件权限泄露
**漏洞描述**: 文件权限设置不当，其他应用可以访问

**漏洞原因**:
- 文件权限设置为全局可读
- 敏感文件未加密
- 文件路径可预测

**利用方式**:
```java
// 错误示例：文件权限设置为全局可读
File file = new File(getFilesDir(), "sensitive_data.txt");
file.setReadable(true, false);  // 全局可读

// 恶意应用可以读取
File sensitiveFile = new File("/data/data/com.victim.app/files/sensitive_data.txt");
if (sensitiveFile.exists() && sensitiveFile.canRead()) {
    // 读取敏感数据
}
```

**防护措施**:
- 使用MODE_PRIVATE创建文件
- 敏感文件加密存储
- 使用AndroidKeyStore
- 验证文件访问权限

### 3. 组件安全漏洞

#### 案例5: Intent劫持
**漏洞描述**: 恶意应用劫持Intent，获取敏感数据

**漏洞原因**:
- Intent未指定接收者
- 组件导出且无权限保护
- 数据验证不足

**利用方式**:
```java
// 错误示例：隐式Intent
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sensitive_data", data);
startActivity(intent);  // 可能被恶意应用劫持

// 恶意应用注册相同的Intent Filter
<activity android:name=".MaliciousActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
    </intent-filter>
</activity>
```

**防护措施**:
- 使用显式Intent
- 验证Intent接收者
- 设置组件权限
- 数据加密传输

#### 案例6: 组件导出漏洞
**漏洞描述**: 导出的组件未设置权限，被恶意应用调用

**漏洞原因**:
- 组件意外导出
- 未设置权限保护
- 功能验证不足

**利用方式**:
```xml
<!-- 错误配置 -->
<activity
    android:name=".AdminActivity"
    android:exported="true" />

<!-- 恶意应用直接调用 -->
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.victim.app", 
    "com.victim.app.AdminActivity"));
startActivity(intent);
```

**防护措施**:
- 限制组件导出
- 设置权限保护
- 验证调用者
- 功能访问控制

### 4. 加密相关漏洞

#### 案例7: 弱加密算法
**漏洞描述**: 使用弱加密算法，容易被破解

**漏洞原因**:
- 使用过时的加密算法
- 密钥长度不足
- 加密实现错误

**利用方式**:
```java
// 错误示例：使用弱加密算法
Cipher cipher = Cipher.getInstance("DES");  // DES已不安全
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(data);

// 攻击者可以破解
// DES密钥只有56位，容易被暴力破解
```

**防护措施**:
- 使用强加密算法（AES-256）
- 足够的密钥长度
- 使用标准加密库
- 定期更新加密算法

#### 案例8: 密钥硬编码
**漏洞描述**: 密钥硬编码在代码中，容易被提取

**漏洞原因**:
- 开发便利性考虑
- 安全意识不足
- 密钥管理不当

**利用方式**:
```java
// 错误示例：密钥硬编码
private static final String SECRET_KEY = "my_secret_key_12345";

// 攻击者可以反编译APK，提取密钥
// 使用jadx等工具反编译
// 找到硬编码的密钥
```

**防护措施**:
- 使用AndroidKeyStore
- 密钥服务器端管理
- 使用密钥派生
- 代码混淆

### 5. 网络安全漏洞

#### 案例9: 中间人攻击
**漏洞描述**: 未使用HTTPS或证书验证不当，容易被中间人攻击

**漏洞原因**:
- 使用HTTP传输敏感数据
- 证书验证被禁用
- 信任所有证书

**利用方式**:
```java
// 错误示例：信任所有证书
TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() { return null; }
        public void checkClientTrusted(X509Certificate[] certs, String authType) {}
        public void checkServerTrusted(X509Certificate[] certs, String authType) {}
    }
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
```

**防护措施**:
- 使用HTTPS
- 正确验证证书
- 证书固定
- 网络安全配置

#### 案例10: 敏感数据明文传输
**漏洞描述**: 敏感数据未加密传输

**漏洞原因**:
- 使用HTTP
- 数据未加密
- 安全意识不足

**防护措施**:
- 使用HTTPS
- 数据加密传输
- 使用安全协议

## 漏洞防护措施

### 1. 代码安全

#### 安全编码规范
- 输入验证
- 输出编码
- 错误处理
- 安全配置

#### 代码审查
- 安全代码审查
- 漏洞扫描
- 静态分析
- 动态测试

### 2. 系统加固

#### SELinux配置
- 编写SELinux策略
- 限制应用权限
- 强制访问控制

#### 系统配置
- 安全配置检查
- 系统服务安全
- 网络安全配置

### 3. 安全测试

#### 渗透测试
- 安全测试
- 漏洞扫描
- 安全审计

#### 自动化测试
- 安全测试用例
- 自动化扫描
- 持续监控

## 漏洞响应

### 1. 漏洞发现

#### 发现流程
1. 漏洞报告
2. 漏洞验证
3. 影响评估
4. 修复计划

### 2. 漏洞修复

#### 修复流程
1. 分析漏洞根因
2. 制定修复方案
3. 实施修复
4. 测试验证
5. 发布更新

### 3. 漏洞披露

#### 披露原则
- 负责任披露
- 及时通知
- 提供修复方案
- 安全公告

## 安全编码规范

### 1. 输入验证
```java
// ✅ 正确：验证输入
public void processInput(String input) {
    if (input == null || input.isEmpty()) {
        throw new IllegalArgumentException("Input cannot be null or empty");
    }
    // 验证输入格式
    if (!input.matches("[a-zA-Z0-9]+")) {
        throw new IllegalArgumentException("Invalid input format");
    }
    // 处理输入
}
```

### 2. 输出编码
```java
// ✅ 正确：输出编码
public String displayContent(String content) {
    // HTML编码
    return Html.escapeHtml(content);
}
```

### 3. 错误处理
```java
// ✅ 正确：不泄露敏感信息
try {
    // 操作
} catch (Exception e) {
    // 记录详细错误（内部日志）
    Log.e("TAG", "Error details", e);
    // 返回通用错误（用户界面）
    showError("操作失败，请重试");
}
```

### 4. 安全配置
```xml
<!-- ✅ 正确：安全配置 -->
<activity
    android:name=".SensitiveActivity"
    android:exported="false"
    android:permission="com.example.PERMISSION" />
```

## 相关链接

- [[README]]
- [[权限管理框架]]
- [[SELinux策略编写]]
- [[密钥存储与加密]]
