إنتقل إلى المحتوى الرئيسي

نتائج التدقيق الأمني التاريخية - يناير 2025

warning

هذا التقرير تاريخي. استخدمه لفهم ما كان موجوداً وقت التدقيق فقط، ولا تتعامل معه كمرجع نهائي للحالة الأمنية الحالية للمنصة.

ملخص تنفيذي

المعيارالنتيجة
التقييم العامA-
المشاكل الحرجة6 ✅ (تم الإصلاح)
المشاكل عالية الخطورة6 ✅ (تم الإصلاح)
المشاكل متوسطة الخطورة5 ✅ (تم الإصلاح)
حالة الإصلاح✅ مكتمل

الإصلاحات المطبقة (يناير 2025)

الفئةالإصلاحالملف/Migration
حرجإصلاح سياسة RLS للركاب المجهولين00072_fix_critical_rls.sql
حرجإنشاء برنامج كشف الأسرارscripts/check-secrets.sh
حرجإصلاح trip_id/driver_id في السائقsync_service.dart
حرجإصلاح تجاوز XSSpackages/utils/src/sanitize.ts
حرجإصلاح TOCTOU race condition00073_atomic_permission_check.sql
حرجحذف debug endpointapps/admin/src/app/api/tickets/debug/
عاليإضافة Redis rate limitingpackages/services/src/rate-limit.service.ts
عاليCertificate pinning للموبايلsecure_http_client.dart
عاليتشفير Hive للتخزينhive_encryption_service.dart
عالي2FA للمشرفين00075_add_admin_2fa.sql, packages/auth/src/totp.ts
عاليتحسين عزل المستأجرين00076_improve_tenant_isolation.sql
عاليتسجيل خروج آمن (token blocklist)00077_token_blocklist.sql, token-blocklist.ts
متوسطإضافة indexes للأداء00078_add_performance_indexes.sql
متوسطتحسين health checksapps/*/api/health/route.ts
متوسطمعالجة آمنة للأخطاءpackages/utils/src/error-handler.ts
متوسطإعدادات الجلسات00079_session_configuration.sql
متوسطخدمة التدقيقpackages/services/src/audit.service.ts

نطاق التدقيق

تم تدقيق المكونات التالية:

المكونالملفاتالنقاط المفحوصة
بوابة العملاء35 endpointAPI، Auth، RLS
لوحة الشركات57 endpointMulti-tenant، Auth
لوحة المشرفين34 endpointRBAC، Admin APIs
تطبيق العملاء88 ملف DartMobile Security
تطبيق السائقين25 ملف DartGPS، Sync
الحزم المشتركة8 حزمServices، Utils
البنية التحتية71 migrationRLS، DB Security
Docker26 containerSecrets، Network

المشاكل الحرجة (6)

1. كشف بيانات الركاب المجهولين عبر RLS

الملف: infrastructure/supabase/migrations/00031_fix_rls_recursion.sql الأسطر: 52-53

المشكلة:

-- السياسة الحالية (خطيرة)
CREATE POLICY "Anonymous lookup passengers"
ON passengers FOR SELECT TO anon
USING (true); -- يسمح بقراءة جميع بيانات الركاب!

التأثير:

  • أي مستخدم مجهول يستطيع قراءة جميع بيانات الركاب
  • كشف: الأسماء، أرقام الهواتف، البريد الإلكتروني

الإصلاح المطلوب:

-- تقييد الوصول لعمليات التحقق من الحجز فقط
DROP POLICY IF EXISTS "Anonymous lookup passengers" ON passengers;

CREATE POLICY "Anonymous booking validation only"
ON passengers FOR SELECT TO anon
USING (
id IN (
SELECT passenger_id FROM bookings
WHERE code = current_setting('app.booking_code', true)
)
);

الحالة: ✅ تم الإصلاح - Migration 00072_fix_critical_rls.sql


2. أسرار مشفرة في ملفات Docker

الملفات:

  • docker-compose.yml (الأسطر 41, 111, 137, 163, 289-293)
  • infrastructure/docker/kong.yml (الأسطر 5-10)

المشكلة:

# docker-compose.yml - مثال على النمط الخطر
JWT_SECRET: <hard-coded-secret>
SUPABASE_SERVICE_ROLE_KEY: <hard-coded-service-role-key>

# kong.yml - مفاتيح API مكشوفة
consumers:
- username: admin
keyauth_credentials:
- key: <hard-coded-admin-api-key>

التأثير:

  • أي شخص لديه وصول للمستودع يمكنه انتحال الهوية
  • JWT tokens قابلة للتزوير
  • Service role key تمنح وصولاً كاملاً لقاعدة البيانات

الإصلاح المطلوب:

# استخدام متغيرات البيئة
JWT_SECRET: ${JWT_SECRET:?JWT_SECRET is required}
SUPABASE_SERVICE_ROLE_KEY: ${SUPABASE_SERVICE_ROLE_KEY:?Required}

الحالة: ✅ تم الإصلاح - scripts/check-secrets.sh ينبه للأسرار المكشوفة


3. فقدان trip_id و driver_id في مزامنة السائق

الملف: apps/mobile/driver/lib/core/services/sync_service.dart الأسطر: 304-317

المشكلة:

// عند إضافة موقع للطابور، لا يتم حفظ trip_id و driver_id
await _locationQueue.add({
'latitude': position.latitude,
'longitude': position.longitude,
'timestamp': DateTime.now().toIso8601String(),
// ❌ مفقود: trip_id
// ❌ مفقود: driver_id
});

// عند المزامنة، يحاول إرسال بيانات غير مكتملة
for (final location in pendingLocations) {
await supabase.from('driver_locations').insert({
'trip_id': location['trip_id'], // ❌ null
'driver_id': location['driver_id'], // ❌ null
'latitude': location['latitude'],
'longitude': location['longitude'],
});
}

التأثير:

  • فشل كامل في تتبع GPS أثناء عدم الاتصال
  • فقدان بيانات الموقع لجميع الرحلات
  • السائقين يعتقدون أن الموقع يُسجل لكنه لا يُحفظ

الإصلاح المطلوب:

await _locationQueue.add({
'trip_id': currentTripId,
'driver_id': currentDriverId,
'latitude': position.latitude,
'longitude': position.longitude,
'timestamp': DateTime.now().toIso8601String(),
});

الحالة: ✅ تم الإصلاح


4. تجاوز تنظيف XSS عبر Unicode

الملف: packages/utils/src/sanitize.ts الأسطر: 78-84

المشكلة:

// التنظيف الحالي لا يكتشف:
// - HTML entities: onclick=&#97;lert(1)
// - Unicode escapes: onclick=\u0061lert(1)
// - Double encoding: %253Cscript%253E

function sanitize(input: string): string {
return input
.replace(/<script/gi, "")
.replace(/javascript:/gi, "")
.replace(/on\w+=/gi, ""); // ❌ لا يكتشف onclick=&#97;
}

التأثير:

  • إمكانية حقن JavaScript في واجهة المستخدم
  • سرقة جلسات المستخدمين
  • تنفيذ أوامر ضارة

الإصلاح المطلوب:

import DOMPurify from "dompurify";

export function sanitizeHtml(input: string): string {
return DOMPurify.sanitize(input, {
ALLOWED_TAGS: ["b", "i", "em", "strong", "p", "br"],
ALLOWED_ATTR: [],
});
}

الحالة: ✅ تم الإصلاح


5. سباق TOCTOU في فحص الصلاحيات

الملف: packages/auth/src/check-permission.ts الأسطر: 75-138

المشكلة:

async function checkAndExecute(userId: string, action: string) {
// الخطوة 1: فحص الصلاحية
const hasPermission = await checkPermission(userId, action); // Query 1

// ⚠️ فجوة زمنية - يمكن سحب الصلاحية هنا

if (hasPermission) {
// الخطوة 2: تنفيذ العملية
await executeAction(userId, action); // Query 2
}
}

التأثير:

  • مستخدم محظور يمكنه تنفيذ عمليات إذا سُحبت صلاحيته بين الفحص والتنفيذ
  • انتهاك مبدأ الفصل بين الصلاحيات

الإصلاح المطلوب:

async function checkAndExecute(userId: string, action: string) {
// استخدام transaction مع قفل
await supabase.rpc('execute_with_permission_check', {
p_user_id: userId,
p_action: action,
});
}

-- في قاعدة البيانات
CREATE FUNCTION execute_with_permission_check(
p_user_id UUID,
p_action TEXT
) RETURNS VOID AS $$
BEGIN
-- قفل السطر لمنع التعديل
PERFORM 1 FROM user_permissions
WHERE user_id = p_user_id
FOR UPDATE;

IF NOT has_permission(p_user_id, p_action) THEN
RAISE EXCEPTION 'Permission denied';
END IF;

-- تنفيذ العملية
PERFORM do_action(p_user_id, p_action);
END;
$$ LANGUAGE plpgsql;

الحالة: ✅ تم الإصلاح


6. نقطة تصحيح مكشوفة بدون مصادقة

الملف: apps/admin/src/app/api/tickets/debug/route.ts

المشكلة:

// GET /api/tickets/debug - بدون أي مصادقة!
export async function GET(request: Request) {
const tickets = await getTicketsWithDetails();
return Response.json(tickets); // يكشف جميع التذاكر
}

التأثير:

  • أي شخص يمكنه الوصول لبيانات تذاكر الدعم
  • كشف محادثات خاصة بين العملاء والدعم

الإصلاح المطلوب:

# حذف الملف نهائياً
rm apps/admin/src/app/api/tickets/debug/route.ts

الحالة: ✅ تم الإصلاح


المشاكل عالية الخطورة (25+)

7. Rate Limiting في الذاكرة فقط

الملفات:

  • apps/customer/src/lib/rate-limit.ts
  • apps/dashboard/src/lib/rate-limit.ts

المشكلة: Rate limiting يستخدم Map في الذاكرة، لا يعمل مع load balancing.

التأثير: يمكن تجاوزه بالتبديل بين الخوادم.

الإصلاح: استخدام Redis أو Upstash للـ rate limiting.


8. ثقة في قيمة payment_collected من العميل

الملف: apps/dashboard/src/app/api/office-booking/route.ts الأسطر: 343-348

المشكلة:

const { payment_collected } = await request.json();
// ❌ لا يوجد تحقق من صلاحية تسجيل الدفع
await updateBooking(bookingId, { payment_collected });

الإصلاح: التحقق من دور المستخدم قبل السماح بتغيير حالة الدفع.


9. قبول مبلغ الاسترداد من العميل

الملف: apps/dashboard/src/app/api/bookings/[id]/refund/route.ts الأسطر: 73-80

المشكلة:

const { refund_amount } = await request.json();
// ❌ لا يتم التحقق أن refund_amount <= booking.total_price
await processRefund(bookingId, refund_amount);

الإصلاح: التحقق من أن المبلغ لا يتجاوز سعر الحجز الأصلي.


10. ثغرة إعادة التوجيه المفتوح

الملف: apps/customer/middleware.ts الأسطر: 189-191

المشكلة:

const returnUrl = request.nextUrl.searchParams.get("returnUrl");
// ❌ لا يتم التحقق من أن returnUrl ضمن النطاق المسموح
return NextResponse.redirect(returnUrl);

الإصلاح: التحقق من أن الرابط يبدأ بـ / أو ضمن قائمة نطاقات مسموحة.


11. Hive غير مشفر للبيانات الحساسة

الملف: apps/mobile/customer/lib/main.dart الأسطر: 28-32

المشكلة:

// البيانات الحساسة تُخزن بدون تشفير
await Hive.openBox('user_data');
await Hive.openBox('bookings');
await Hive.openBox('auth_tokens'); // ❌ tokens بدون تشفير!

الإصلاح: استخدام flutter_secure_storage للـ tokens و Hive مع تشفير للبيانات الأخرى.


12. لا يوجد Certificate Pinning

الملف: apps/mobile/customer/lib/data/services/api_service.dart

المشكلة: التطبيق يقبل أي شهادة SSL صالحة.

الإصلاح: إضافة certificate pinning لمنع هجمات MITM.


13-25. مشاكل إضافية عالية الخطورة

#المشكلةالملف
13لا يوجد 2FA للمشرفينAdmin Auth
1430 endpoint بدون rate limitingDashboard APIs
15خلط company_id بين المستأجرينDashboard middleware
16GPS Spoofing ممكنDriver location
17QR code replay attacksTicket validation
18Weak password policyCompany users
19Session fixationAll apps
20Missing CSRF tokensDashboard forms
21Insecure cookie flagsAll apps
22Debug logs in productionMobile apps
23Error messages leak infoAPI responses
24Missing input length limitsAll forms
25No request timeoutAPI calls

المشاكل متوسطة الخطورة (50+)

البنية التحتية

المشكلةالتأثير
Docker socket mountedContainer escape risk
No network segmentationLateral movement
Missing health checks (12 services)Undetected failures
No resource limitsDoS via resource exhaustion
GlitchTip exposed externallyError data leak

قاعدة البيانات

المشكلةالتأثير
5 tables without RLSData exposure
Soft delete allows recoveryData not truly deleted
No audit on passenger tableCompliance issue
Missing indexes on foreign keysPerformance
No connection pooling limitsDB overload

التطبيقات

المشكلةالتأثير
~45% test coverageRegression risk
No E2E testsIntegration bugs
Inconsistent error handlingUX issues
Missing loading statesConfusing UI
No offline queue limitsMemory issues

التوصيات

الأسبوع 1: المشاكل الحرجة

  1. ✅ إصلاح RLS policy للركاب
  2. ✅ إزالة الأسرار المشفرة
  3. ✅ إصلاح sync service للسائقين
  4. ✅ استبدال sanitization بـ DOMPurify
  5. ✅ إضافة atomic permission checking
  6. ✅ حذف debug endpoint

الأسبوع 2: المشاكل عالية الخطورة

  1. تفعيل Redis rate limiting
  2. إضافة certificate pinning
  3. تشفير Hive storage
  4. إضافة 2FA للمشرفين
  5. إصلاح multi-tenant isolation

الأسبوع 3: المشاكل متوسطة الخطورة

  1. إضافة health checks لجميع الخدمات
  2. تفعيل network segmentation
  3. رفع test coverage لـ 80%
  4. إضافة missing indexes

المراجع


آخر تحديث: يناير 2025