دورة معهد ماساتشوستس للتكنولوجيا "أمن أنظمة الكمبيوتر". المحاضرة 6: الفرص ، الجزء 2

معهد ماساتشوستس للتكنولوجيا. محاضرة رقم 6.858. "أمن أنظمة الكمبيوتر." نيكولاي زيلدوفيتش ، جيمس ميكنز. 2014 سنة


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

المحاضرة 1: "مقدمة: نماذج التهديد" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 2: "السيطرة على هجمات القراصنة" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 3: "تجاوزات العازلة: المآثر والحماية" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 4: "فصل الامتيازات" الجزء 1 / الجزء 2 / الجزء 3
المحاضرة 5: "من أين تأتي أنظمة الأمن؟" الجزء 1 / الجزء 2
المحاضرة 6: "الفرص" الجزء 1 / الجزء 2 / الجزء 3

الحضور: هل يمكن أن نستنتج أن كل فرصة لها عملية واحدة؟

الأستاذ: أشك في ذلك. يمكن أن يكون لديك العديد من العمليات كما تريد ، لإمكانية واحدة يمكن أن توجد عدة عمليات. ببساطة ، لا تحتاج بالضرورة إلى عملية منفصلة لكل فرصة. نظرًا لوجود عملية fort1 التي يمكنها فتح العديد من الملفات وتمرير العديد من القدرات إلى المكون المميز للقلعة .



سبب اعتقادك أنك بحاجة إلى عملية منفصلة لكل فرصة نتعامل معها تتعلق بهذا التفاعل الغريب بين القدرات والامتيازات الخارجية.

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

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

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

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



الجمهور: لنفترض أن العملية لديها القدرات الممنوحة لها من قبل عملية أخرى ، ولكن اتضح أن لديها بالفعل قدرات كبيرة فيما يتعلق ببعض الأشياء. هل يمكن للعملية مقارنتها للتأكد من أنها تلامس نفس الشيء؟ أم سيستغل الفرص الكبيرة؟

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

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

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

وبهذا المعنى ، فإن القصة تشبه إلى حد كبير OKWS . لذا ، لديك تطبيق كبير ، تقوم بتقسيمه إلى مكونات وتقييد الامتيازات لكل مكون. هذا بالتأكيد منطقي في OKWS . هل هناك مواقف أخرى قد تكون مهتمًا فيها بمشاركة الامتيازات؟ أعتقد أنه في مقالتهم يصفون أمثلة يجب أن أحاول تنفيذها ، على سبيل المثال ، tcpdump والتطبيقات الأخرى التي تحلل بيانات الشبكة. لماذا هم قلقون للغاية بشأن التطبيقات التي تحلل مدخلات الشبكة؟ ماذا يحدث في tcpdump ؟ ما سبب جنون العظمة لديهم؟

الجمهور: يمكن للمهاجم التحكم في ما يتم إرساله وما يسمى لتنفيذ الحزم ، على سبيل المثال.

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

لذلك هذا هو السبب في أنهم قرروا القيام بعمل بروتوكول الشبكة الخاص بهم وأشياء أخرى في وضع الحماية.



مثال آخر على العالم الحقيقي حيث هناك حاجة إلى مشاركة الامتياز هو متصفحك. ربما تريد عزل مكون Flash الإضافي ، أو امتداد Java ، أو أي شيء آخر. لأنها تمثل مجالًا واسعًا للهجمات التي يتم استخدامها بقوة.

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

الجمهور: يمكنك كتابة برنامج وضع الحماية الذي ستستخدم فيه Capsicum .

الأستاذ: حق. كيف ستستخدمها؟ حسنًا ، ستدخل فقط وضع الحماية مع الأمر cap_enter ، ثم تقوم بتشغيل البرنامج. هل تتوقع أن يعمل هذا؟ أعتقد أنه ستكون هناك مشكلة. سيكون مرتبطًا بحقيقة أنه إذا لم يتوقع البرنامج أنه سيتم عزله بواسطة Capsicum ، فقد يحاول فتح المكتبة المشتركة ، ولكنه لن يتمكن من القيام بذلك ، لأنه لن يتمكن من فتح شيء مثل / lib / ... ، لأنه لا مسموح به في وضع القدرة .

لذلك ، يجب استخدام طرق وضع الحماية هذه لتلك الأشياء التي توقع المطور أن يمكن تنفيذها في هذا الوضع. ربما توجد طرق أخرى لوضع الحماية يمكن استخدامها لرمز غير معدل ، ولكن بعد ذلك قد تتغير المتطلبات قليلاً. لذلك ، لا يقلق مبدعو Capsicum من التوافق العكسي. إذا كان علينا فتح الملفات بشكل مختلف ، فسنفتحها بشكل مختلف. ولكن إذا كنت تريد ترك الرمز الحالي ، فأنت بحاجة إلى شيء أكثر ، على سبيل المثال ، جهاز افتراضي كامل حتى تتمكن من تشغيل الرمز فيه. هذا يطرح السؤال - هل يجب أن نستخدم آلات افتراضية لصندوق الرمل Capsicum ؟

الجمهور: في هذه الحالة ، يمكن تجاوز الذاكرة.

الأستاذ: نعم إنه كذلك. ولكن ماذا لو لم نهتم بالذاكرة؟ لذا من المحتمل أن تكون الأجهزة الافتراضية جيدة جدًا ، ولا تستهلك الكثير من الذاكرة. إذن لأي سبب آخر يجب ألا نستخدم VM في الفليفلة ؟

الجمهور: من الصعب التحكم في نشاط الشبكة.

الأستاذ: هذا صحيح! من الصعب التحكم في ما يحدث على الشبكة إما لأنك لا تمنح الجهاز الظاهري الوصول إلى الشبكة ، أو أنك متصل بالشبكة من خلال وضع NAT ، أو باستخدام Preview أو VMWare . ولكن بعد ذلك يمكن لصندوق الرمل الوصول إلى الإنترنت بالكامل. لذلك ، سيكون عليك إدارة الشبكة بمزيد من التفاصيل ، ربما عن طريق وضع قواعد جدار الحماية للجهاز الظاهري ، وما إلى ذلك. هذا ليس جيدًا جدًا.

ولكن ماذا لو كنت لا تهتم بالشبكة؟ لنفترض أن لديك نوعًا ما من الفيديو ، ماذا لو قمت بمعالجة فيديو بسيط أو قمت بتحليل tcpdump . في هذه الحالة ، تقوم ببساطة بتشغيل الجهاز الظاهري ، ويبدأ في تحليل حزم tcpdump الخاصة بك ويعيدك بعد العرض التقديمي الذي يريد tcpdump كتابته إلى المستخدم ، لأنه لا توجد شبكة I / O حقيقية. لذا ، هل هناك أي سبب آخر؟



الجمهور: لأن النفقات العامة للتهيئة لا تزال مرتفعة.

البروفيسور: نعم ، قد يكون هذا هو التكلفة الأولية لبدء تشغيل جهاز افتراضي ، مما يقلل الأداء. لذا هذا صحيح.

الجمهور: حسنًا ، ربما لا تزال تريد الحصول على حقوق لقاعدة البيانات وما شابه ذلك.

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

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

لذا ، لنأخذ tcpdump ونرى لماذا يصعب عزلها باستخدام آلية Unix . إذا كنت تتذكر ، في Capsicum ، فإن الطريقة التي يعمل بها tcpdump هي أنه يفتح بعض المقابس الخاصة ، ثم يقوم بتشغيل منطق التحليل على حزم الشبكة ، وبعد ذلك يتم طباعته على محطات المستخدم. إذن ما هو المطلوب لوضع صندوق حماية tcpdump يعتمد على Unix ؟ هل امتيازاتك محدودة؟ المشكلة في Unix هي أن الطريقة الوحيدة لتغيير الامتيازات حقًا هي تغيير الإدخال في وظيفة القرار ، والتي تقرر ما إذا كان يمكنك حقًا الوصول إلى كائن ما أم لا. والشيء الوحيد الذي يمكنك تغييره حقًا هو امتيازات العملية. هذا يعني أن العملية ستكون قادرة على إرسال UID إلى شخص آخر.

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

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

مشكلة أخرى هي أنه في Unix ، يجب أن يكون لديك امتيازات الجذر لتغيير معرف المستخدم أو الامتيازات أو العملية أو أي شيء آخر ، أو تحويلها إلى شيء آخر. هذا أمر سيئ أيضًا.

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

وبالتالي ، من أجل تنظيم وضع الحماية على Unix ، ربما يجب عليك القيام بكلا الإجراءين: تغيير UID ومراجعة الأذونات لجميع الكائنات بعناية للتأكد من عدم وجود ملفات مفتوحة غير معزولة حساسة للكتابة أو القراءة من قبل مخترق. أعتقد أنه من خلال القيام بذلك ، تحصل على آلية أخرى يمكنك استخدامها. إذا قمت بتقديمه إلى النهاية ، فقد تجد صعوبة في مشاركة الملفات أو مشاركة الأدلة.

الآن دعونا نرى كيف تحاول Capsicum حل هذه المشكلة. هنا ، بمجرد دخولنا في وضع "وضع الحماية" ، لن يتوفر كل شيء إلا من خلال الفرص. لذلك ، إذا لم يكن لديك القدرة ، فلا يمكنك ببساطة الوصول إلى أي كائنات.

هؤلاء الرجال في المقالة يراهنون بشكل كبير على مساحة الاسم العالمية. إذن ما هي مساحة الاسم العالمية هذه ، ولماذا هم قلقون بشأنها؟

نظام الملفات الخاص بهم في حد ذاته هو مثال ساطع لمساحة الاسم العالمية. يمكنك كتابة شرطة مائلة وإدراج أي ملف تريد خلفه. على سبيل المثال ، انتقل إلى شخص ما في الدليل الرئيسي ، على سبيل المثال ، / home / nickolai / ... لماذا هذا سيئ؟ لماذا هم ضد مساحة الاسم العالمية في الفليفلة ؟ ما رأيك؟



الجمهور: إذا كان لديك أذونات خاطئة ، فعند استخدام السلطة ، قد تتعرض لمشكلة.

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

بشكل عام ، كانت فكرتهم هي سرد ​​جميع الكائنات التي تحتوي عليها العملية بدقة. لأنه يمكنك ببساطة سرد جميع الميزات في جدول واصف الملف أو في أي مكان آخر يتم فيه تخزين الميزات لك. وهذا هو الشيء الوحيد الذي يمكن أن تلمسه العملية.

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

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

دعونا نتحقق مما إذا كنا بالفعل بحاجة إلى تغييرات النواة. ماذا لو قمنا بذلك في المكتبة؟ بعد كل شيء ، نقوم بتطبيق Capsicum ، التي لديها بالفعل مكتبة. وكل ما نقوم به هو تغيير كل هذه الميزات ، مثل "فتح ، قراءة ، كتابة" لاستخدام ميزات القدرة بشكل حصري. ثم ستمر جميع العمليات ببعض الميزات ، وابحث عنها في جدول الملفات ، وما إلى ذلك. هل سينجح هذا؟



الجمهور: يمكنك دائمًا إجراء مكالمة نظام syscall .

الأستاذ: نعم. تكمن المشكلة في وجود مجموعة من مكالمات النظام التي تتلقاها النواة ، وحتى إذا قمت بتطبيق مكتبة جيدة ، فإن هذا لن يمنع احتمال أن تقوم عملية سيئة أو مخترقة بإجراء مكالمة نظام مباشرة. لذلك ، يجب عليك تقوية النواة بطريقة أو بأخرى.

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

من ناحية أخرى ، إذا كنا نتحدث عن عملية يمكنها تنفيذ التعليمات البرمجية التعسفية ومحاولة التحايل على آلياتنا بأي طريقة ممكنة ، فيجب أن تكون لدينا حدود قسرية واضحة. ولكن بما أن المكتبة لا تقدم أي إكراه قوي ، فقد تستمر النواة في هذه العملية.

ماذا يفعلون في الواقع من حيث التغييرات في النواة؟ الأول هو استدعاء نظام ، يسمونه cap_enter . وماذا يحدث عند تشغيل cap_enter ؟ ماذا يحدث إذا قمت بتطبيقه في العملية الخاصة بك؟

, , . , , , . cap_enter , open () , openat .

Unix- , , open , openat , , , — : openat (dirfd,“name) . openat «name» , .



, Capability open , , , . . - ? -, ? , – . , ?

: , .

: . , , . , , . , . , , . -, .

, , , , , . , , .. , , , . ?

. ? , Unix PID . , kill (25) PID = 25 . , . Capsicum ? ?

: .

: . -, . , Unix , . , PID , , fork , pdfork , « ». , - .

. , . , - : « «» , , , , ». . , , - .

, , , . , . , , .



. , «-» . , openat , «-». , «-», .

? , «-» ?

: , , . , Capability .

: , .

: , , - …

: .

: - .

: , . «-» ? , openat - b/c/../.. ?

, , ? - , . , , , openat (d, “b/c/../..) «c» , - .



. , , , . «-», . , , . , , . , UID - ?

: , .

: , . , , «» UID ? : cap_enter UID . , . ? ?

: , UID , , , , , - .

: , . «» UID . , , UID . , , , . UID .

54:14

:

دورة معهد ماساتشوستس للتكنولوجيا "أمن أنظمة الكمبيوتر". 6: «», 3


.

, . ? ? , 30% entry-level , : VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps $20 ? ( RAID1 RAID10, 24 40GB DDR4).

Dell R730xd 2 ? 2 Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 $249 ! . c Dell R730xd 5-2650 v4 9000 ?

Source: https://habr.com/ru/post/ar418219/


All Articles