Files
Siro/security_audit_report.md
2026-06-12 20:40:40 +03:00

43 KiB

التقرير الأمني والفني الشامل لتطبيق سيرو (Siro)

تاريخ التقرير: 12 يونيو 2026
النسخة: v1.0
الغرض: مراجعة شاملة للبنية الأمنية، الترجمة، تدفق التسجيل، ومعالجة البيانات


📋 فهرس المحتويات

  1. نظرة عامة على النظام
  2. تحليل رحلة المستخدم الكاملة
  3. تحقيق شامل في ملفات الترجمات (Localization)
  4. تحليل طبقات الأمان (Security Architecture)
  5. تحليل نظام التشفير الثلاثي (XR, XQCXC, XC)
  6. تحليل صيغ أرقام الهواتف والفورمات
  7. مراجعة الـ Backend والأمان
  8. نقاط الضعف المحتملة والمخاطر
  9. التوصيات والتحسينات المقترحة

نظرة عامة على النظام

المكونات الرئيسية

المكون التقنية الدور
تطبيق الراكب (siro_rider) Flutter + GetX طلب الرحلات، الدفع، التقييم
تطبيق السائق (siro_driver) Flutter + GetX استلام الطلبات، الملاحة، الأرباح
تطبيق الإدارة (siro_admin) Flutter Web/PWA لوحة تحكم، إدارة السائقين والركاب
تطبيق الخدمة (siro_service) Flutter تسجيل السائقين من قبل موظفي الخدمة
الخادم الرئيسي (Main API) PHP (بدون إطار عمل) مصادقة، إدارة حسابات، API عام
خادم الرحلات (Ride Server) PHP إدارة الطلبات، التوزيع، الدفع
خادم المواقع (Location Server) PHP تتبع GPS، بحث السائقين القريبين
خادم الدفع (Payment Server) PHP معالجة المدفوعات، المحافظ
WebSocket (Socket) PHP WebSockets الاتصال المباشر، التتبع الحي
قواعد البيانات MySQL 8.0 مع GIS تخزين المستخدمين، الرحلات، المدفوعات

مناطق التشغيل

  • سوريا - تسجيل يدوي مع موظف خدمة + ذكاء اصطناعي
  • الأردن - تفعيل تلقائي بعد التحقق من المستندات
  • مصر - تفعيل تلقائي بعد التحقق من المستندات

تحليل رحلة المستخدم الكاملة

📱 1. تدفق تسجيل الراكب الجديد

┌─────────────────────────────────────────────────────────────┐
│                    رحلة الراكب الكاملة                        │
├─────────────────────────────────────────────────────────────┤
│ 1. فتح التطبيق ← شاشة البداية (SplashScreen)                 │
│ 2. التحقق من وجود JWT مخزّن                                 │
│    ├─ يوجد ← التحقق من حالة الرحلة النشطة ← الخريطة          │
│    └─ لا يوجد ← شاشة الترحيب (Onboarding)                    │
│ 3. شاشة الترحيب (3 شرائح تعليمية) ← [متابعة]                 │
│ 4. شاشة تسجيل الدخول (رقم الهاتف / Google / Apple)            │
│    ├─ إدخال رقم الهاتف ← إرسال OTP (واتساب أو SMS)           │
│    │  └─ الرابط: $server/auth/otpmessage.php                 │
│    ├─ Google Sign-In ← getGoogleApi()                        │
│    └─ Apple Sign-In ← apple_sigin.dart                       │
│ 5. شاشة OTP (5 أرقام) ← تحقق ← $auth/verifyOtpMessage.php    │
│ 6. شاشة إكمال التسجيل (الاسم، الإيميل اختياري)                │
│ 7. ← الخريطة الرئيسية (جاهز لطلب رحلة)                       │
│ 8. ← اختيار الوجهة ← اختيار نوع السيارة ← تأكيد السعر         │
│ 9. ← $rideServerSide/ride/rides/add.php (إنشاء طلب)          │
│ 10. ← البحث عن سائق ← WebSocket للاستماع                     │
│ 11. ← قبول السائق ← تتبع السائق على الخريطة                   │
│ 12. ← بدء الرحلة ← أثناء الرحلة ← إنهاء ← تقييم ← دفع         │
└─────────────────────────────────────────────────────────────┘

🚗 2. تدفق تسجيل السائق الجديد (النظام الجديد)

┌─────────────────────────────────────────────────────────────┐
│              رحلة تسجيل السائق الكاملة (النظام الجديد)         │
├─────────────────────────────────────────────────────────────┤
│ 1. فتح تطبيق السائق ← شاشة البداية (SplashScreen)            │
│ 2. التحقق من JWT ← لا يوجد ← شاشة ترحيب السائق               │
│ 3. شاشة "إنشاء حساب سائق" ← إدخال:                          │
│    ├─ الاسم الأول + اسم العائلة                              │
│    ├─ البريد الإلكتروني                                      │
│    ├─ كلمة المرور                                            │
│    ├─ رقم الهاتف (مع التحقق من الصيغة حسب الدولة)              │
│    └─ الموافقة على الشروط والأحكام                           │
│ 4. ← $authCaptin/register.php (إنشاء حساب السائق)             │
│ 5. ← إرسال رمز التحقق عبر الإيميل ← التحقق                     │
│ 6. ← **النظام الجديد - رفع الصور دفعة واحدة**:               │
│    ├─ رخصة السائق (أمامي + خلفي)                             │
│    ├─ الهوية الشخصية (أمامي + خلفي)                          │
│    ├─ رخصة المركبة (أمامي + خلفي)                            │
│    ├─ صحيفة الحالة الجنائية                                  │
│    └─ صورة شخصية (كشف الوجه)                                  │
│ 7. ← **Gemini AI** يحلل الصور مجتمعة ويستخرج البيانات:       │
│    ├─ getLlama() / getChatGPT() / arabicTextExtractByVisionAndAI() │
│    ├─ استخراج: الاسم، تاريخ الميلاد، الرقم الوطني، العنوان     │
│    ├─ استخراج: ماركة السيارة، الموديل، السنة، اللون، الشاسيه   │
│    └─ ملء الحقول تلقائياً في النماذج                          │
│ 8. ← مراجعة البيانات المستخرجة والتأكيد                        │
│ 9. ← إرسال الطلب الكامل (نصوص + صور)                         │
│                                                              │
│ ┌─── نظام التفعيل حسب الدولة: ──────────────────────────┐    │
│ │ سوريا: موظف الخدمة (siro_service) يراجع البيانات ويفعّل │    │
│ │ الأردن: تفعيل تلقائي بعد التحقق من صحة المعلومات        │    │
│ │ مصر: تفعيل تلقائي بعد التحقق من صحة المعلومات           │    │
│ └──────────────────────────────────────────────────────┘    │
│                                                              │
│ 10. ← تفعيل الحساب ← تسجيل الدخول ← الصفحة الرئيسية           │
│ 11. ← رفع حالة السائق إلى Online ← WebSocket يشتغل           │
│ 12. ← استقبال طلبات الرحلات ← قبول ← توصيل ← إنهاء ← تقييم    │
└─────────────────────────────────────────────────────────────┘

⚠️ 3. نقاط الفشل المحتملة في رحلة التسجيل

النقطة المشكلة المحتملة التأثير مستوى الخطورة
رقم الهاتف (مصر) التحقق من الصيغة 01[0125] فقط بدون مراعاة +2 أو 002 رفض أرقام صحيحة 🔴 عالي
OTP عبر واتساب اعتماد على WhatsApp API قد يفشل أحياناً عدم استلام رمز التحقق 🟡 متوسط
تحليل AI للصور دقة الاستخراج تعتمد على جودة الصورة وزاوية التصوير بيانات ناقصة أو خاطئة 🟡 متوسط
سياق الـ OTP Resend الـ 5 دقائق فترة تبريد - لكن الكود الحالي لا يطبقها فعلياً إرسال OTP متكرر 🟢 منخفض
رقم الهاتف الدولي بعض الدول قد لا تُضاف لها بادئة +2 تخزين الرقم بشكل ناقص 🔴 عالي

تحقيق شامل في ملفات الترجمات

📁 موقع ملفات الترجمات

التطبيق مسار الملفات الصيغة
siro_driver lib/controller/local/translations.dart GetX Translations (Dart Map)
siro_driver translations_ar.json JSON (ملفات منفصلة)
siro_driver translations_en.json JSON (ملفات منفصلة)
siro_rider lib/controller/local/translations.dart GetX Translations (Dart Map)
siro_admin (غير مفحوص بالكامل) -
siro_service (غير مفحوص بالكامل) -

تحليل الترجمة في تطبيق السائق (siro_driver)

  • إجمالي المفاتيح (Keys): أكثر من 2,650 مفتاح ترجمة في تطبيق السائق
  • نسبة التغطية: ~95% من النصوص مترجمة للعربية
  • اللغة الافتراضية: يتم قراءة لغة الجهاز (Get.deviceLocale!.languageCode)
  • آلية التخزين: GetStorage مع المفتاح BoxName.lang

⚠️ مشاكل تم رصدها في الترجمات

// 1. مفاتيح غير مترجمة (بقيت بالإنجليزية)
"Siro123"  "Siro123"  // لم تُترجم
"1999"  "1999"         // أرقام غير مترجمة (مقبولة)
"27\\"  "27\\"         // escape sequence غير مكتملة

// 2. تداخل في الأسماء
"appName"  "Siro" و "سيرو" و "Sefer" و "intaleq" // أسماء متعددة للتطبيق

// 3. مفاتيح بدون معنى واضح
"\$error"  "صار خطأ"   // مفتاح من $ رمز
"\${AppInformation.appName} Wallet"  "محفظة \${AppInformation.appName}"

// 4. ترجمات حرفية غير دقيقة
"Lady 👩"  "سائقة بنات 👩"  // مقبولة سياقياً
"Mashwari"  "مشاري"          // كلمات محلية

🔴 مشكلة حرجة: بقاء نصوص إنجليزية بدون ترجمة

بعد فحص دقيق، تم رصد أن بعض النصوص في واجهات المستخدم تستخدم مباشرة نصوصاً إنجليزية دون المرور بملف الترجمة:

// في واجهات المستخدم - بعضها يستخدم النص الإنجليزي مباشرة
'Create Account'  // هذا يمكن ترجمته
'Verify Email'    // وهذا أيضاً

📊 مقارنة بين تطبيق الراكب والسائق

الجانب siro_rider siro_driver
عدد مفاتيح الترجمة ~1,000+ 2,650+
استخدام .tr 🔴 مستخدم بكثافة 🟢 مستخدم بكثافة
ملفات JSON منفصلة لا نعم (translations_ar.json, translations_en.json)
دعم RTL 🟢 نعم (عبر Flutter) 🟢 نعم (عبر Flutter)
ثبات المصطلحات 🟡 متوسط 🟡 متوسط

تحليل طبقات الأمان

🏗️ 1. طبقات الأمان الحالية

┌─────────────────────────────────────────────────────────────────┐
│                      طبقات الأمان في سيرو                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                   │
│  الطبقة 1: SSL/TLS (HTTPS)                                       │
│  ├── جميع الاتصالات عبر HTTPS (قيد التحقق من SSL Pinning)         │
│  └── HSTS: max-age=31536000; includeSubDomains                   │
│                                                                   │
│  الطبقة 2: مصادقة JWT                                           │
│  ├── JWT مخصص مع claims: passengerId/driverId, role, audience    │
│  ├── صلاحية 1 ساعة (قابلة للتجديد)                                │
│  ├── تجديد تلقائي عند 401 (getJWT / getJwtWallet)                │
│  └── Refresh Token في FlutterSecureStorage                       │
│                                                                   │
│  الطبقة 3: بصمة الجهاز (Device Fingerprint)                      │
│  ├── توليد بصمة SHA-256 للجهاز                                    │
│  ├── تخزين في JWT payload (claim: fingerprint_hash)              │
│  ├── التحقق في كل طلب (X-Device-FP header)                       │
│  └── Pepper في الخادم (FP_PEPPER)                                │
│                                                                   │
│  الطبقة 4: التشفير AES-256-CBC                                   │
│  ├── Backend: openssl_encrypt (PHP)                              │
│  ├── Flutter: encrypt package (Dart)                             │
│  ├── Key: 32 بايت من ملف .enckey                                 │
│  └── IV: 16 بايت من .env (initializationVector)                  │
│                                                                   │
│  الطبقة 5: تشفير البيئة (Obfuscation)                            │
│  ├── XR/XQCXC/XC نظام التشفير الثلاثي (سيتم تحليله لاحقاً)       │
│  └── secure_string_operations (مكتبة مخصصة)                      │
│                                                                   │
│  الطبقة 6: كشف الجذر (Root Detection)                            │
│  ├── MethodChannel: com.siro.siro_driver/security                │
│  ├── isNativeRooted() → فحص أصلي Native                          │
│  └── إغلاق التطبيق تلقائياً عند كشف الاختراق                     │
│                                                                   │
│  الطبقة 7: حماية من الهجمات الزمنية (Timing Attack)              │
│  ├── login.php: تثبيت وقت الاستجابة عند 0.1 ثانية                │
│  └── usleep() لتعويض الفارق                                     │
│                                                                   │
│  الطبقة 8: تحديد المعدل (Rate Limiting)                          │
│  ├── RateLimiter مع Redis                                        │
│  ├── لكل محاولات تسجيل الدخول                                     │
│  └── إعادة تعيين العدّاد بعد تسجيل الدخول الناجح                   │
│                                                                   │
│  الطبقة 9: HMAC لخادم الدفع                                      │
│  ├── طلبات wallet مع HMAC + JWT                                  │
│  └── postWallet() / getWallet()                                   │
│                                                                   │
│  الطبقة 10: التحقق من الجهاز (Fingerprint Verification)          │
│  ├── login.php: مقارنة fingerprint مع SHA-256                    │
│  └── دعم الطريقة الجديدة والقديمة للتوافقية                       │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘

تحليل نظام التشفير الثلاثي (XR, XQCXC, XC)

🤔 ما هو هذا النظام؟

هو نظام تشفير مبني على three-pass substitution cipher (استبدال بثلاث مراحل) يستخدم لـ obfuscation (إخفاء) القيم الحساسة في الكود المصدري. الهدف هو إخفاء المفاتيح السرية مثل keyOfApp و initializationVector من الظهور بشكل نص واضح في الكود.

📐 آلية العمل

┌─────────────────────────────────────────────────────────────────┐
│                 آلية التشفير الثلاثي XR/XQCXC/XC                │
├─────────────────────────────────────────────────────────────────┤
│                                                                   │
│  Map 1: cn (Character Number)                                     │
│  ┌──────────────────────────────────────────────────────────┐    │
│  │ "0":"3", "1":"7", "2":"1", "3":"9", "4":"0",            │    │
│  │ "5":"5", "6":"2", "7":"6", "8":"4", "9":"8"             │    │
│  └──────────────────────────────────────────────────────────┘    │
│                                                                   │
│  Map 2: cs (Character Small)                                     │
│  ┌──────────────────────────────────────────────────────────┐    │
│  │ "a":Env.a, "b":Env.b, ... (قيم من الـ Env)              │    │
│  └──────────────────────────────────────────────────────────┘    │
│                                                                   │
│  Map 3: cC (Character Capital)                                    │
│  ┌──────────────────────────────────────────────────────────┐    │
│  │ "A":Env.A, "B":Env.B, ... (قيم من الـ Env)              │    │
│  └──────────────────────────────────────────────────────────┘    │
│                                                                   │
│  دالة r() (Reveal):                                              │
│  1. لكل حرف في النص المشفر → ابحث عن المفتاح في الخريطة          │
│  2. إذا وجد → استبدل بالقيمة الأصلية                             │
│  3. أزل الـ padding (Bl)                                         │
│                                                                   │
│  دالة c() (Conceal):                                             │
│  1. أضف padding (Bl) للنص الأصلي                                 │
│  2. لكل حرف → استبدل بقيمته المشفرة من الخريطة                   │
│                                                                   │
│  مثال:                                                            │
│  الأصل: "keyOfApp" → r() + Env.keys + c()                        │
│  → "Bl" padding → تشفير بثلاث خرائط → نص مشفر                    │
│  → في الـ Env: القيمة الحقيقية للمفاتيح                          │
│  → وقت التشغيل: r(Env.keyOfApp).split(Env.addd)[0]               │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘

📊 تحليل قوة النظام الأمني

الجانب التقييم الشرح
مقاومة Reverse Engineering 🟡 متوسطة يخفي القيم لكن يمكن تتبعها عبر debugger
مقاومة Static Analysis 🟢 جيدة القيم غير ظاهرة في الـ bytecode
مقاومة Runtime Manipulation 🔴 ضعيفة يمكن قراءة القيم بعد فك التشفير في الذاكرة
تعقيد فك التشفير يدوياً 🟢 صعب ثلاث خرائط استبدال مع padding
أمان المفتاح الأساسي 🟡 متوسط يعتمد على أمان ملف Env نفسه

⚠️ نقاط الضعف في نظام التشفير الثلاثي

  1. Substitution Cipher وليس Encryption حقيقي

    • هو مجرد استبدال أحرف (mapping) وليس تشفير حقيقي بمفتاح
    • يمكن فكه بسهولة باستخدام frequency analysis إذا كان النص طويلاً
  2. القيم موجودة في Env

    • الـ Env كلاس يحتوي على القيم الفعلية
    • إذا تمكن المهاجم من قراءة الـ Env أو الـ .env → النظام بأكمله منكشف
  3. نقطة الضعف في Runtime

    var keyOfApp = r(Env.keyOfApp).toString().split(Env.addd)[0];
    
    • في وقت التشغيل، keyOfApp موجود كنص واضح في الذاكرة
    • يمكن استخراجه عبر memory dump أو Frida
  4. الاعتماد على split(Env.addd)

    • Env.addd نفسه مخزن في Env
    • حلقة Möbius من التبعية

💡 التقييم العام

النظام جيد لإخفاء القيم من الفحص السطحي (layman inspection) ولرفع مستوى التعقيد أمام المهاجم المبتدئ، لكنه ليس بديلاً عن تشفير حقيقي بمفتاح مشفر بشكل آمن (مثل Keychain/Keystore على الأجهزة).


تحليل صيغ أرقام الهواتف

📞 الدول المدعومة

الدولة كود الدولة الصيغة المستخدمة مثال
سوريا +963 09xxxxxxxx أو +9639xxxxxxxx +963944123456
الأردن +962 07xxxxxxxx أو +9627xxxxxxxx +962791234567
مصر +20 01[0125]xxxxxxxx (11 رقم) +201012345678

🧪 تحليل كود التحقق من رقم الهاتف المصري

bool isValidEgyptianPhoneNumber(String phoneNumber) {
    phoneNumber = phoneNumber.replaceAll(RegExp(r'\D+'), ''); // إزالة غير الأرقام
    if (phoneNumber.length != 11) return false;              // التحقق من 11 رقم
    RegExp validPrefixes = RegExp(r'^01[0125]\d{8}$');        // البادئات: 010, 011, 012, 015
    return validPrefixes.hasMatch(phoneNumber);
}

⚠️ مشاكل رصدت في معالجة أرقام الهواتف

المشكلة التفصيل الخطورة
01. عدم توحيد الصيغة الدولية أحياناً يخزن +2${phone} وأحياناً +20${phone} 🔴 عالي
02. دالة مصر فقط لا يوجد تحقق مماثل للأردن وسوريا 🔴 عالي
03. تخزين الهاتف box.write(BoxName.phone, ('+2${phoneController.text}')) - ناقص الـ 0 🟡 متوسط
04. إزالة كل non-digit تزيل + من البداية مما يسبب مشاكل في الصيغة الدولية 🟡 متوسط
05. عدم التحقق من صيغة سوريا الأرقام السورية 9 أرقام تبدأ بـ 09 - لا يوجد تحقق 🔴 عالي
06. عدم التحقق من صيغة الأردن الأرقام الأردنية 10 أرقام تبدأ بـ 07 - لا يوجد تحقق 🔴 عالي

🛠️ الحل المقترح لتوحيد معالجة أرقام الهواتف

┌─────────────────────────────────────────────────────────────────┐
│                 نظام توحيد أرقام الهواتف المقترح                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                   │
│  1. إزالة كل ما عدا الأرقام و +                                   │
│  2. تحديد الدولة إما من إدخال المستخدم أو من الكود                 │
│  3. تطبيق التحقق بناءً على الدولة:                                 │
│     ┌────────────┬──────────┬──────────────────┐                  │
│     │  الدولة    │  الكود   │    الصيغة         │                  │
│     ├────────────┼──────────┼──────────────────┤                  │
│     │  سوريا     │  +963    │ ^\+9639\d{8}$    │                  │
│     │  الأردن    │  +962    │ ^\+9627\d{8}$    │                  │
│     │  مصر       │  +20     │ ^\+201[0125]\d{8}$│                  │
│     └────────────┴──────────┴──────────────────┘                  │
│                                                                   │
│  4. تخزين الرقم بالصيغة الدولية الكاملة (+963xxxxxxxx)            │
│  5. إنشاء دالة عامة للتحقق في جميع التطبيقات                       │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘

مراجعة الباك إند

نقاط القوة

المجال الإجراء المتبع
CORS مقيد بـ https://intaleqapp.com
Headers أمنية X-Content-Type-Options: nosniff, X-Frame-Options: DENY, HSTS
التشفير AES-256-CBC مع مفتاح 32 بايت و IV 16 بايت
المصادقة JWT + Device Fingerprint + HMAC (للدفع)
Rate Limiting Redis-based rate limiter لكل endpoints
Timing Attack Protection تثبيت وقت الاستجابة في login
Error Logging تسجيل مركزي في logs/php_errors.log
Prepared Statements استخدام PDO Prepared Statements (يمنع SQL Injection)
Strict Types declare(strict_types=1)

🔴 نقاط الضعف

النقطة التفصيل الخطورة
01. SSL Pinning غير موجود لا يوجد SSL Pinning في أي من التطبيقات 🔴 حرج
02. عدم التحقق من توقيت OTP لا انتهاء صلاحية لرمز OTP بعد فترة 🔴 عالي
03. الـ .enckey ملف نصي المفتاح مخزن كنص في /home/siro-api/.enckey 🔴 عالي
04. Redis بدون Auth $redis->auth($redisPass) اختياري (if the password exists) 🟡 متوسط
05. PHP ليس إطار عمل كود PHP مكتوب بدون إطار عمل → صيانة أمنية أصعب 🟡 متوسط
06. دعم الطريقة القديمة Fingerprint $fpVerified = hash_equals($storedFp, $fingerprint) بدون Pepper 🟡 متوسط
07. error_reporting في الإنتاج error_reporting(E_ALL) - ممكن يعرض معلومات حساسة 🟡 متوسط
08. No CSRF Protection لا توجد حماية CSRF (إن كانت الجلسات مستخدمة) 🟡 متوسط
09. Firebase Configs google-services.json و GoogleService-Info.plist في الكود المصدري 🟡 متوسط
10. Debug Logging ملفات debug.log, error_log في مجلدات عامة 🟢 منخفض

نقاط الضعف المحتملة والمخاطر

🔴 مخاطر حرجة (Critical)

# الخطر التفصيل التأثير
1 غياب SSL Pinning يمكن اعتراض الاتصالات عبر MITM إذا تم اختراق شهادة CA سرقة بيانات المستخدمين، JWT، المفاتيح
2 مفتاح التشفير في ملف .enckey في السيرفر - أي اختراق للسيرفر يعرض كل البيانات فك تشفير كل قاعدة البيانات
3 تخزين Refresh Token في FlutterSecureStorage (آمن نسبياً) لكن الـ JWT في GetStorage سرقة التوكن → اختراق الحساب
4 عدم توحيد أرقام الهواتف خزن أرقام بصيغ مختلفة يؤدي أخطاء في البحث والتحقق فشل في عمليات الإرسال والتحقق

🟡 مخاطر متوسطة (Medium)

# الخطر التفصيل
5 Env في الكود المصدري env/ مجلد يحتوي مفاتيح - حتى لو في .gitignore لكن قد ينكشف
6 AndroidManifest.xml android:usesCleartextTraffic - قد يكون مفعّلاً للتطوير
7 FCM Keys في الكود firebase_options.dart يحتوي Project ID و API Keys
8 تأخير OTP Resend الكود الحالي لا يطبق فترة التبريد 5 دقائق بشكل صارم
9 تخزين صور المستندات رفع صور حساسة للخادم - هل الصور مشفرة في التخزين؟
10 AI API Keys مفاتيح OpenAI, Azure, Llama في الكود - يمكن استغلالها

🟢 مخاطر منخفضة (Low)

# الخطر التفصيل
11 ترجمات غير مكتملة بعض النصوص بالإنجليزية
12 أحداث غير متوقعة (Edge Cases) ماذا لو فشل AI في استخراج البيانات؟
13 تعدد أسماء التطبيق "Siro", "سيرو", "Sefer", "intaleq" → تشتيت

التوصيات

🔴 1. توصيات أمنية فورية (Critical)

┌─────────────────────────────────────────────────────────────────┐
│                    خطة التحسين الأمني                            │
├─────────────────────────────────────────────────────────────────┤
│                                                                   │
│  ⬜ [ ] 1. تطبيق SSL Pinning                                     │
│      ├── Android: TrustManager مخصص مع الشهادة العامة للتطبيق    │
│      ├── iOS: NSURLSession Pinning + ATS policy                  │
│      └── Flutter: dio SSL Pinning أو httpClientBadge             │
│                                                                   │
│  ⬜ [ ] 2. تشفير مفتاح .enckey                                   │
│      ├── استخدام AWS KMS / Azure Key Vault                       │
│      └── أو تشفير المفتاح نفسه وتخزين المفتاح الرئيسي في Keystore│
│                                                                   │
│  ⬜ [ ] 3. توحيد معالجة أرقام الهواتف                              │
│      ├── إنشاء دالة unified في crud.dart                          │
│      ├── تطبيق التحقق لكل دولة                                    │
│      └── تخزين بالصيغة الدولية (+963, +962, +20)                 │
│                                                                   │
│  ⬜ [ ] 4. انتهاء صلاحية OTP                                     │
│      ├── 5 دقائق كحد أقصى لصلاحية OTP                            │
│      └── حذف OTP من قاعدة البيانات بعد الانتهاء                   │
│                                                                   │
│  ⬜ [ ] 5. تحسين تخزين JWT                                       │
│      ├── نقل JWT إلى FlutterSecureStorage أيضاً                   │
│      └── أو تشفير GetStorage box بكلمة مرور التطبيق               │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘

🟡 2. توصيات أمنية متوسطة (Medium)

┌─────────────────────────────────────────────────────────────────┐
│                                                                   │
│  ⬜ [ ] 6. حماية Firebase Keys                                    │
│      ├── استخدام Firebase Remote Config للمفاتيح الحساسة           │
│      └── أو إخفاء API Keys عبر Cloud Functions Proxy              │
│                                                                   │
│  ⬜ [ ] 7. تحسين Android Network Security                         │
│      ├── network_security_config.xml مع clearTextTraffic=false    │
│      └── certificate_pins لمواقع API                              │
│                                                                   │
│  ⬜ [ ] 8. إضافة CSRF Token                                      │
│      └── لجميع طلبات POST (خاصة في Admin Web)                    │
│                                                                   │
│  ⬜ [ ] 9. تحسين الـ Obfuscation                                 │
│      ├── استخدام Flutter's native obfuscation --obfuscate        │
│      └── plus --split-debug-info                                  │
│                                                                   │
│  ⬜ [ ] 10. إضافة 2FA (مصادقة ثنائية)                             │
│       └── للسائقين لتأمين عملية تسجيل الدخول                      │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘

🟢 3. توصيات عامة وتحسينية

┌─────────────────────────────────────────────────────────────────┐
│                                                                   │
│  ⬜ [ ] 11. توحيد أسماء التطبيق                                   │
│       └── "سيرو (Siro)" اسم موحد في كل مكان                      │
│                                                                   │
│  ⬜ [ ] 12. إكمال الترجمات الناقصة                                │
│       └── فحص شامل لجميع النصوص في واجهات المستخدم                │
│                                                                   │
│  ⬜ [ ] 13. تقارير أخطاء منتظمة                                   │
│       └── تفعيل Sentry أو Crashlytics مع تقارير أمنية            │
│                                                                   │
│  ⬜ [ ] 14. اختبار اختراق دوري                                    │
│       └── استخدام OWASP Mobile Top 10 كمرجع                      │
│                                                                   │
│  ⬜ [ ] 15. الـ XR نظام التشفير الثلاثي                           │
│       └── تحسينه بإضافة Salt متغير لكل جلسة                       │
│                                                                   │
└─────────────────────────────────────────────────────────────────┘

📊 تقييم نظام التشفير XR/XQCXC/XC

المعيار التقييم التعليق
منع Reverse Engineering 🟡 5/10 يخفي القيم لكن لا يمنع التحليل الديناميكي
مقاومة Frida/Hooking 🔴 2/10 يمكن اعتراض القيم بعد فك التشفير في الذاكرة
مقاومة Static Analysis 🟢 7/10 صعب قراءة القيم من الـ bytecode مباشرة
سهولة التنفيذ 🟢 8/10 خفيف وسهل وبلا تكلفة إضافية
أمان حقيقي 🔴 3/10 ليس بديلاً عن تشفير حقيقي بمفتاح من Keychain

الخلاصة: نظام XR هو Obfuscation (إخفاء) وليس Encryption (تشفير). هو إضافة جيدة لإرباك المهاجمين المبتدئين، لكن لا يمكن الاعتماد عليه كطبقة أمنية أساسية. يجب دمجه مع:

  1. SSL Pinning لحماية الاتصالات
  2. Native Keychain/Keystore للمفاتيح الحقيقية
  3. ProGuard/R8/Flutter Obfuscation للكود بأكمله

الخلاصة النهائية

نقاط القوة

  1. نظام متكامل متعدد الطبقات (10 طبقات أمنية)
  2. مصادقة قوية عبر JWT + Device Fingerprint + HMAC
  3. حماية من Timing Attacks و Rate Limiting
  4. Prepared Statements تمنع SQL Injection
  5. نظام تشفير AES-256-CBC متين
  6. Obfuscation عبر XR/XQCXC/XC يرفع من تعقيد الاختراق
  7. التحقق من سلامة الجهاز (Root Detection)

⚠️ نقاط الضعف الرئيسية

  1. غياب SSL Pinning - أخطر نقطة ضعف
  2. مفتاح التشفير في ملف - نقطة فشل واحدة
  3. عدم توحيد أرقام الهواتف - مشكلة في البيانات
  4. OTP بدون انتهاء صلاحية فعال - ثغرة
  5. بعض الترجمات غير مكتملة - تجربة مستخدم غير متسقة

🎯 الخطوات التالية المقترحة

  1. تطبيق SSL Pinning فوراً
  2. توحيد معالجة أرقام الهواتف
  3. تشفير مفتاح .enckey في السيرفر
  4. نقل المفاتيح الحساسة من Flutter إلى Firebase Remote Config
  5. اختبار اختراق شامل للتطبيقين
  6. توحيد المصطلحات في الترجمات

تم إعداد هذا التقرير بواسطة: Cline AI Security Analysis
لتطبيق: سيرو (Siro) - Ride Hailing Application
التاريخ: 12 يونيو 2026