
Автоматический сканер, который обнаруживает уязвимость инъекции в среду выполнения Unity CVE-2025-59489 в Android APK-файлах путём извлечения версии Unity и проверки её на соответствие исправленным версиям, с пакетной обработкой и интеграцией в CI/CD.
Автоматизированный инструмент обнаружения уязвимости внедрения в Unity Runtime для Android-игровых платформ.
Кратко: злоумышленник может полностью контролировать затронутую игру/приложение Unity и получить все разрешения этого приложения.
Ключевой момент: на Android вредоносное приложение может перехватывать разрешения, уже полученные приложением Unity
Ключевой момент: на Windows, если игра зарегистрировала custom URI handler, переход по специально созданной ссылке может вызвать уязвимость
Хорошая новость: злоумышленник не может выйти за пределы разрешений самого приложения
Плохая новость: многие игры запрашивают множество разрешений (камера, микрофон, хранилище, геолокация и т.д.), и злоумышленник может полностью использовать эти разрешения
Как оператор 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
Инструмент возвращает три типа результатов:
Пример вывода (компактный однострочный формат):
# Затронутое приложение
⚠️ Приложение затронуто CVE-2025-59489 (Unity 2019.2.6f1)
# Безопасное приложение (3 случая)
✅ Приложение безопасно - не приложение Unity
✅ Приложение безопасно - исправлено с помощью инструмента Unity patcher
✅ Приложение безопасно - исправленная версия (2019.4.41f1)
# Невозможно определить
❓ Невозможно определить - приложение Unity, но не удалось извлечь версию, возможно упаковано или обфусцировано, рекомендуется ручная проверка
⚠️ Файл слишком большой для обработки (1500.0MB, лимит 1024MB) - измените MAX_APK_SIZE_MB в строке 15 кода на большее значение
.
├── 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 - библиотека времени выполнения Unityassets/bin/Data/* - файлы ресурсов UnityИзвлечение номера версии Unity из следующих источников:
Поддерживаемые форматы номеров версий:
2019.4.40f1, 2022.3.15f16000.0.23f1, 6000.2.6f22019.4.40, 6000.0.23Правила на основе официального уведомления о безопасности Unity:
Автоматическое сканирование перед публикацией приложения, отклонение затронутых приложений
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 pipeline
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. Эти версии действительно содержат уязвимость, но поскольку:
Поэтому возвращается "inconclusive", а не "positive". Рекомендации:
На основе правил официального уведомления Unity точность для стандартно собранных APK составляет > 95%. Обфусцированные или упакованные APK могут потребовать дополнительной обработки.
Проверка одного APK обычно завершается за 0.5-2 секунды, поддерживается параллельная пакетная обработка для повышения эффективности. Подробные показатели производительности см. в разделе "Показатели производительности" этого документа.
Текущая версия сосредоточена на APK для Android. Проверка файлов .ipa для iOS требует дополнительной адаптации.
Измените словарь PATCHED_VERSIONS в unity_vulnerability_checker.py, следите за официальными уведомлениями 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 | ⚠️ Нет официального патча, рекомендуется обновить версию |