
ماسح آلي يكتشف ثغرة حقن وقت تشغيل Unity CVE-2025-59489 في ملفات APK الخاصة بنظام Android من خلال استخراج إصدار Unity والتحقق منه مقابل الإصدارات المُصححة، مع معالجة دفعات وتكامل مع CI/CD.
أداة اكتشاف تلقائي لثغرة حقن Unity Runtime مخصصة لمنصات ألعاب Android.
ملخص في جملة واحدة: يمكن للمهاجم السيطرة الكاملة على لعبة/تطبيق Unity المتأثر، والحصول على جميع صلاحيات هذا التطبيق.
نقطة أساسية: على Android، يمكن للتطبيق الضار اختطاف الصلاحيات التي حصل عليها تطبيق Unity
نقطة أساسية: على Windows، إذا كانت اللعبة مسجلة بمعالج URI مخصص، فإن النقر على رابط مخصص يمكن أن يؤدي إلى تشغيل الثغرة
خبر جيد: لا يمكن للمهاجم تجاوز حدود صلاحيات التطبيق نفسه
خبر سيئ: العديد من الألعاب تطلب صلاحيات واسعة (الكاميرا، الميكروفون، التخزين، الموقع، إلخ)، ويمكن للمهاجم استغلال هذه الصلاحيات بالكامل
كمنصة ألعاب 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: استخدام حقل الحالة
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
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
pre-commit install
# تشغيل جميع الفحوصات يدويًا
pre-commit run --all-files
تُشغَّل الفحوصات التالية تلقائيًا قبل كل عملية إرسال:
Ruff Linter - التحليل الثابت لكود Python
Ruff Formatter - تنسيق كود Python
فحوصات الملفات العامة
فحص تنسيق Markdown
ruff.toml - تكوين Ruff.pre-commit-config.yaml - تكوين خطافات Pre-commitيجب أن يجتاز جميع الكود فحص 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 | ⚠️ لا يوجد تصحيح رسمي، يُنصح بترقية الإصدار |