أذونات ملفات Linux

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




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

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

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

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

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

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

على افتراض أنك في الدليل حيث يوجد tracewalk binary ، يمكنك إضافة هذا الإذن على النحو التالي:

 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 إلى مجموعات فعالة setcap ويمكن الوصول إليها ، على التوالي. لذلك ، مواصفات سابقة:

 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 البيئة LD_LIBRARY_PATH لأسباب أمنية واضحة (1) . الأمر نفسه ينطبق على LD_PRELOAD ، حسب علمي.

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


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

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


All Articles