مرحبا بالجميع. ننضم بنشاط إلى العمل ، وفي يناير نستعد للعديد من الإصدارات القوية. من بين أشياء أخرى ، تم الإعلان عن مجموعة لدفق جديد من دورة 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 يناير.