Android 游戏平台专用的 Unity Runtime 注入漏洞自动化检测工具。
一句话总结:攻击者可以完全控制受影响的 Unity 游戏/应用,拿到该应用的所有权限。
关键点:在 Android 上,恶意应用可以劫持 Unity 应用已获得的权限
关键点:在 Windows 上,如果游戏注册了 custom URI handler,点击特制链接即可触发漏洞
| 如果游戏有这个权限 | 攻击者就能 |
|---|---|
| 📸 摄像头 | 偷拍你 |
| 🎤 麦克风 | 偷听你 |
| 📍 位置 | 追踪你 |
| 📱 联系人 | 窃取你的通讯录 |
| 💾 存储 | 读取/删除你的文件 |
| 💰 支付 | 盗刷游戏内支付 |
| 🔐 账号 | 窃取游戏账号 |
好消息:攻击者无法突破应用本身的权限边界
坏消息:很多游戏要求大量权限(摄像头、麦克风、存储、位置等),攻击者可以完全利用这些权限
作为安卓游戏平台运营方,最糟糕的后果:
[来源:Unity 官方安全公告、GMO Flatt Security 技术分析]
# 仅需 Python 3.7+ 标准库,无需额外依赖
python3 --version # 确认 Python 版本
# 步骤 1: 运行测试
python test_demo.py
# 步骤 2: 检测单个 APK
python unity_vulnerability_checker.py your_game.apk
# 步骤 3: 批量检测
python unity_vulnerability_checker.py --batch /path/to/apks
# 步骤 4: 查看使用示例
python usage_examples.py
from unity_vulnerability_checker import check_unity_vulnerability
# 检测单个 APK 文件
result = check_unity_vulnerability("your_game.apk")
# 方式 1: 使用便捷属性
if result.is_vulnerable:
print(f"⚠️ 应用受影响!({result.version})")
print(f"建议:{result.recommendation}")
elif result.is_safe:
print(f"✅ 应用安全")
print(f"原因:{result.message}")
else:
print(f"❓ 需要人工复核")
print(f"原因:{result.message}")
# 方式 2: 使用 status 字段
if result.status == "positive":
print(f"受影响:{result.version}")
from unity_vulnerability_checker import batch_check
# 批量扫描一个目录
results = batch_check("/path/to/apk/folder")
# 筛选受影响的应用
vulnerable_apps = [
(name, result)
for name, result in results.items()
if result.is_vulnerable
]
print(f"发现 {len(vulnerable_apps)} 个受影响的应用")
for name, result in vulnerable_apps:
print(f" - {name}: {result.version}")
from unity_vulnerability_checker import UnityVulnerabilityChecker
class MyPlatform:
"""你的游戏平台系统"""
def __init__(self):
self.checker = UnityVulnerabilityChecker()
def check_new_upload(self, apk_path: str) -> bool:
"""检查新上传的 APK,返回是否可以上架"""
result = self.checker.check_apk(apk_path)
if result.is_vulnerable:
# 受影响 - 拒绝上架
self.notify_developer(
f"您的应用受 Unity 漏洞影响\n"
f"版本:{result.version}\n"
f"建议:{result.recommendation}"
)
return False
elif result.is_safe:
# 安全 - 批准上架
return True
else:
# 无法确定 - 人工复核
self.queue_manual_review(apk_path, result.message)
return False
def notify_developer(self, message: str):
"""通知开发者(实现你的通知逻辑)"""
pass
def queue_manual_review(self, apk_path: str):
"""加入人工复核队列(实现你的逻辑)"""
pass
工具返回三种结果类型:
输出示例(单行简洁格式):
# 受影响的应用
⚠️ 该应用受 CVE-2025-59489 影响 (Unity 2019.2.6f1)
# 安全的应用(3 种情况)
✅ 该应用安全 - 非 Unity 应用
✅ 该应用安全 - 已使用 Unity patcher 工具修复
✅ 该应用安全 - 已修复版本 (2019.4.41f1)
# 无法确定
❓ 无法确定 - Unity 应用但无法提取版本,可能被加壳或混淆,建议人工复核
⚠️ 文件过大无法处理 (1500.0MB,限制 1024MB) - 修改代码第 15 行 MAX_APK_SIZE_MB 为更大值
.
├── unity_vulnerability_checker.py # 核心模块
│ ├─ UnityVulnerabilityChecker 类 - 漏洞检测核心引擎
│ ├─ check_unity_vulnerability() - 简化的检测函数
│ ├─ batch_check() - 批量检测功能
│ └─ 完整的版本解析和判定逻辑
│
├── usage_examples.py # 使用示例
│ ├─ 基础使用示例
│ ├─ 批量检测示例
│ ├─ 平台集成示例
│ ├─ 自动化响应示例
│ └─ Flask API 集成示例
│
├── test_demo.py # 测试演示
│ ├─ 版本号解析测试
│ ├─ 版本提取测试
│ ├─ 修复判断测试
│ ├─ APK 扫描场景模拟
│ └─ 性能基准测试
│
├── test_version_detection.py # 单元测试(33 个测试用例)
│
├── README.md # 完整文档(包含快速开始指南)
│
└── CLAUDE.md # 开发规范
# 单文件检测
python unity_vulnerability_checker.py game.apk
# 详细日志模式
python unity_vulnerability_checker.py game.apk -v
# 批量检测目录
python unity_vulnerability_checker.py --batch /path/to/apk/folder
# 批量检测(详细模式)
python unity_vulnerability_checker.py --batch /path/to/apk/folder -v
from unity_vulnerability_checker import batch_check
results = batch_check("/path/to/apk/directory", verbose=True)
# 筛选受影响的应用
vulnerable = {name: result for name, result in results.items()
if result.is_vulnerable}
print(f"发现 {len(vulnerable)} 个受影响的应用")
from unity_vulnerability_checker import UnityVulnerabilityChecker
class AppReviewSystem:
def __init__(self):
self.checker = UnityVulnerabilityChecker(verbose=False)
def review_upload(self, apk_path: str) -> str:
result = self.checker.check_apk(apk_path)
if result.is_vulnerable:
return "REJECT" # 拒绝上架
elif result.is_safe:
return "APPROVE" # 批准
else:
return "MANUAL_REVIEW" # 人工复核
reviewer = AppReviewSystem()
decision = reviewer.review_upload("new_game.apk")
from flask import Flask, request, jsonify
from unity_vulnerability_checker import check_unity_vulnerability
app = Flask(__name__)
@app.route('/api/scan', methods=['POST'])
def scan_apk():
file = request.files['file']
temp_path = f"/tmp/{file.filename}"
file.save(temp_path)
result = check_unity_vulnerability(temp_path)
# 使用 to_dict() 方法直接转换为 JSON
response = result.to_dict()
response["filename"] = file.filename
response["vulnerable"] = result.is_vulnerable
return jsonify(response)
┌─────────────────┐
│ 读取 APK 文件 │
└────────┬─────────┘
│
▼
┌─────────────────┐
│ 是否为 Unity 应用? │──NO──> negative
└────────┬─────────┘
│ YES
▼
┌─────────────────────┐
│ 检测到 patcher 补丁? │──YES──> negative
└────────┬─────────────┘
│ NO
▼
┌─────────────────┐
│ 提取 Unity 版本 │──失败──> inconclusive
└────────┬─────────┘
│ 成功
▼
┌─────────────────┐
│ 版本 < 2017.1 ? │──YES──> negative
└────────┬─────────┘
│ NO
▼
┌─────────────────┐
│ 版本已修复? │──YES──> negative
└────────┬─────────┘
│ NO
▼
positive
检测 APK 中是否存在以下特征:
lib/*/libunity.so - Unity 运行时库assets/bin/Data/* - Unity 资源文件从以下位置提取 Unity 版本号:
支持的版本号格式:
2019.4.40f1, 2022.3.15f16000.0.23f1, 6000.2.6f22019.4.40, 6000.0.23