اختبار اختراق منصة تداول — من واجهة برمجة بلا مصادقة إلى مسؤول مارق
- Home
- المشاريع
نظرة عامة على المشروع
طلب مني عميل في التقنية المالية (سري) اختبار منصة تداول قبل أن تحمل أموالًا حقيقية: واجهة برمجة GraphQL أساسية، وخدمات .NET التي توجّه الأوامر وتطابقها، والوحدات الداخلية التي يعتمدها المشغّلون لاعتماد المستخدمين وتحريك المراكز. أجريته كاختبار اختراق بالصندوق الرمادي على نسخة إنتاج كاملة. ولم تكن النتيجة قائمة مسائل نظافة — بل سلسلة. فقد كانت استعلامات GraphQL المميزة تُجاب دون أي رمز إطلاقًا. ومسار إنشاء الحساب كان يثق بحقل دور يقدّمه العميل، فينتج تسجيل عادي مسؤولًا فعّالًا. وكانت الحسابات المزروعة تتشارك كلمة مرور واحدة عبر البيئات، وكانت مفاتيح التوقيع وبيانات اعتماد قاعدة البيانات مودَعة في المستودع وما تزال مقروءة داخل صور الحاويات المنشورة، وكانت خدمة استقبال الأوامر تعيد بناء أنواع يتأثر بها المهاجم من جسم رسالة. وأُثبتت كل خطوة بلا إتلاف، وصُنّفت وفق CVSS، ووُثّقت بخطوات إعادة إنتاج دقيقة، وأُعيد اختبارها بعد شحن الإصلاحات.
التحديات
- اختبار مسار أوامر بأموال حية دون تنفيذ أي صفقة حقيقية أو تعديلها أو إلغائها إطلاقًا.
- تغطية ثلاث بيئات مختلفة تمامًا في نافذة واحدة — واجهة برمجة GraphQL أساسية، وخدمات أوامر بـ.NET، ووحدات المشغّلين.
- إثبات تصعيد الصلاحيات من البداية إلى النهاية بدل تسجيل ملاحظة نظرية عن الإسناد الجماعي.
- التمييز بين مصادقة غائبة فعلًا وضوابط مفروضة في موضع آخر من سلسلة الطلب.
- منح فريق يعمل تحت موعد تنظيمي ترتيبًا للمعالجة يستطيع تنفيذه فعلًا.
المنهج
- رسم خريطة مخطط GraphQL عبر الاستبطان وحصر كل محلّل يمكن الوصول إليه دون رمز حامل.
- بناء سلسلة التصعيد على نسخة الإنتاج، والتوقف عند الإثبات دون مسّ تدفق الأوامر الحي أبدًا.
- تدقيق سجل git وصور الحاويات المنشورة بحثًا عن مفاتيح وبيانات اعتماد وإعدادات متروكة.
- تصنيف كل نتيجة وفق CVSS، وإرفاق خطوات إعادة الإنتاج، وتجميع الإصلاحات في ثلاث موجات قابلة للنشر.
- إعادة الاختبار بعد المعالجة وتأكيد كسر كل سلسلة كسرًا تامًا، لا مجرد حجبها عند قفزة واحدة.
ما الذي كشفه الاختبار
أُبلغ به العميل بموجب اتفاقية عدم إفصاح. أسماء المنتجات والنقاط الطرفية والتفاصيل المعرّفة محجوبة؛ والأنماط هي ما ينتقل.
- وصول إلى GraphQL بلا مصادقة. كان الاستبطان مفعّلًا في الإنتاج، وكانت المحلّلات المميزة تجيب دون رمز حامل، فتكشف الحسابات والأرصدة وسجل الأوامر لأي شخص يستطيع الوصول إلى النقطة الطرفية.
- تصعيد صلاحيات عبر الإسناد الجماعي. كانت عملية التسجيل تقبل سمة دور يقدّمها العميل، فينشئ طلب تسجيل عادي حساب مسؤول كامل الوظائف.
- بيانات اعتماد مزروعة مشتركة. استخدم كل حساب تجريبي وحساب خدمة مزروع كلمة مرور واحدة، وكانت القيم نفسها موجودة في بيئتي التجهيز والإنتاج.
- أسرار في الشفرة المصدرية وفي المخرجات. كانت مفاتيح توقيع الطلبات وبيانات اعتماد قاعدة البيانات مودَعة في المستودع وظلت مقروءة داخل صور الحاويات المنشورة، فما كان تدوير المستودع وحده ليكفي.
- إلغاء تسلسل غير آمن في استقبال الأوامر. كانت خدمة التوجيه تعيد بناء أنواع يتأثر بها المهاجم من جسم رسالة — وهو مسار مباشر نحو تنفيذ شفرة على مضيف يجلس بجوار محرّك المطابقة.
- بيانات حساسة تُكتب في السجلات. كانت أجسام الطلبات كاملة، بما فيها بيانات الاعتماد وتفاصيل الأوامر، تُكتب في ملفات سجلات يُحتفظ بها شهورًا ويقرؤها أصحاب أدوار لا حاجة عمل لديهم بها.
ما الذي أصلحها
انتقلت المصادقة إلى بوابة واحدة مفروضة بدل إعادة تنفيذها في كل محلّل، وعُطّل الاستبطان خارج بيئة التطوير. وصار إسناد الأدوار من جانب الخادم حصرًا، مع معاملة حمولة التسجيل كمدخلات غير موثوقة. ودُوِّرت كل بيانات اعتماد مزروعة، وأُلغيت المفاتيح المكشوفة وأُعيد إصدارها، وأُعيد بناء صور الحاويات من طبقة نظيفة كي تتوقف القيم القديمة عن الشحن. واستُبدل بمنفذ إلغاء التسلسل قائمة سماح صريحة بالأنواع. وأكدت إعادة الاختبار أن السلسلة لم تعد موجودة عند أي قفزة — واحتفظ الفريق بنمط البوابة في الخدمات التي بناها لاحقًا، وهو ما كان أهم من أي إصلاح منفرد.
النطاق في لمحة
- واجهة برمجة GraphQL الأساسية — المخطط والمحلّلات والتخويل
- خدمات توجيه ومطابقة الأوامر بـ.NET
- وحدات المشغّلين ومسارات الاعتماد
- مستودع الشفرة المصدرية ومخرجات البناء المنشورة
- صندوق رمادي، ونسخة إنتاج، وإثباتات غير متلفة