## 不安全反序列化（High）

### 触发信号

- `pickle.loads()`/`unserialize()`/`ObjectInputStream` 反序列化不可信数据
- `JSON.parse()` 后直接执行/访问（JSON 注入）
- XML 解析器配置允许外部实体
- `yaml.load()`（非 `yaml.safe_load()`）
- `eval()`/`Function()` 执行反序列化结果

### 关键 Sink

| 漏洞类型 | Sink 函数 |
|---------|----------|
| Python pickle | `pickle.loads(data)`、`pickle.load(file)` |
| PHP unserialize | `unserialize(data)` |
| Java 反序列化 | `ObjectInputStream.readObject()`、`XMLDecoder.readObject()` |
| XXE | `XMLParser`/`DocumentBuilder`（未禁用外部实体） |
| YAML | `yaml.load(data)`（非 `yaml.safe_load()`） |
| JSON 注入 | `JSON.parse(user_input)` 后直接用于关键操作 |

### 判定流程

1. **识别 Sink**：`Read` 提取反序列化/XML 解析函数调用，标记 Sink 点
2. **反向追踪 Source**：`find_references` 追踪反序列化输入来源，判断是否来自不可信数据（用户输入、网络数据、数据库不可信列）
3. **检查 XXE 防护**：`Read` 确认 XML 解析器配置：
   - 是否禁用外部实体（`setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)`）
   - 是否禁用 DTD（`setFeature("http://xml.org/sax/features/external-general-entities", false)`）
   - 是否限制了外部实体解析
4. **检查反序列化防护**：`Read` 确认：
   - Python：是否使用 `pickle.loads` 处理不可信数据（应使用 `json`/`msgpack` 等安全格式）
   - Java：是否使用白名单过滤（`ObjectInputFilter`）
   - YAML：是否使用 `safe_load`（非 `load`）
5. **检查 JSON 注入风险**：`Read` 确认 `JSON.parse` 结果是否被安全使用：
   - 解析结果是否直接用于 `eval`、动态属性访问
   - 是否校验了解析后的对象结构（预期 schema）

### 证据构造

确认缺陷后，输出需包含：
- Source（不可信数据来源，含文件:行号）
- Sink（反序列化/解析位置，含文件:行号）
- 缺失的防护（未禁用外部实体、未使用安全格式）
- 利用场景（XXE payload、反序列化 gadget chain 示例）

### 排除

- Python `pickle` 仅用于内部可信数据（非用户输入）
- XML 解析已禁用外部实体和 DTD
- 使用 `yaml.safe_load()` 或 `json.loads()` 替代不安全格式
- JSON 解析后已校验 schema 再使用
