
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)
┌─────────────────┐
│ 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 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 버전에 대한 보안 패치를 제공하지 않습니다. 이러한 버전은 실제로 취약점이 존재하지만:
따라서 "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 | ⚠️ 공식 패치 없음, 버전 업그레이드 권장 |