
Unityランタイムインジェクションの脆弱性CVE-2025-59489を検出する自動スキャナ。Android APKからUnityバージョンを抽出し、パッチ適用済みバージョンと照合してチェックします。バッチ処理とCI/CD統合に対応しています。
Android ゲームプラットフォーム専用の Unity Runtime インジェクション脆弱性自動検出ツール。
一言でまとめると:攻撃者は影響を受ける Unity ゲーム/アプリを完全に制御し、そのアプリのすべての権限を取得できます。
重要ポイント:Android では、悪意のあるアプリが Unity アプリが取得済みの権限を乗っ取ることができます
重要ポイント:Windows では、ゲームがカスタム URI ハンドラーを登録している場合、特別に細工されたリンクをクリックするだけで脆弱性をトリガーできます
| ゲームがこの権限を持つ場合 | 攻撃者は可能 |
|---|---|
| 📸 カメラ | あなたを盗撮 |
| 🎤 マイク | あなたを盗聴 |
| 📍 位置情報 | あなたを追跡 |
| 📱 連絡先 | あなたの連絡先を窃取 |
| 💾 ストレージ | ファイルの読み取り/削除 |
| 💰 決済 | ゲーム内決済を不正利用 |
| 🔐 アカウント | ゲームアカウントを窃取 |
良い知らせ:攻撃者はアプリ自体の権限境界を突破できません
悪い知らせ:多くのゲームは多数の権限(カメラ、マイク、ストレージ、位置情報など)を要求するため、攻撃者はこれらの権限を完全に悪用できます
Android ゲームプラットフォーム運営者として、最悪の結果:
[出典: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
ツールは 3 種類の結果タイプを返します:
出力例(単一行の簡潔な形式):
# 影響を受けるアプリ
⚠️ このアプリは 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)