
Scanner automatizado que detecta a vulnerabilidade de injeção em runtime Unity CVE-2025-59489 em APKs Android, extraindo a versão do Unity e verificando-a em relação às versões corrigidas, com processamento em lote e integração CI/CD.
Ferramenta automatizada de detecção da vulnerabilidade de injeção no Unity Runtime, específica para plataformas de jogos Android.
Resumo em uma frase: Um atacante pode obter controle total do jogo/aplicativo Unity afetado, obtendo todas as permissões desse aplicativo.
Ponto-chave: No Android, um aplicativo malicioso pode sequestrar as permissões já obtidas pelo aplicativo Unity
Ponto-chave: No Windows, se o jogo registrou um manipulador de URI personalizado, clicar em um link especialmente criado pode acionar a vulnerabilidade
Boas notícias: O atacante não consegue ultrapassar os limites de permissão do próprio aplicativo
Más notícias: Muitos jogos exigem muitas permissões (câmera, microfone, armazenamento, localização, etc.), e o atacante pode explorar totalmente essas permissões
Como operador de uma plataforma de jogos Android, as piores consequências:
[Fonte: Aviso oficial de segurança da Unity, análise técnica da GMO Flatt Security]
# Apenas a biblioteca padrão do Python 3.7+ é necessária, sem dependências adicionais
python3 --version # Confirme a versão do Python
# Passo 1: Execute o teste
python test_demo.py
# Passo 2: Detecte um único APK
python unity_vulnerability_checker.py your_game.apk
# Passo 3: Detecção em lote
python unity_vulnerability_checker.py --batch /path/to/apks
# Passo 4: Veja exemplos de uso
python usage_examples.py
from unity_vulnerability_checker import check_unity_vulnerability
# Detecta um único arquivo APK
result = check_unity_vulnerability("your_game.apk")
# Forma 1: Use propriedades convenientes
if result.is_vulnerable:
print(f"⚠️ Aplicativo afetado! ({result.version})")
print(f"Recomendação: {result.recommendation}")
elif result.is_safe:
print(f"✅ Aplicativo seguro")
print(f"Motivo: {result.message}")
else:
print(f"❓ Requer revisão manual")
print(f"Motivo: {result.message}")
# Forma 2: Use o campo status
if result.status == "positive":
print(f"Afetado: {result.version}")
from unity_vulnerability_checker import batch_check
# Escaneia um diretório em lote
results = batch_check("/path/to/apk/folder")
# Filtra aplicativos afetados
vulnerable_apps = [
(name, result)
for name, result in results.items()
if result.is_vulnerable
]
print(f"Encontrados {len(vulnerable_apps)} aplicativos afetados")
for name, result in vulnerable_apps:
print(f" - {name}: {result.version}")
from unity_vulnerability_checker import UnityVulnerabilityChecker
class MyPlatform:
"""Seu sistema de plataforma de jogos"""
def __init__(self):
self.checker = UnityVulnerabilityChecker()
def check_new_upload(self, apk_path: str) -> bool:
"""Verifica um APK recém-enviado, retorna se pode ser publicado"""
result = self.checker.check_apk(apk_path)
if result.is_vulnerable:
# Afetado - recusar publicação
self.notify_developer(
f"Seu aplicativo é afetado pela vulnerabilidade Unity\n"
f"Versão: {result.version}\n"
f"Recomendação: {result.recommendation}"
)
return False
elif result.is_safe:
# Seguro - aprovar publicação
return True
else:
# Indeterminado - revisão manual
self.queue_manual_review(apk_path, result.message)
return False
def notify_developer(self, message: str):
"""Notifica o desenvolvedor (implemente sua lógica de notificação)"""
pass
def queue_manual_review(self, apk_path: str):
"""Adiciona à fila de revisão manual (implemente sua lógica)"""
pass
A ferramenta retorna três tipos de resultados:
Exemplo de saída (formato conciso de linha única):
# Aplicativo afetado
⚠️ Este aplicativo é afetado pela CVE-2025-59489 (Unity 2019.2.6f1)
# Aplicativo seguro (3 casos)
✅ Este aplicativo é seguro - não é um aplicativo Unity
✅ Este aplicativo é seguro - já corrigido com a ferramenta Unity patcher
✅ Este aplicativo é seguro - versão corrigida (2019.4.41f1)
# Indeterminado
❓ Indeterminado - é um aplicativo Unity, mas não foi possível extrair a versão, pode estar empacotado ou ofuscado, recomendamos revisão manual
⚠️ Arquivo grande demais para processar (1500.0MB, limite 1024MB) - altere MAX_APK_SIZE_MB na linha 15 do código para um valor maior
.
├── unity_vulnerability_checker.py # Módulo principal
│ ├─ Classe UnityVulnerabilityChecker - mecanismo principal de detecção de vulnerabilidades
│ ├─ check_unity_vulnerability() - função de detecção simplificada
│ ├─ batch_check() - funcionalidade de detecção em lote
│ └─ lógica completa de análise e determinação de versão
│
├── usage_examples.py # Exemplos de uso
│ ├─ Exemplos de uso básico
│ ├─ Exemplos de detecção em lote
│ ├─ Exemplos de integração com plataforma
│ ├─ Exemplos de resposta automatizada
│ └─ Exemplos de integração com API Flask
│
├── test_demo.py # Demonstração de teste
│ ├─ Testes de análise de número de versão
│ ├─ Testes de extração de versão
│ ├─ Testes de determinação de correção
│ ├─ Simulação de cenários de varredura de APK
│ └─ Testes de benchmark de desempenho
│
├── test_version_detection.py # Testes unitários (33 casos de teste)
│
├── README.md # Documentação completa (inclui guia de início rápido)
│
└── CLAUDE.md # Padrões de desenvolvimento
# Detecção de arquivo único
python unity_vulnerability_checker.py game.apk
# Modo de log detalhado
python unity_vulnerability_checker.py game.apk -v
# Detecção em lote de diretório
python unity_vulnerability_checker.py --batch /path/to/apk/folder
# Detecção em lote (modo detalhado)
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)
# Filtra aplicativos afetados
vulnerable = {name: result for name, result in results.items()
if result.is_vulnerable}
print(f"Encontrados {len(vulnerable)} aplicativos afetados")
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" # Recusar publicação
elif result.is_safe:
return "APPROVE" # Aprovar
else:
return "MANUAL_REVIEW" # Revisão 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)
# Use o método to_dict() para converter diretamente em JSON
response = result.to_dict()
response["filename"] = file.filename
response["vulnerable"] = result.is_vulnerable
return jsonify(response)
┌─────────────────┐
│ Ler arquivo APK │
└────────┬─────────┘
│
▼
┌─────────────────┐
│ É um aplicativo Unity? │──NÃO──> negative
└────────┬─────────┘
│ SIM
▼
┌─────────────────────┐
│ Patch do patcher detectado? │──SIM──> negative
└────────┬─────────────┘
│ NÃO
▼
┌─────────────────┐
│ Extrair versão Unity │──falha──> inconclusive
└────────┬─────────┘
│ sucesso
▼
┌─────────────────┐
│ Versão < 2017.1 ? │──SIM──> negative
└────────┬─────────┘
│ NÃO
▼
┌─────────────────┐
│ Versão corrigida? │──SIM──> negative
└────────┬─────────┘
│ NÃO
▼
positive
Verifica se o APK contém as seguintes características:
lib/*/libunity.so - Biblioteca de runtime do Unityassets/bin/Data/* - Arquivos de recursos do UnityExtrai o número de versão do Unity dos seguintes locais:
Formatos de número de versão suportados:
2019.4.40f1, 2022.3.15f16000.0.23f1, 6000.2.6f22019.4.40, 6000.0.23Baseado nas regras do aviso oficial de segurança da Unity:
Varredura automática antes da publicação do aplicativo, recusando aplicativos afetados
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}
Varredura em lote da biblioteca de aplicativos existente, identificando aplicativos que precisam de atualização
python unity_vulnerability_checker.py --batch /data/published_apps > scan_report.txt
Varredura diária agendada de aplicativos recém-enviados, notificação automática aos desenvolvedores
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:
# Envia notificação com informações detalhadas
for name, result in vulnerable:
send_notification(name, result.version, result.message)
schedule.every().day.at("02:00").do(daily_scan)
Gera relatório de segurança da plataforma, estatísticas de distribuição 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 detalhada
"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)
Integração ao fluxo de integração contínua, verificação de segurança automatizada
#!/bin/bash
# Uso no 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"
Casos que podem ser erroneamente classificados como seguros:
Casos que podem ser erroneamente classificados como afetados:
inconclusive, recomendamos revisão manualPossíveis motivos:
Recomendação: realize revisão manual desses aplicativos
A Unity não forneceu patches de segurança para as versões 2017.1-2018.4. Essas versões realmente possuem a vulnerabilidade, mas como:
Portanto, retorna "inconclusive" em vez de "positive". Recomendações:
Baseado nas regras do aviso oficial da Unity, a precisão para APKs com build padrão é > 95%. APKs ofuscados ou empacotados podem exigir processamento adicional.
A detecção de um único APK geralmente é concluída em 0,5-2 segundos, com suporte a processamento paralelo em lote para maior eficiência. Consulte a seção "Métricas de Desempenho" deste documento para métricas detalhadas.
A versão atual foca em APKs Android. A detecção de arquivos .ipa do iOS requer adaptação adicional.
Modifique o dicionário PATCHED_VERSIONS em unity_vulnerability_checker.py, acompanhando os avisos oficiais da Unity para obter as informações mais recentes.
Ação imediata
Monitoramento contínuo
Notificação ao usuário
Atualizar a versão do Unity
Solução temporária (quando não for possível atualizar)
Verificar a correção
positiveEncontrou problemas?
test_demo.py para verificar se a ferramenta funciona corretamenteusage_examples.py para cenários semelhantesO projeto já está configurado com ferramentas completas de verificação de qualidade de código:
# Instalar dependências
pip install ruff pre-commit
# Instalar pre-commit hooks
pre-commit install
# Executar todas as verificações manualmente
pre-commit run --all-files
As seguintes verificações são executadas automaticamente antes de cada commit:
Ruff Linter - Análise estática de código Python
Ruff Formatter - Formatação de código Python
Verificações gerais de arquivos
Verificação de formato Markdown
ruff.toml - Configuração do Ruff.pre-commit-config.yaml - Configuração dos pre-commit hooksTodo o código deve passar na verificação do ruff antes do commit. Se a verificação falhar, o commit será bloqueado.
# Se o pre-commit falhar, alguns problemas serão corrigidos automaticamente
# Após a correção, é necessário fazer git add novamente e commitar
git add .
git commit -m "sua mensagem"
# Verificar apenas arquivos Python
ruff check *.py
# Corrigir problemas automaticamente
ruff check --fix *.py
# Formatar código
ruff format *.py
major >= 2019 or major >= 6000)Esta ferramenta destina-se exclusivamente a auditorias de segurança e verificações de conformidade.
| Se o jogo tiver esta permissão | O atacante pode |
|---|
| 📸 Câmera | Espionar você |
| 🎤 Microfone | Ouvir você |
| 📍 Localização | Rastrear você |
| 📱 Contatos | Roubar sua agenda |
| 💾 Armazenamento | Ler/excluir seus arquivos |
| 💰 Pagamento | Fazer cobranças no jogo |
| 🔐 Conta | Roubar a conta do jogo |
| Versão Unity | Versão mínima corrigida | Status |
|---|
| 6000.3 | 6000.3.0b4 | ✅ Patch disponível |
| 6000.2 | 6000.2.6f2 | ✅ Patch disponível |
| 6000.0 LTS | 6000.0.58f2 | ✅ Patch disponível |
| 2022.3 | 2022.3.62f2 | ✅ Patch disponível |
| 2021.3 | 2021.3.45f2 | ✅ Patch disponível |
| 2020.x | 2020.1.18f1+ | ✅ Patch disponível |
| 2019.x | 2019.1.15f1+ | ✅ Patch disponível |
| 2017-2018 | N/A | ⚠️ Sem patch oficial, recomendado atualizar a versão |