أذونات الملف في لينكس

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

أذونات الملف في لينكس

توفر أذونات الملفات بديلاً آمنًا لملفات SUID التنفيذية، ولكنها قد تبدو مربكة بعض الشيء في البداية.


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

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

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

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

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

بافتراض أنك في الدليل الذي يوجد به الملف الثنائي tracewalk، يمكنك إضافة هذا الإذن مثل هذا:

sudo setcap cap_net_raw=eip tracewalk

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

setcap -v cap_new_raw=eip tracewalk

أو يمكنك سرد كافة الأذونات المعينة لملف قابل للتنفيذ معين:

getcap tracewalk

كمرجع، يمكنك أيضًا إزالة جميع الأذونات من الملف القابل للتنفيذ باستخدام:

setcap -r tracewalk

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

إذن ماذا تعني هذه اللاحقة الغريبة؟ =eip؟ وهذا يتطلب بعض الفهم لطبيعة الأذونات. تحتوي كل عملية على ثلاث مجموعات من الأذونات - فعالة وموروثة ومسموح بها:

  • فعال الأذونات هي تلك التي تحدد ما يمكن أن تفعله العملية بالفعل. على سبيل المثال، لا يمكنه التعامل مع المآخذ الخام إذا CAP_NET_RAW ليس في المجموعة الفعالة.
  • متاح الأذونات هي تلك التي يُسمح للعملية بالحصول عليها إذا طلبتها باستخدام الاستدعاء المناسب. إنها تمنع العملية من القيام بأي شيء فعليًا ما لم تتم كتابته خصيصًا لطلب الإذن المذكور. يسمح هذا بكتابة العمليات لإضافة أذونات مهمة إلى المجموعة الفعالة فقط للفترة التي تكون مطلوبة فيها بالفعل.
  • قابل للتوريث الأذونات هي تلك التي يمكن توريثها في المجموعة التي يمكن الوصول إليها من العملية الفرعية التي تم إنشاؤها. أثناء الجراحة fork() أو clone() يتم دائمًا منح العملية الفرعية نسخة من أذونات العملية الأصلية نظرًا لأنها لا تزال تعمل بنفس الملف القابل للتنفيذ في تلك المرحلة. يتم استخدام المجموعة القابلة للتوريث عندما exec() (أو ما يعادله) يتم استدعاؤه لاستبدال الملف القابل للتنفيذ بآخر. عند هذه النقطة، يتم إخفاء المجموعة المتوفرة للعملية بواسطة المجموعة القابلة للتوريث للحصول على المجموعة التي يمكن الوصول إليها والتي سيتم استخدامها للعملية الجديدة.

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

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

عند تحديد الأذونات عبر setcap ثلاث رسائل e, i и p هي فعالة وقابلة للتوريث ويمكن الوصول إليها مجموعات على التوالي. إذن المواصفات السابقة:

sudo setcap cap_net_raw=eip tracewalk

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

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

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

أولاً، لا تعمل إمكانيات الملف مع الارتباطات الرمزية - يجب عليك تطبيقها على الملف الثنائي نفسه (أي هدف الارتباط الرمزي).

ثانيًا، أنها لا تعمل مع النصوص المترجمة. على سبيل المثال، إذا كان لديك برنامج Python النصي الذي تريد تعيين إذن له، فيجب عليك تعيينه لمترجم Python نفسه. من الواضح أن هذه مشكلة أمنية محتملة لأن جميع البرامج النصية التي يتم تنفيذها باستخدام هذا المترجم ستحصل على الإذن المحدد، على الرغم من أن هذا لا يزال أفضل بكثير من جعله SUID. يبدو أن الحل البديل الأكثر شيوعًا هو كتابة ملف قابل للتنفيذ منفصل في لغة C أو ما يعادله يمكنه إجراء العمليات الضرورية واستدعائه من برنامج نصي. وهذا مشابه للنهج الذي تستخدمه Wireshark والذي يستخدم ثنائي /usr/bin/dumpcap لتنفيذ العمليات المميزة:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

ثالثًا، يتم تعطيل أذونات الملف إذا كنت تستخدم متغير بيئة LD_LIBRARY_PATH لأسباب أمنية واضحة(1). الأمر نفسه ينطبق على LD_PRELOAD، بقدر ما أعرف.

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

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

المصدر: www.habr.com

إضافة تعليق