
Unity 런타임 주입 취약점 CVE-2025-59489를 탐지하는 자동화 스캐너로, Android APK에서 Unity 버전을 추출하여 패치된 버전과 대조하며, 배치 처리 및 CI/CD 통합을 지원합니다.
Android 게임 플랫폼 전용 Unity 런타임 주입 취약점 자동 탐지 도구입니다.
한 줄 요약: 공격자가 영향을 받는 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) - 코드 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)