سلامة تدفق التحكم

سلامة تدفق التحكم ( CFI ) هو مصطلح عام لتقنيات أمن الكمبيوتر التي تمنع مجموعة واسعة من هجمات البرامج الضارة من إعادة توجيه تدفق التنفيذ ( تدفق التحكم ) للبرنامج.

خلفية

يُجري برنامج الحاسوب عادةً تغييرات على مسار التحكم الخاص به لاتخاذ القرارات واستخدام أجزاء مختلفة من الكود. قد تكون هذه التحويلات مباشرة ، حيث يُكتب عنوان الوجهة في الكود نفسه، أو غير مباشرة ، حيث يكون عنوان الوجهة متغيرًا في الذاكرة أو سجلًا في وحدة المعالجة المركزية. في استدعاء دالة نموذجي ، يُجري البرنامج استدعاءً مباشرًا، لكنه يعود إلى الدالة المستدعِية باستخدام المكدس - وهو ما يُعرف بتحويل الحافة الخلفية غير المباشر . عند استدعاء مؤشر دالة ، كما هو الحال من جدول افتراضي ، نقول إن هناك تحويلًا أماميًا غير مباشر . [ 1 ] [ 2 ]

يسعى المهاجمون إلى حقن شيفرة برمجية في برنامج ما لاستغلال صلاحياته أو استخراج البيانات من ذاكرته. قبل أن يصبح جعل الشيفرة التنفيذية للقراءة فقط أمرًا شائعًا، كان بإمكان المهاجم تغيير الشيفرة بشكل عشوائي أثناء تشغيلها، مستهدفًا عمليات النقل المباشر أو حتى بدون أي عمليات نقل على الإطلاق. بعد انتشار تقنية W^X ، أصبح المهاجمون يرغبون في إعادة توجيه التنفيذ إلى منطقة منفصلة غير محمية تحتوي على الشيفرة المراد تشغيلها، مستغلين عمليات النقل غير المباشر: إذ يمكنهم الكتابة فوق جدول الدوال الافتراضية لهجوم الحافة الأمامية أو تغيير مكدس الاستدعاءات لهجوم الحافة الخلفية ( البرمجة الموجهة نحو العودة ). صُممت تقنية CFI لحماية عمليات النقل غير المباشر من الوصول إلى مواقع غير مقصودة. [ 1 ]

التقنيات

تشمل التقنيات المرتبطة فصل مؤشر الكود (CPS)، وسلامة مؤشر الكود (CPI)، ومؤشرات المكدس ، ومكدسات الظل (SS)، والتحقق من مؤشر جدول الدوال الافتراضية (vtable ). [ 3 ] [ 4 ] [ 5 ] يمكن تصنيف هذه الحمايات إلى حمايات واسعة النطاق أو دقيقة النطاق بناءً على عدد الأهداف المقيدة. على سبيل المثال، يمكن لتطبيق CFI واسع النطاق على الحافة الأمامية أن يقيد مجموعة أهداف الاستدعاء غير المباشر بأي دالة يمكن استدعاؤها بشكل غير مباشر في البرنامج، بينما يقيد التطبيق دقيق النطاق كل موقع استدعاء غير مباشر بالدوال التي لها نفس نوع الدالة المراد استدعاؤها. وبالمثل، بالنسبة لمخطط الحافة الخلفية الذي يحمي عمليات الإرجاع، فإن التطبيق واسع النطاق يسمح للإجراء بالعودة إلى دالة من نفس النوع فقط (والتي قد يكون هناك العديد منها، خاصة بالنسبة للنماذج الأولية الشائعة)، بينما يفرض التطبيق دقيق النطاق مطابقة دقيقة لعمليات الإرجاع (بحيث لا يمكنه العودة إلا إلى الدالة التي استدعته).

التطبيقات

تتوفر تطبيقات مشابهة في Clang ( واجهة LLVM الأمامية) [ 6 ] ، ومجموعة مُترجمات GNU [ 7 ] ، وMicrosoft's Control Flow Guard [ 8 ] [ 9 ] [ 10 ] وReturn Flow Guard [ 11 ] ، وGoogle's Indirect Function-Call Checks [ 12 ] وReuse Attack Protector (RAP) [ 13 ] [ 14 ] .

LLVM/Clang

توفر واجهة Clang الأمامية للغة C/C++ الخاصة بمترجم LLVM عددًا من مخططات "CFI" التي تعمل على مستوى المعالجة الأمامية من خلال التحقق من الأخطاء في الجداول الافتراضية وتحويلات الأنواع. لا تدعم جميع المنصات جميع هذه المخططات، ومعظمها، باستثناء مخططين "kcfi" مخصصين لبرامج النواة منخفضة المستوى، يعتمد على تحسين وقت الربط (LTO) لمعرفة الدوال التي يجب استدعاؤها في الحالات العادية. [ 15 ]

كما يُوفر النظام أيضًا مسارًا منفصلاً لفحص " مكدس الاستدعاءات الظلي " (SCS) الذي يحمي من خلال التحقق من تعديلات مكدس الاستدعاءات، وهو متاح فقط لبنيتي مجموعة تعليمات aarch64 و RISC-V . ونظرًا لاستخدام سجل معالج مشترك ، فإن تطبيق SCS لا يكون ممكنًا إلا على واجهات برمجة تطبيقات ثنائية (ABIs) محددة ، أو إذا تم ضمان عدم تداخل أي برنامج آخر يستخدم مجموعة السجلات (خيط/معالج) مع هذا الاستخدام. [ 16 ]

بدأت جوجل بتوزيع نظام أندرويد مع نواة لينكس المُجمّعة بواسطة Clang مع تفعيل تحسين وقت الربط (LTO) وCFI منذ عام 2018. [ 17 ] على الرغم من توفر SCS لنواة لينكس كخيار، ودعم مكونات نظام أندرويد، يُنصح بتفعيله فقط للمكونات التي يمكن ضمان عدم تحميل أي كود برمجي تابع لجهات خارجية عليها. [ 18 ]

مجلس التعاون الخليجي

قامت مجموعة مُجمِّعات GNU بتطبيق "مكدس استدعاءات ظلي" متوافق مع Clang لبنية aarch64 في الإصدار 12 الصادر عام 2022. [ 19 ] [ 20 ] هذه الميزة مُخصصة بشكل أساسي لبناء نواة لينكس، حيث أن مكتبات مساحة المستخدم في GCC تفتقر إلى الدعم. [ 7 ]

تقنية إنتل لفرض التحكم في التدفق

تكشف تقنية فرض التحكم في تدفق البيانات من إنتل (CET) عن الثغرات الأمنية للتحكم في سلامة التدفق باستخدام مكدس الظل (SS) وتتبع الفروع غير المباشر (IBT). [ 21 ] [ 22 ]

يجب على النواة تخصيص منطقة من الذاكرة لمكدس الظل، بحيث لا يمكن لبرامج مساحة المستخدم الكتابة إليها إلا بتعليمات خاصة. يخزن مكدس الظل نسخة من عنوان العودة لكل استدعاء. عند العودة، يتحقق المعالج مما إذا كان عنوان العودة المخزن في المكدس العادي ومكدس الظل متطابقين. إذا لم تتطابق العناوين، يُصدر المعالج مقاطعة رقم 21 (خطأ حماية تدفق التحكم).

يكشف تتبع الفروع غير المباشرة عن تعليمات القفز (JMP) أو الاستدعاء (CALL) غير المباشرة إلى أهداف غير مصرح بها. ويتم ذلك بإضافة آلة حالة داخلية جديدة في المعالج. يتغير سلوك تعليمات القفز والاستدعاء غير المباشرة بحيث تُبدّل آلة الحالة من حالة الخمول (IDLE) إلى حالة انتظار نهاية الفرع (WAIT_FOR_ENDBRANCH). في حالة انتظار نهاية الفرع، يجب أن تكون التعليمة التالية المراد تنفيذها هي تعليمة نهاية الفرع الجديدة (ENDBR32 في وضع 32 بت أو ENDBR64 في وضع 64 بت)، مما يُعيد آلة الحالة الداخلية من حالة انتظار نهاية الفرع إلى حالة الخمول. وبالتالي، يجب أن يبدأ كل هدف مصرح به لتعليمات القفز أو الاستدعاء غير المباشرة بالتعليمة ENDBRANCH. إذا كان المعالج في حالة انتظار نهاية الفرع (أي أن التعليمة السابقة كانت قفزًا أو استدعاءً غير مباشر)، ولم تكن التعليمة التالية تعليمة نهاية الفرع، فسيُصدر المعالج خطأً في حماية تدفق التحكم (INT #21). في المعالجات التي لا تدعم تتبع الفروع غير المباشر CET، يتم تفسير تعليمات ENDBRANCH على أنها NOPs وليس لها أي تأثير.

حماية تدفق التحكم من مايكروسوفت

تم إصدار ميزة حماية تدفق التحكم (CFG) لأول مرة لنظام التشغيل Windows 8.1 Update 3 (KB3000850) في نوفمبر 2014. ويمكن للمطورين إضافة CFG إلى برامجهم عن طريق إضافة /guard:cfعلامة الرابط قبل ربط البرنامج في Visual Studio 2015 أو الإصدارات الأحدث. [ 23 ]

ابتداءً من تحديث ويندوز 10 للمبدعين (الإصدار 1703)، يتم تجميع نواة ويندوز باستخدام ملف تكوين التحكم (CFG). [ 24 ] تستخدم نواة ويندوز تقنية Hyper-V لمنع التعليمات البرمجية الخبيثة من الكتابة فوق خريطة بتات ملف تكوين التحكم. [ 25 ]

يعمل نظام إدارة تدفق التحكم (CFG) عن طريق إنشاء خريطة بتات لكل عملية ، حيث تشير البتة المُفعّلة إلى أن العنوان وجهة صالحة. قبل تنفيذ كل استدعاء دالة غير مباشر، يتحقق التطبيق مما إذا كان عنوان الوجهة موجودًا في خريطة البتات. إذا لم يكن عنوان الوجهة موجودًا، يتوقف البرنامج. [ 23 ] هذا يجعل من الصعب على المهاجم استغلال ثغرة "استخدام بعد التحرير" عن طريق استبدال محتويات كائن ثم استخدام استدعاء دالة غير مباشر لتنفيذ حمولة ضارة. [ 26 ]

تفاصيل التنفيذ

بالنسبة لجميع استدعاءات الدوال غير المباشرة المحمية، _guard_check_icallيتم استدعاء الدالة التي تقوم بالخطوات التالية: [ 27 ]

  1. قم بتحويل عنوان الهدف إلى إزاحة ورقم بت في خريطة البتات.
    1. تمثل البايتات الثلاثة الأعلى إزاحة البايت في خريطة البتات
    2. إزاحة البت هي قيمة مكونة من 5 بتات. البتات الأربعة الأولى هي البتات من الرابعة إلى الثامنة ذات الترتيب الأدنى في العنوان.
    3. يتم تعيين البت الخامس من إزاحة البت إلى 0 إذا كان عنوان الوجهة محاذيًا لـ 0x10 (آخر أربعة بتات هي 0)، و1 إذا لم يكن كذلك.
  2. افحص قيمة عنوان الهدف في خريطة البتات
    1. إذا كان عنوان الهدف موجودًا في خريطة البتات، فقم بالعودة بدون خطأ.
    2. إذا لم يكن عنوان الهدف موجودًا في خريطة البتات، فقم بإنهاء البرنامج.

تقنيات التجاوز

توجد عدة تقنيات عامة لتجاوز CFG:

  • حدد وجهة التعليمات البرمجية الموجودة في وحدة نمطية غير تابعة لـ CFG تم تحميلها في نفس العملية. [ 26 ] [ 28 ]
  • ابحث عن استدعاء غير مباشر لم يكن محميًا بواسطة CFG (سواءً كان CALL أو JMP). [ 26 ] [ 28 ] [ 29 ]
  • استخدام استدعاء دالة بعدد وسائط مختلف عن العدد المصمم له الاستدعاء، مما يتسبب في عدم محاذاة المكدس، وتنفيذ التعليمات البرمجية بعد انتهاء الدالة (تم إصلاح هذه المشكلة في نظام التشغيل Windows 10). [ 30 ]
  • استخدم استدعاء دالة بنفس عدد الوسائط، ولكن يتم التعامل مع أحد المؤشرات التي تم تمريرها ككائن ويكتب إلى إزاحة قائمة على المؤشر، مما يسمح بالكتابة فوق عنوان الإرجاع. [ 31 ]
  • استبدال استدعاء الدالة المستخدمة بواسطة CFG للتحقق من صحة العنوان (تم تصحيحه في مارس 2015) [ 29 ]
  • قم بتعيين خريطة بت CFG إلى جميع القيم 1، مما يسمح بجميع استدعاءات الوظائف غير المباشرة [ 29 ]
  • استخدم عملية الكتابة المتحكم بها للكتابة فوق عنوان على المكدس (لأن المكدس غير محمي بواسطة CFG) [ 29 ]

مايكروسوفت إكستندد فلو جارد

لم يتم إصدار eXtended Flow Guard (XFG) رسميًا بعد، ولكنه متاح في معاينة Windows Insider وتم عرضه علنًا في مؤتمر Bluehat Shanghai في عام 2019. [ 32 ]

تُوسّع XFG نطاق CFG من خلال التحقق من صحة توقيعات استدعاء الدوال لضمان أن تكون استدعاءات الدوال غير المباشرة مقتصرة على مجموعة فرعية من الدوال التي تحمل نفس التوقيع. يتم تنفيذ التحقق من صحة توقيع استدعاء الدالة بإضافة تعليمات لتخزين قيمة التجزئة للدالة المستهدفة في المسجل r10 مباشرةً قبل الاستدعاء غير المباشر، وتخزين قيمة التجزئة المحسوبة للدالة في الذاكرة مباشرةً قبل رمز عنوان الدالة المستهدفة. عند إجراء الاستدعاء غير المباشر، تقارن دالة التحقق في XFG القيمة الموجودة في r10 بقيمة التجزئة المخزنة للدالة المستهدفة. [ 33 ] [ 34 ]

انظر أيضاً

مراجع

  1. 1 2 باير، ماتياس. "سلامة تدفق التحكم: مقدمة" . nebelwelt.net .
  2. بورو، ناثان؛ كار، سكوت أ.؛ ناش، جوزيف؛ لارسن، بير؛ فرانز، مايكل؛ برونثالر، ستيفان؛ باير، ماتياس (31 يناير 2018). "سلامة تدفق التحكم: الدقة والأمان والأداء" . مجلة ACM Computing Surveys . 50 (1): 1–33 . doi : 10.1145/3054924 .
  3. باير، ماتياس ؛ كوزنيتسوف، فولوديمير. "حول الاختلافات بين خصائص مؤشر أسعار المستهلك (CFI) ومؤشر أسعار المستهلك (CPS) ومؤشر أسعار المستهلك (CPI)" . nebelwelt.net . تاريخ الاسترجاع: 1 يونيو 2016 .
  4. "اكتشاف ثغرة في برنامج أدوبي فلاش يؤدي إلى طريقة جديدة للتخفيف من حدة الهجوم" . دارك ريدينج . 10 نوفمبر 2015. تاريخ الاسترجاع: 1 يونيو 2016 .
  5. إند جيم. "إند جيم ستقدم عرضًا في مؤتمر بلاك هات الولايات المتحدة الأمريكية 2016" . www.prnewswire.com (بيان صحفي) . تاريخ الاطلاع: 1 يونيو 2016 .
  6. "سلامة تدفق التحكم - وثائق Clang 3.9" . clang.llvm.org . تم الاطلاع عليه بتاريخ 1 يونيو 2016 .
  7. 1 2 "دليل GCC - خيارات أدوات البرنامج" . مشروع GCC . تم الاطلاع عليه بتاريخ 19 مارس 2026 .
  8. باولي، دارين. "تحديث برنامج مايكروسوفت لمكافحة البرمجيات الخبيثة، لكن حتى ريدموند تقول إنه لم يعد ضروريًا" . ذا ريجستر . تاريخ الاسترجاع: 1 يونيو 2016 .
  9. ميموسو، مايكل (22 سبتمبر 2015). "تطوير ثغرة تجاوز لحماية الذاكرة وحماية تدفق التحكم من مايكروسوفت" . ثريت بوست | المصدر الأول لأخبار الأمن السيبراني . تاريخ الاسترجاع: 1 يونيو 2016 .
  10. سميث، السيدة (23 سبتمبر 2015). "ديربي كون: الفائز السابق بجائزة بلوهات سيتجاوز حماية تدفق التحكم في ويندوز 10" . عالم الشبكات . مؤرشف من الأصل في 27 سبتمبر 2015. تم الاسترجاع في 1 يونيو 2016 .
  11. "حماية تدفق العودة" . تينسنت . 2 نوفمبر 2016. تم الاسترجاع في 19 يناير 2017 .
  12. تايس، كارولين؛ رودر، توم؛ كولينجبورن، بيتر؛ تشيكواي، ستيفن؛ إرلينجسون، أولفار؛ لوزانو، لويس؛ بايك، جيف (1 يناير 2014). فرض سلامة تدفق التحكم الأمامي في GCC وLLVM . الصفحات 941-955 . ISBN  9781931971157.
  13. ^ الأمن، هيز (4 مايو 2016). "يصمم فريق PaX الحماية من أجل إعادة استخدام Code Reuse Exploits vor" . الأمن (باللغة الألمانية) . تم الاسترجاع 2016/06/01 .
  14. "الأسئلة الشائعة حول RAP" . تم الاطلاع عليه بتاريخ 2016-06-01 .
  15. "سلامة تدفق التحكم - وثائق Clang 23.0.0git" . clang.llvm.org . تم الاطلاع عليه بتاريخ 19 مارس 2026 .
  16. "ShadowCallStack — وثائق Clang 23.0.0git" . clang.llvm.org . تم الاطلاع عليه بتاريخ 19 مارس 2026 .
  17. "تحديث تصحيحات Clang LTO لنواة لينكس - Phoronix" .
  18. "ShadowCallStack" . مشروع مفتوح المصدر لنظام Android .
  19. "سلسلة إصدارات GCC 12 - تحسينات عامة" . مشروع GCC . تم الاطلاع عليه بتاريخ 19 مارس 2026 .
  20. "سلسلة إصدارات GCC 12 - تاريخ الإصدارات" . مشروع GCC . تم الاطلاع عليه بتاريخ 19 مارس 2026 .
  21. "مواصفات تقنية فرض تدفق التحكم" (ملف PDF) . منطقة مطوري إنتل . مؤرشف من الأصل (ملف PDF) بتاريخ 14 أغسطس 2017. تم الاطلاع عليه بتاريخ 5 يناير 2021 .
  22. " RIP ROP: CET Internals in Windows 20H1" . Winsider Seminars & Solutions Inc. 5 يناير 2020. تم الاطلاع عليه بتاريخ 5 يناير 2021 .
  23. 1 2 "حماية تدفق التحكم" . MSDN . تم الاسترجاع في 19-01-2017 .
  24. "تحليل إصدار Shadow Brokers وحلول التخفيف باستخدام أمان Windows 10 القائم على المحاكاة الافتراضية" . Microsoft Technet . 16 يونيو 2017. تاريخ الاسترجاع: 20 يونيو 2017 .
  25. "تجاوز CFG عالميًا من خلال إساءة استخدام قابلية التغيير" (ملف PDF) . مدونة أليكس إيونيسكو . تم الاطلاع عليه بتاريخ 7 يوليو 2017 .
  26. 1 2 3 فالكون، فرانسيسكو (25 مارس 2015). "استغلال الثغرة CVE-2015-0311، الجزء الثاني: تجاوز حماية تدفق التحكم في نظام التشغيل ويندوز 8.1 التحديث 3" . كور سكيورتي . تم الاسترجاع في 19 يناير 2017 .
  27. "حماية تدفق التحكم" (ملف PDF) . تريند مايكرو . تم الاطلاع عليه بتاريخ 19 يناير 2017 .
  28. 1 2 "آلية التحكم في تدفق البيانات الداخلية لنظام التشغيل Windows 10" (ملف PDF) . قوة المجتمع . تم الاطلاع عليه بتاريخ 19 يناير 2017 .
  29. 1 2 3 4 "التحكم في تدفق التجاوز بشكل شامل" (ملف PDF) . بلاك هات . تم الاطلاع عليه بتاريخ 19 يناير 2017 .
  30. "تفصيل مثير للاهتمام حول واقي تدفق التحكم" . بروميوم . تم الاسترجاع في 19 يناير 2017 .
  31. توماس، سام (18 أغسطس 2016). "استغلال الكائنات: تقنيات جديدة لتجاوز إجراءات الحماية في ويندوز" . سلايدشير . تم الاطلاع عليه بتاريخ 19 يناير 2017 .
  32. "تحسين أمان ويندوز" . تم الاطلاع عليه بتاريخ 19-05-2021 .
  33. "واقي التدفق الممتد تحت المجهر" . 18 مايو 2021. تم الاطلاع عليه بتاريخ 19-05-2021 .
  34. "تطوير الثغرات: بين الصخرة ومكان الحماية (التدفق الممتد): دراسة XFG" . 23 أغسطس 2020. تم الاطلاع عليه بتاريخ 19 مايو 2021 .