
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)
┌─────────────────┐
│ 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.23Unity 公式セキュリティ発表に基づくルール:
アプリ公開前に自動スキャンし、影響を受けるアプリの公開を拒否
from unity_vulnerability_checker import check_unity_vulnerability
def pre_publish_check(apk_path):
result = check_unity_vulnerability(apk_path)
if result.is_vulnerable:
return {
"approved": False,
"reason": f"CVE-2025-59489 vulnerability detected ({result.version})",
"recommendation": result.recommendation
}
return {"approved": True, "message": result.message}
既存のアプリライブラリを一括スキャンし、更新が必要なアプリを特定
python unity_vulnerability_checker.py --batch /data/published_apps > scan_report.txt
毎日定期的に新規アップロードアプリをスキャンし、開発者に自動通知
import schedule
from unity_vulnerability_checker import batch_check
def daily_scan():
results = batch_check("/data/new_uploads")
vulnerable = [(name, result) for name, result in results.items() if result.is_vulnerable]
if vulnerable:
# 詳細情報を含む通知を送信
for name, result in vulnerable:
send_notification(name, result.version, result.message)
schedule.every().day.at("02:00").do(daily_scan)
プラットフォームのセキュリティレポートを生成し、脆弱性の分布状況を集計
from unity_vulnerability_checker import batch_check
import json
results = batch_check("/data/all_apps")
report = {
"total": len(results),
"vulnerable": sum(1 for r in results.values() if r.is_vulnerable),
"safe": sum(1 for r in results.values() if r.is_safe),
"unclear": sum(1 for r in results.values() if r.is_uncertain),
# 詳細リスト
"vulnerable_apps": [
{"name": name, "version": r.version, "message": r.message}
for name, r in results.items() if r.is_vulnerable
]
}
with open("security_report.json", "w") as f:
json.dump(report, f, indent=2)
継続的インテグレーションフローに統合し、セキュリティチェックを自動化
#!/bin/bash
# CI パイプラインで使用
python unity_vulnerability_checker.py build/output.apk
result=$(python unity_vulnerability_checker.py build/output.apk | grep "検出結果")
if echo "$result" | grep -q "positive"; then
echo "Security check failed: CVE-2025-59489 detected"
exit 1
fi
echo "Security check passed"
安全と誤判定される可能性があるケース:
影響ありと誤判定される可能性があるケース:
inconclusive の結果については、手動確認を推奨考えられる原因:
推奨:このようなアプリについては手動確認を実施
Unity 公式は 2017.1-2018.4 バージョンにセキュリティパッチを提供していません。これらのバージョンには確かに脆弱性が存在しますが、以下の理由により:
そのため "positive" ではなく "inconclusive" を返します。推奨:
Unity 公式発表に基づくルールにより、標準ビルドの APK では精度 > 95% です。難読化またはパッキングされた APK は追加処理が必要な場合があります。
単一 APK の検出は通常 0.5〜2 秒以内に完了し、効率向上のための並列一括処理に対応しています。詳細なパフォーマンス指標は本ドキュメントの「パフォーマンス指標」セクションを参照してください。
現在のバージョンは Android APK に特化しています。iOS .ipa ファイルの検出には追加の適応が必要です。
unity_vulnerability_checker.py 内の PATCHED_VERSIONS ディクショナリを変更し、Unity 公式発表から最新情報を入手してください。
即時対応
継続的モニタリング
ユーザー通知
Unity バージョンのアップグレード
一時的な対策(アップグレードできない場合)
修正の検証
positive と報告されないことを確認問題が発生した場合:
test_demo.py を実行してツールが正常に動作するか検証usage_examples.py を確認して類似シナリオを探すプロジェクトには完全なコード品質チェックツールが設定されています:
# 依存関係のインストール
pip install ruff pre-commit
# pre-commit hooks のインストール
pre-commit install
# すべてのチェックを手動実行
pre-commit run --all-files
すべてのコミット前に以下のチェックが自動実行されます:
Ruff Linter - Python コード静的解析
Ruff Formatter - Python コードフォーマッター
共通ファイルチェック
Markdown 形式チェック
ruff.toml - Ruff 設定.pre-commit-config.yaml - Pre-commit hooks 設定すべてのコードはコミット前にruff チェックを通過する必要があります。チェックが失敗した場合、コミットはブロックされます。
# pre-commit が失敗した場合、一部の問題は自動修正されます
# 修正後は再度 git add してコミットする必要があります
git add .
git commit -m "your message"
# Python ファイルのみチェック
ruff check *.py
# 問題を自動修正
ruff check --fix *.py
# コードをフォーマット
ruff format *.py
major >= 2019 or major >= 6000)本ツールはセキュリティ監査およびコンプライアンスチェック専用です。
| ゲームがこの権限を持つ場合 | 攻撃者は可能 |
|---|
| 📸 カメラ | あなたを盗撮 |
| 🎤 マイク | あなたを盗聴 |
| 📍 位置情報 | あなたを追跡 |
| 📱 連絡先 | あなたの連絡先を窃取 |
| 💾 ストレージ | ファイルの読み取り/削除 |
| 💰 決済 | ゲーム内決済を不正利用 |
| 🔐 アカウント | ゲームアカウントを窃取 |
| Unity バージョン | 最低修正バージョン | ステータス |
|---|
| 6000.3 | 6000.3.0b4 | ✅ パッチあり |
| 6000.2 | 6000.2.6f2 | ✅ パッチあり |
| 6000.0 LTS | 6000.0.58f2 | ✅ パッチあり |
| 2022.3 | 2022.3.62f2 | ✅ パッチあり |
| 2021.3 | 2021.3.45f2 | ✅ パッチあり |
| 2020.x | 2020.1.18f1+ | ✅ パッチあり |
| 2019.x | 2019.1.15f1+ | ✅ パッチあり |
| 2017-2018 | N/A | ⚠️ 公式パッチなし、バージョンアップを推奨 |