# التقرير الأمني والفني الشامل لتطبيق سيرو (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` ### ⚠️ **مشاكل تم رصدها في الترجمات** ```dart // 1. مفاتيح غير مترجمة (بقيت بالإنجليزية) "Siro123" → "Siro123" // لم تُترجم "1999" → "1999" // أرقام غير مترجمة (مقبولة) "27\\" → "27\\" // escape sequence غير مكتملة // 2. تداخل في الأسماء "appName" → "Siro" و "سيرو" و "Sefer" و "intaleq" // أسماء متعددة للتطبيق // 3. مفاتيح بدون معنى واضح "\$error" → "صار خطأ" // مفتاح من $ رمز "\${AppInformation.appName} Wallet" → "محفظة \${AppInformation.appName}" // 4. ترجمات حرفية غير دقيقة "Lady 👩" → "سائقة بنات 👩" // مقبولة سياقياً "Mashwari" → "مشاري" // كلمات محلية ``` ### 🔴 **مشكلة حرجة: بقاء نصوص إنجليزية بدون ترجمة** بعد فحص دقيق، تم رصد أن بعض النصوص في واجهات المستخدم تستخدم مباشرة نصوصاً إنجليزية دون المرور بملف الترجمة: ```dart // في واجهات المستخدم - بعضها يستخدم النص الإنجليزي مباشرة '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** ```dart 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` | ### 🧪 **تحليل كود التحقق من رقم الهاتف المصري** ```dart 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**