
Escáner automatizado que detecta la vulnerabilidad de inyección en tiempo de ejecución de Unity CVE-2025-59489 en APKs de Android extrayendo la versión de Unity y verificándola contra las versiones parcheadas, con procesamiento por lotes e integración con CI/CD.
Herramienta de detección automatizada de vulnerabilidades de inyección en Unity Runtime, diseñada específicamente para plataformas de juegos Android.
Resumen en una frase: Un atacante puede tomar control total del juego/aplicación Unity afectado, obteniendo todos los permisos de dicha aplicación.
Punto clave: En Android, una aplicación maliciosa puede secuestrar los permisos ya obtenidos por la aplicación Unity
Punto clave: En Windows, si el juego registra un controlador de URI personalizado, hacer clic en un enlace especialmente diseñado puede activar la vulnerabilidad
Buena noticia: El atacante no puede superar los límites de permisos de la propia aplicación
Mala noticia: Muchos juegos requieren numerosos permisos (cámara, micrófono, almacenamiento, ubicación, etc.), y el atacante puede explotar completamente estos permisos
Como operador de una plataforma de juegos Android, las peores consecuencias:
[Fuente: Aviso de seguridad oficial de Unity, análisis técnico de GMO Flatt Security]
# Solo se necesita la biblioteca estándar de Python 3.7+, sin dependencias adicionales
python3 --version # Confirmar la versión de Python
# Paso 1: Ejecutar las pruebas
python test_demo.py
# Paso 2: Detectar un solo APK
python unity_vulnerability_checker.py your_game.apk
# Paso 3: Detección por lotes
python unity_vulnerability_checker.py --batch /path/to/apks
# Paso 4: Ver ejemplos de uso
python usage_examples.py
from unity_vulnerability_checker import check_unity_vulnerability
# Detectar un solo archivo APK
result = check_unity_vulnerability("your_game.apk")
# Forma 1: Usar propiedades convenientes
if result.is_vulnerable:
print(f"⚠️ ¡Aplicación afectada! ({result.version})")
print(f"Sugerencia: {result.recommendation}")
elif result.is_safe:
print(f"✅ Aplicación segura")
print(f"Motivo: {result.message}")
else:
print(f"❓ Se requiere revisión manual")
print(f"Motivo: {result.message}")
# Forma 2: Usar el campo status
if result.status == "positive":
print(f"Afectada: {result.version}")
from unity_vulnerability_checker import batch_check
# Escanear un directorio por lotes
results = batch_check("/path/to/apk/folder")
# Filtrar aplicaciones afectadas
vulnerable_apps = [
(name, result)
for name, result in results.items()
if result.is_vulnerable
]
print(f"Se encontraron {len(vulnerable_apps)} aplicaciones afectadas")
for name, result in vulnerable_apps:
print(f" - {name}: {result.version}")
from unity_vulnerability_checker import UnityVulnerabilityChecker
class MyPlatform:
"""Tu sistema de plataforma de juegos"""
def __init__(self):
self.checker = UnityVulnerabilityChecker()
def check_new_upload(self, apk_path: str) -> bool:
"""Verificar APK recién subido, devolver si se puede publicar"""
result = self.checker.check_apk(apk_path)
if result.is_vulnerable:
# Afectado - rechazar publicación
self.notify_developer(
f"Su aplicación está afectada por la vulnerabilidad de Unity\n"
f"Versión: {result.version}\n"
f"Sugerencia: {result.recommendation}"
)
return False
elif result.is_safe:
# Seguro - aprobar publicación
return True
else:
# No se puede determinar - revisión manual
self.queue_manual_review(apk_path, result.message)
return False
def notify_developer(self, message: str):
"""Notificar al desarrollador (implementa tu lógica de notificación)"""
pass
def queue_manual_review(self, apk_path: str):
"""Agregar a la cola de revisión manual (implementa tu lógica)"""
pass
La herramienta devuelve tres tipos de resultados:
Ejemplo de salida (formato conciso de una línea):
# Aplicación afectada
⚠️ Esta aplicación está afectada por CVE-2025-59489 (Unity 2019.2.6f1)
# Aplicación segura (3 casos)
✅ Esta aplicación es segura - No es una aplicación Unity
✅ Esta aplicación es segura - Ya corregida con la herramienta Unity patcher
✅ Esta aplicación es segura - Versión corregida (2019.4.41f1)
# No se puede determinar
❓ No se puede determinar - Es una aplicación Unity pero no se pudo extraer la versión, posiblemente empaquetada u ofuscada, se recomienda revisión manual
⚠️ Archivo demasiado grande para procesar (1500.0MB, límite 1024MB) - Modificar MAX_APK_SIZE_MB en la línea 15 del código a un valor mayor
.
├── unity_vulnerability_checker.py # Módulo principal
│ ├─ Clase UnityVulnerabilityChecker - Motor principal de detección de vulnerabilidades
│ ├─ check_unity_vulnerability() - Función de detección simplificada
│ ├─ batch_check() - Función de detección por lotes
│ └─ Lógica completa de análisis y determinación de versiones
│
├── usage_examples.py # Ejemplos de uso
│ ├─ Ejemplos de uso básico
│ ├─ Ejemplos de detección por lotes
│ ├─ Ejemplos de integración en plataformas
│ ├─ Ejemplos de respuesta automatizada
│ └─ Ejemplos de integración con API Flask
│
├── test_demo.py # Demostración de pruebas
│ ├─ Pruebas de análisis de números de versión
│ ├─ Pruebas de extracción de versiones
│ ├─ Pruebas de determinación de corrección
│ ├─ Simulación de escenarios de escaneo de APK
│ └─ Pruebas de referencia de rendimiento
│
├── test_version_detection.py # Pruebas unitarias (33 casos de prueba)
│
├── README.md # Documentación completa (incluye guía de inicio rápido)
│
└── CLAUDE.md # Estándares de desarrollo
# Detección de un solo archivo
python unity_vulnerability_checker.py game.apk
# Modo de registro detallado
python unity_vulnerability_checker.py game.apk -v
# Detección por lotes de un directorio
python unity_vulnerability_checker.py --batch /path/to/apk/folder
# Detección por lotes (modo detallado)
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)
# Filtrar aplicaciones afectadas
vulnerable = {name: result for name, result in results.items()
if result.is_vulnerable}
print(f"Se encontraron {len(vulnerable)} aplicaciones afectadas")
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" # Rechazar publicación
elif result.is_safe:
return "APPROVE" # Aprobar
else:
return "MANUAL_REVIEW" # Revisión manual
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)
# Usar el método to_dict() para convertir directamente a JSON
response = result.to_dict()
response["filename"] = file.filename
response["vulnerable"] = result.is_vulnerable
return jsonify(response)
┌─────────────────┐
│ Leer archivo APK │
└────────┬─────────┘
│
▼
┌─────────────────┐
│ ¿Es una app Unity? │──NO──> negative
└────────┬─────────┘
│ SÍ
▼
┌─────────────────────┐
│ ¿Se detectó parche patcher? │──SÍ──> negative
└────────┬─────────────┘
│ NO
▼
┌─────────────────┐
│ Extraer versión Unity │──fallo──> inconclusive
└────────┬─────────┘
│ éxito
▼
┌─────────────────┐
│ ¿Versión < 2017.1? │──SÍ──> negative
└────────┬─────────┘
│ NO
▼
┌─────────────────┐
│ ¿Versión corregida? │──SÍ──> negative
└────────┬─────────┘
│ NO
▼
positive
Detectar si el APK contiene las siguientes características:
lib/*/libunity.so - Biblioteca de tiempo de ejecución de Unityassets/bin/Data/* - Archivos de recursos de UnityExtraer el número de versión de Unity desde las siguientes ubicaciones:
Formatos de número de versión compatibles:
2019.4.40f1, 2022.3.15f16000.0.23f1, 6000.2.6f22019.4.40, 6000.0.23Basado en las reglas del aviso de seguridad oficial de Unity:
Escanear automáticamente antes de publicar una aplicación, rechazando las aplicaciones afectadas
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}
Escaneo por lotes de la biblioteca de aplicaciones existente para identificar aplicaciones que necesitan actualización
python unity_vulnerability_checker.py --batch /data/published_apps > scan_report.txt
Escaneo programado diario de aplicaciones recién subidas, notificación automática a los desarrolladores
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:
# Enviar notificación con información detallada
for name, result in vulnerable:
send_notification(name, result.version, result.message)
schedule.every().day.at("02:00").do(daily_scan)
Generar informes de seguridad de la plataforma, estadísticas de distribución de vulnerabilidades
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),
# Lista detallada
"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)
Integración en el flujo de integración continua para verificación de seguridad automatizada
#!/bin/bash
# Usar en el pipeline de 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"
Posibles casos de clasificación errónea como seguro:
Posibles casos de clasificación errónea como afectado:
inconclusive, se recomienda revisión manualPosibles razones:
Sugerencia: Realizar revisión manual de estas aplicaciones
Unity no proporcionó parches de seguridad para las versiones 2017.1-2018.4. Estas versiones sí tienen la vulnerabilidad, pero debido a que:
Por lo tanto, se devuelve "inconclusive" en lugar de "positive". Sugerencias:
Basado en las reglas del aviso oficial de Unity, la precisión para APK construidos estándar es > 95%. Los APK ofuscados o empaquetados pueden requerir procesamiento adicional.
La detección de un solo APK generalmente se completa en 0.5-2 segundos, con soporte para procesamiento por lotes en paralelo para mejorar la eficiencia. Las métricas de rendimiento detalladas se encuentran en la sección "Métricas de Rendimiento" de este documento.
La versión actual se centra en APK de Android. La detección de archivos .ipa de iOS requiere adaptación adicional.
Modificar el diccionario PATCHED_VERSIONS en unity_vulnerability_checker.py, prestando atención a los avisos oficiales de Unity para obtener la información más reciente.
Acción inmediata
Monitoreo continuo
Notificación a usuarios
Actualizar la versión de Unity
Solución temporal (cuando no se puede actualizar)
Verificar la corrección
positive¿Tienes problemas?
test_demo.py para verificar que la herramienta funciona correctamenteusage_examples.py para encontrar escenarios similaresEl proyecto incluye herramientas completas de verificación de calidad de código:
# Instalar dependencias
pip install ruff pre-commit
# Instalar pre-commit hooks
pre-commit install
# Ejecutar manualmente todas las verificaciones
pre-commit run --all-files
Antes de cada confirmación se ejecutan automáticamente las siguientes verificaciones:
Ruff Linter - Análisis estático de código Python
Ruff Formatter - Formateo de código Python
Verificación de archivos generales
Verificación de formato Markdown
ruff.toml - Configuración de Ruff.pre-commit-config.yaml - Configuración de pre-commit hooksTodo el código debe pasar la verificación de ruff antes de confirmarse. Si la verificación falla, la confirmación será bloqueada.
# Si pre-commit falla, corregirá automáticamente algunos problemas
# Después de la corrección, se debe volver a ejecutar git add y confirmar
git add .
git commit -m "your message"
# Solo verificar archivos Python
ruff check *.py
# Corregir problemas automáticamente
ruff check --fix *.py
# Formatear código
ruff format *.py
major >= 2019 or major >= 6000)Esta herramienta está destinada únicamente para auditoría de seguridad y verificación de cumplimiento.
| Si el juego tiene este permiso | El atacante puede |
|---|
| 📸 Cámara | Grabarte en secreto |
| 🎤 Micrófono | Escucharte |
| 📍 Ubicación | Rastrearte |
| 📱 Contactos | Robar tu agenda |
| 💾 Almacenamiento | Leer/eliminar tus archivos |
| 💰 Pagos | Realizar compras fraudulentas dentro del juego |
| 🔐 Cuenta | Robar la cuenta del juego |
| Versión de Unity | Versión mínima corregida | Estado |
|---|
| 6000.3 | 6000.3.0b4 | ✅ Hay parche |
| 6000.2 | 6000.2.6f2 | ✅ Hay parche |
| 6000.0 LTS | 6000.0.58f2 | ✅ Hay parche |
| 2022.3 | 2022.3.62f2 | ✅ Hay parche |
| 2021.3 | 2021.3.45f2 | ✅ Hay parche |
| 2020.x | 2020.1.18f1+ | ✅ Hay parche |
| 2019.x | 2019.1.15f1+ | ✅ Hay parche |
| 2017-2018 | N/A | ⚠️ Sin parche oficial, se recomienda actualizar la versión |