mimmable () لـ OpenBSD

توفر أنظمة الذاكرة الظاهرية مرونة كبيرة في كيفية تعيين الذاكرة وحمايتها. لسوء الحظ ، يمكن أن تكون مرونة إدارة الذاكرة مفيدة أيضًا للمهاجمين العازمين على اختراق النظام. في عالم OpenBSD ، تمت إضافة استدعاء نظام جديد لتقليل هذه المرونة ؛ ومع ذلك ، فهو عبارة عن مكالمة نظام لا يُفترض أن يستخدمها أي رمز تقريبًا.

اقترح مؤسس OpenBSD Theo de Raadt لأول مرة استدعاء نظام جديد ، يسمى mimmutable () ، في أوائل سبتمبر. بعد العديد من المراجعات ، يبدو أن استدعاء النظام قد تم دمجه على النحو التالي: int mimmable (void * addr، size_t len) ؛

ستؤدي الدعوة إلى mimmutable () إلى جعل تعيين وحدات بايت للذاكرة بدءًا من addr غير قابل للتغيير ، مما يعني أن النواة لن تسمح بأي تغييرات في حماية الذاكرة أو التعيين في هذا النطاق. لذلك ، ستفشل مكالمات النظام مثل mmap () أو mprotect () التي تؤثر على هذا النطاق بدلاً من ذلك.

للوهلة الأولى ، يتشابه mimmutable () في روحه مع تعهد OpenBSD () ، والذي يقيد استدعاءات النظام التي يمكن أن تستخدمها عملية الاستدعاء. ولكن ، بينما تظهر استدعاءات التعهد () في العديد من البرامج في مستودع OpenBSD ، فإن استدعاءات mimmutable () ستكون نادرة بالفعل. لا يمتلك معظم المطورين فهمًا تفصيليًا لتخطيط الذاكرة لبرامجهم وليسوا في وضع جيد لجعل أجزاء من مساحة عناوينهم غير قابلة للتغيير ، لكن النواة والرابط قصة أخرى.

تم وصف تفاصيل استخدام () mimmutable بالتفصيل في هذه الرسالة الإلكترونية من De Raadt. في شكل مبسط ، يبدأ عندما تقوم النواة بتحميل صورة قابلة للتنفيذ جديدة ؛ بمجرد تعيين مناطق النص والمكدس والبيانات ، ستصبح غير قابلة للتغيير قبل أن يبدأ تشغيل البرنامج. بالنسبة للثنائيات الثابتة ، سيقوم وقت تشغيل C بإجراء بعض الإصلاحات ثم استخدام mimmutable () لجعل معظم مساحة العنوان المعينة غير قابلة للتغيير أيضًا. بالنسبة للثنائيات المرتبطة ديناميكيًا ، يقوم رابط المكتبة المشتركة (ld.so) بتنفيذ مجموعة مماثلة من المهام ، حيث يقوم بتعيين كل مكتبة في مساحة العنوان ثم جعل معظم هذه التعيينات ثابتة.

سيحدث كل هذا تلقائيًا ، دون أي وعي من جانب البرنامج الذي يتم تحميله. ستكون النتيجة النهائية عملية لا يمكنها إجراء تغييرات على كل مساحة العنوان المعينة تقريبًا (على الرغم من أنه لا يزال بإمكانها إنشاء تعيينات جديدة في أجزاء من مساحة العنوان التي لم يتم تعيينها بعد). هناك استثناء واحد صغير:

لذلك فإن هذا الملف الثابت القابل للتنفيذ غير قابل للتغيير تمامًا ، باستثناء منطقة OPENBSD_MUTABLE. يتم استخدام هذا التعليق التوضيحي الآن فقط في مكان واحد ، في عمق كود libc malloc (3) ، حيث يقوم جزء من الكود بتبديل بنية البيانات بين القراءة فقط والقراءة والكتابة كإجراء أمني. لا يصبح غير قابل للتغيير.

إن جعل هذا النظام بأكمله يعمل يتطلب تغييرات تتجاوز نواة OpenBSD ؛ سلسلة أدوات المترجم ، على وجه الخصوص ، بحاجة إلى تحسينات لتمييز الأقسام التي يجب أن تظل قابلة للتحرير عند تحميل البرنامج. من الواضح أن هناك برامج تحتاج إلى تعديل لتبديل العمل بشكل جيد في هذه البيئة ؛ نظرًا لأن OpenBSD يدير النواة ومساحة المستخدمين معًا ، فإنه قادر على إجراء التغييرات التي لا يستطيع Linux عادةً القيام بها ، خوفًا من التسبب في تراجع مساحة المستخدمين.

ومع ذلك ، فإن تنفيذ () mimmutable يتطلب قدرًا معقولاً من العمل الشاق ؛ قد يفترض المرء أن مطوري OpenBSD يتوقعون رؤية فائدة مقابلة. مكان واحد واضح هو الذاكرة القابلة للتنفيذ. لقد ذهب OpenBSD بعيدًا عن طريقه لمنع الذاكرة من أن تكون قابلة للكتابة والتنفيذ في وقت واحد ، لكن الحماية التي تأتي مع هذا التقييد تختفي إذا تمكن المهاجم بطريقة ما من تحميل تعليمات برمجية ضارة في منطقة قابلة للكتابة ، ثم غيّر الأذونات بعد ذلك. سيؤدي تثبيت الحماية لمناطق بيانات العملية إلى جعل هذا النوع من الهجوم مستحيلًا.

علاوة على ذلك ، يستخدم OpenBSD عددًا قليلاً من وسائل حماية الذاكرة غير الموجودة في Linux. يحق لإحدى علامات الذاكرة القابلة للتنفيذ استدعاء النواة ؛ على أنظمة OpenBSD ، فقط مكتبة C لديها هذه الإمكانية. سيمنع هذا رمزًا معادًا تم تحميله في مكان آخر من إجراء مكالمات نظام مباشرة ؛ ستمنع حماية بقية العملية باستخدام () mimmutable تغيير الحماية للسماح باستدعاءات النظام من أي مكان آخر (يمكن إجراء مثل هذه التغييرات باستخدام msyscall () على OpenBSD).

يحتوي OpenBSD أيضًا على محدد خاص لمناطق الذاكرة المخصصة لتجميع الحزم. في كل مرة تدخل فيها عملية إلى النواة ، يتم فحص مؤشر المكدس الخاص بها لمعرفة ما إذا كانت تشير بالفعل إلى منطقة مكدس ؛ خلاف ذلك ، يتم قتل العملية. هذا الفحص يحبط هجمات "المكدس المحوري" ، ...

mimmable () لـ OpenBSD
توفر أنظمة الذاكرة الظاهرية مرونة كبيرة في كيفية تعيين الذاكرة وحمايتها. لسوء الحظ ، يمكن أن تكون مرونة إدارة الذاكرة مفيدة أيضًا للمهاجمين العازمين على اختراق النظام. في عالم OpenBSD ، تمت إضافة استدعاء نظام جديد لتقليل هذه المرونة ؛ ومع ذلك ، فهو عبارة عن مكالمة نظام لا يُفترض أن يستخدمها أي رمز تقريبًا.

اقترح مؤسس OpenBSD Theo de Raadt لأول مرة استدعاء نظام جديد ، يسمى mimmutable () ، في أوائل سبتمبر. بعد العديد من المراجعات ، يبدو أن استدعاء النظام قد تم دمجه على النحو التالي: int mimmable (void * addr، size_t len) ؛

ستؤدي الدعوة إلى mimmutable () إلى جعل تعيين وحدات بايت للذاكرة بدءًا من addr غير قابل للتغيير ، مما يعني أن النواة لن تسمح بأي تغييرات في حماية الذاكرة أو التعيين في هذا النطاق. لذلك ، ستفشل مكالمات النظام مثل mmap () أو mprotect () التي تؤثر على هذا النطاق بدلاً من ذلك.

للوهلة الأولى ، يتشابه mimmutable () في روحه مع تعهد OpenBSD () ، والذي يقيد استدعاءات النظام التي يمكن أن تستخدمها عملية الاستدعاء. ولكن ، بينما تظهر استدعاءات التعهد () في العديد من البرامج في مستودع OpenBSD ، فإن استدعاءات mimmutable () ستكون نادرة بالفعل. لا يمتلك معظم المطورين فهمًا تفصيليًا لتخطيط الذاكرة لبرامجهم وليسوا في وضع جيد لجعل أجزاء من مساحة عناوينهم غير قابلة للتغيير ، لكن النواة والرابط قصة أخرى.

تم وصف تفاصيل استخدام () mimmutable بالتفصيل في هذه الرسالة الإلكترونية من De Raadt. في شكل مبسط ، يبدأ عندما تقوم النواة بتحميل صورة قابلة للتنفيذ جديدة ؛ بمجرد تعيين مناطق النص والمكدس والبيانات ، ستصبح غير قابلة للتغيير قبل أن يبدأ تشغيل البرنامج. بالنسبة للثنائيات الثابتة ، سيقوم وقت تشغيل C بإجراء بعض الإصلاحات ثم استخدام mimmutable () لجعل معظم مساحة العنوان المعينة غير قابلة للتغيير أيضًا. بالنسبة للثنائيات المرتبطة ديناميكيًا ، يقوم رابط المكتبة المشتركة (ld.so) بتنفيذ مجموعة مماثلة من المهام ، حيث يقوم بتعيين كل مكتبة في مساحة العنوان ثم جعل معظم هذه التعيينات ثابتة.

سيحدث كل هذا تلقائيًا ، دون أي وعي من جانب البرنامج الذي يتم تحميله. ستكون النتيجة النهائية عملية لا يمكنها إجراء تغييرات على كل مساحة العنوان المعينة تقريبًا (على الرغم من أنه لا يزال بإمكانها إنشاء تعيينات جديدة في أجزاء من مساحة العنوان التي لم يتم تعيينها بعد). هناك استثناء واحد صغير:

لذلك فإن هذا الملف الثابت القابل للتنفيذ غير قابل للتغيير تمامًا ، باستثناء منطقة OPENBSD_MUTABLE. يتم استخدام هذا التعليق التوضيحي الآن فقط في مكان واحد ، في عمق كود libc malloc (3) ، حيث يقوم جزء من الكود بتبديل بنية البيانات بين القراءة فقط والقراءة والكتابة كإجراء أمني. لا يصبح غير قابل للتغيير.

إن جعل هذا النظام بأكمله يعمل يتطلب تغييرات تتجاوز نواة OpenBSD ؛ سلسلة أدوات المترجم ، على وجه الخصوص ، بحاجة إلى تحسينات لتمييز الأقسام التي يجب أن تظل قابلة للتحرير عند تحميل البرنامج. من الواضح أن هناك برامج تحتاج إلى تعديل لتبديل العمل بشكل جيد في هذه البيئة ؛ نظرًا لأن OpenBSD يدير النواة ومساحة المستخدمين معًا ، فإنه قادر على إجراء التغييرات التي لا يستطيع Linux عادةً القيام بها ، خوفًا من التسبب في تراجع مساحة المستخدمين.

ومع ذلك ، فإن تنفيذ () mimmutable يتطلب قدرًا معقولاً من العمل الشاق ؛ قد يفترض المرء أن مطوري OpenBSD يتوقعون رؤية فائدة مقابلة. مكان واحد واضح هو الذاكرة القابلة للتنفيذ. لقد ذهب OpenBSD بعيدًا عن طريقه لمنع الذاكرة من أن تكون قابلة للكتابة والتنفيذ في وقت واحد ، لكن الحماية التي تأتي مع هذا التقييد تختفي إذا تمكن المهاجم بطريقة ما من تحميل تعليمات برمجية ضارة في منطقة قابلة للكتابة ، ثم غيّر الأذونات بعد ذلك. سيؤدي تثبيت الحماية لمناطق بيانات العملية إلى جعل هذا النوع من الهجوم مستحيلًا.

علاوة على ذلك ، يستخدم OpenBSD عددًا قليلاً من وسائل حماية الذاكرة غير الموجودة في Linux. يحق لإحدى علامات الذاكرة القابلة للتنفيذ استدعاء النواة ؛ على أنظمة OpenBSD ، فقط مكتبة C لديها هذه الإمكانية. سيمنع هذا رمزًا معادًا تم تحميله في مكان آخر من إجراء مكالمات نظام مباشرة ؛ ستمنع حماية بقية العملية باستخدام () mimmutable تغيير الحماية للسماح باستدعاءات النظام من أي مكان آخر (يمكن إجراء مثل هذه التغييرات باستخدام msyscall () على OpenBSD).

يحتوي OpenBSD أيضًا على محدد خاص لمناطق الذاكرة المخصصة لتجميع الحزم. في كل مرة تدخل فيها عملية إلى النواة ، يتم فحص مؤشر المكدس الخاص بها لمعرفة ما إذا كانت تشير بالفعل إلى منطقة مكدس ؛ خلاف ذلك ، يتم قتل العملية. هذا الفحص يحبط هجمات "المكدس المحوري" ، ...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow