نتائج التدقيق الأمني التاريخية - يناير 2025
هذا التقرير تاريخي. استخدمه لفهم ما كان موجوداً وقت التدقيق فقط، ولا تتعامل معه كمرجع نهائي للحالة الأمنية الحالية للمنصة.
ملخص تنفيذي
| المعيار | النتيجة |
|---|---|
| التقييم العام | A- |
| المشاكل الحرجة | 6 ✅ (تم الإصلاح) |
| المشاكل عالية الخطورة | 6 ✅ (تم الإصلاح) |
| المشاكل متوسطة الخطورة | 5 ✅ (تم الإصلاح) |
| حالة الإصلاح | ✅ مكتمل |
الإصلاحات المطبقة (يناير 2025)
| الفئة | الإصلاح | الملف/Migration |
|---|---|---|
| حرج | إصلاح سياسة RLS للركاب المجهولين | 00072_fix_critical_rls.sql |
| حرج | إنشاء برنامج كشف الأسرار | scripts/check-secrets.sh |
| حرج | إصلاح trip_id/driver_id في السائق | sync_service.dart |
| حرج | إصلاح تجاوز XSS | packages/utils/src/sanitize.ts |
| حرج | إصلاح TOCTOU race condition | 00073_atomic_permission_check.sql |
| حرج | حذف debug endpoint | apps/admin/src/app/api/tickets/debug/ |
| عالي | إضافة Redis rate limiting | packages/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 checks | apps/*/api/health/route.ts |
| متوسط | معالجة آمنة للأخطاء | packages/utils/src/error-handler.ts |
| متوسط | إعدادات الجلسات | 00079_session_configuration.sql |
| متوسط | خدمة التدقيق | packages/services/src/audit.service.ts |
نطاق التدقيق
تم تدقيق المكونات التالية:
| المكون | الملفات | النقاط المفحوصة |
|---|---|---|
| بوابة العملاء | 35 endpoint | API، Auth، RLS |
| لوحة الشركات | 57 endpoint | Multi-tenant، Auth |
| لوحة المشرفين | 34 endpoint | RBAC، Admin APIs |
| تطبيق العملاء | 88 ملف Dart | Mobile Security |
| تطبيق السائقين | 25 ملف Dart | GPS، Sync |
| الحزم المشتركة | 8 حزم | Services، Utils |
| البنية التحتية | 71 migration | RLS، DB Security |
| Docker | 26 container | Secrets، 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=alert(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=a
}
التأثير:
- إمكانية حقن 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.tsapps/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 |
| 14 | 30 endpoint بدون rate limiting | Dashboard APIs |
| 15 | خلط company_id بين المستأجرين | Dashboard middleware |
| 16 | GPS Spoofing ممكن | Driver location |
| 17 | QR code replay attacks | Ticket validation |
| 18 | Weak password policy | Company users |
| 19 | Session fixation | All apps |
| 20 | Missing CSRF tokens | Dashboard forms |
| 21 | Insecure cookie flags | All apps |
| 22 | Debug logs in production | Mobile apps |
| 23 | Error messages leak info | API responses |
| 24 | Missing input length limits | All forms |
| 25 | No request timeout | API calls |
المشاكل متوسطة الخطورة (50+)
البنية التحتية
| المشكلة | التأثير |
|---|---|
| Docker socket mounted | Container escape risk |
| No network segmentation | Lateral movement |
| Missing health checks (12 services) | Undetected failures |
| No resource limits | DoS via resource exhaustion |
| GlitchTip exposed externally | Error data leak |
قاعدة البيانات
| المشكلة | التأثير |
|---|---|
| 5 tables without RLS | Data exposure |
| Soft delete allows recovery | Data not truly deleted |
| No audit on passenger table | Compliance issue |
| Missing indexes on foreign keys | Performance |
| No connection pooling limits | DB overload |
التطبيقات
| المشكلة | التأثير |
|---|---|
| ~45% test coverage | Regression risk |
| No E2E tests | Integration bugs |
| Inconsistent error handling | UX issues |
| Missing loading states | Confusing UI |
| No offline queue limits | Memory issues |
التوصيات
الأسبوع 1: المشاكل الحرجة
- ✅ إصلاح RLS policy للركاب
- ✅ إزالة الأسرار المشفرة
- ✅ إصلاح sync service للسائقين
- ✅ استبدال sanitization بـ DOMPurify
- ✅ إضافة atomic permission checking
- ✅ حذف debug endpoint
الأسبوع 2: المشاكل عالية الخطورة
- تفعيل Redis rate limiting
- إضافة certificate pinning
- تشفير Hive storage
- إضافة 2FA للمشرفين
- إصلاح multi-tenant isolation
الأسبوع 3: المشاكل متوسطة الخطورة
- إضافة health checks لجميع الخدمات
- تفعيل network segmentation
- رفع test coverage لـ 80%
- إضافة missing indexes
المراجع
آخر تحديث: يناير 2025