rpath
في علوم الحاسوب ،يُحدد rpath مسار البحث أثناء التشغيل المُضمن في ملف تنفيذي أو مكتبة . تستخدم مُحملات الربط الديناميكي rpath للعثور على المكتبات المطلوبة.
على وجه التحديد، يقوم هذا الإجراء بتشفير مسار المكتبات المشتركة في رأس ملف تنفيذي (أو مكتبة مشتركة أخرى). قد تتجاوز قيمة رأس RPATH هذه (المسماة بهذا الاسم وفقًا لمعايير رأس تنسيق الملفات التنفيذية والربطية ) مسارات البحث الافتراضية للربط الديناميكي للنظام أو تُكملها.
يُعدّ مسار البحث (rpath) لملف تنفيذي أو مكتبة مشتركة إدخالًا اختياريًا في .dynamicقسم ملفات ELFDT_RPATH الخاصة بالملفات التنفيذية أو المكتبات المشتركة، ويُسمى هذا النوع DT_RPATHبالخاصية rpath. يمكن تخزينه هناك أثناء عملية الربط بواسطة الرابط. كما يمكن لأدوات مثل chrpathrpath و rpath patchelfإنشاء هذا الإدخال أو تعديله لاحقًا.
خلفية
تستخدم البرامج التنفيذية الحديثة مكتبات ديناميكية ، وهي عبارة عن ملفات قابلة للتحميل بشكل منفصل، للحد من تكرار التعليمات البرمجية. عند تشغيل أحد هذه البرامج، يقوم الرابط الديناميكيld.so بفحص مدخلات المكتبة الديناميكية وتحميلها لاستخدامها من قبل البرنامج التنفيذي. ولأن المكتبات قد تتواجد في مواقع متعددة، يتضمن تنسيق ELF مدخلاً DT_RPATHلتحديد ld.soمكان وجودها.
تُطبّق الروابط الديناميكية المختلفة لملفات ELF استخدام السمة DT_RPATHبطرقٍ مختلفة. ويكمن الاختلاف الرئيسي في:
- معالجة الإدخال الجديد
DT_RUNPATH، وهو إصدار أكثر تقييدًا من rpath. - ما إذا كانت المسارات النسبية متاحة عبر
$ORIGIN. - ما إذا كانت هناك متغيرات أخرى متاحة مثل
$PLATFORM.$LIB
GNU ld.so
يقوم الرابط الديناميكي لمكتبة GNU C بالبحث عن المكتبات المشتركة في المواقع التالية بالترتيب: [ 1 ]
- المسارات (المفصولة بنقطتين رأسيتين) في
DT_RPATHسمة القسم الديناميكي للملف الثنائي إذا كانت موجودة والسمةDT_RUNPATHغير موجودة. - يمكن تجاوز المسارات (المفصولة بنقطتين رأسيتين) في متغير البيئة
LD_LIBRARY_PATH، إلا إذا كان الملف التنفيذيsetuid/setgidثنائيًا، وفي هذه الحالة يتم تجاهلها.LD_LIBRARY_PATHعن طريق استدعاء الرابط الديناميكي مع الخيار--library-path(على سبيل المثال/lib/ld-linux.so.2 --library-path $HOME/mylibs myprogram). - المسارات (المفصولة بنقطتين رأسيتين) في
DT_RUNPATHسمة القسم الديناميكي للملف الثنائي إن وجدت. - يتم البحث بناءً على
ldconfigملف التخزين المؤقت (الموجود عادةً في/etc/ld.so.cache) والذي يحتوي على قائمة مُجمّعة من المكتبات المرشحة التي تم العثور عليها مسبقًا في مسار المكتبة المُوسّع (المُحدد بواسطة/etc/ld.so.conf). مع ذلك، إذا تم ربط الملف الثنائي باستخدام-z nodefaultlibخيار الرابط، فسيتم تخطي المكتبات الموجودة في مسارات المكتبة الافتراضية. - في المسار الافتراضي الموثوق
/lib، ثم/usr/lib. إذا تم ربط الملف الثنائي باستخدام-z nodefaultlibخيار الرابط، فسيتم تخطي هذه الخطوة.
سيؤدي عدم العثور على المكتبة المشتركة في جميع هذه المواقع إلى ظهور خطأ "لا يمكن فتح ملف الكائن المشترك : لا يوجد مثل هذا الملف أو الدليل".
ملحوظات:
readelf -d <binary_name> | grep 'R.*PATH'يعرض مسار RPATH أو RUNPATH لملف ثنائي . في gcc ، على سبيل المثال، يمكن تحديد RPATH بواسطة-Wl,-rpath,/custom/rpath/.- يُوجّه خيار
--inhibit-rpath LISTالرابط الديناميكي إلى تجاهلDT_RPATHسماتDT_RUNPATHأسماء الكائنات في القائمة. لتحديد برنامج رئيسي في القائمة، أدخل سلسلة نصية فارغة. - يتم تحميل المكتبات المحددة بواسطة متغير البيئة
LD_PRELOAD، ثم تلك المدرجة في القائمة،/etc/ld.so.preloadقبل بدء البحث. وبالتالي، يمكن استخدام التحميل المسبق لاستبدال بعض (أو كل) الوظائف العادية للمكتبة المطلوبة، أو يمكن استخدامه ببساطة لتوفير مكتبة لم يكن من الممكن العثور عليها لولا ذلك. - يتم البحث عن المكتبات الثابتة وربطها بملف ELF في وقت الربط، ولا يتم البحث عنها في وقت التشغيل.
يدعم الرمز المميز rpath المسارات النسبية $ORIGIN، حيث يتوسع هذا الرمز إلى دليل الملف التنفيذي أثناء التشغيل. على سبيل المثال، -Wl,-rpath,$ORIGINسيضيف الرمز rpath الدليل الذي يوجد فيه الملف التنفيذي إلى rpath. يتيح ذلك إنشاء ملفات تنفيذية يمكن نقلها بحرية بين مجلدات مختلفة.
دور جنو
يُنفذ برنامج GNU Linker (GNU ld) ميزة تُسمى "new-dtags"، والتي يمكن استخدامها لإدراج مسار rpath ذي أولوية أقل من LD_LIBRARY_PATHمتغير البيئة . [ 2 ]
إذا تم تفعيل ميزة new-dtags في الرابط --enable-new-dtags، فإن GNU ld، بالإضافة إلى تعيين DT_RPATHالسمة، يقوم أيضًا بتعيين DT_RUNPATHالسمة إلى نفس السلسلة. أثناء التشغيل، إذا وجد الرابط الديناميكي DT_RUNPATHسمة، فإنه يتجاهل قيمتها DT_RPATH، مما يؤدي إلى LD_LIBRARY_PATHفحص المسار أولاً ثم البحث في المسارات الموجودة في DT_RUNPATHالسمة لاحقًا.
لا يقوم الرابط الديناميكي ld بالبحث DT_RUNPATHعن مواقع التبعيات المتعدية، على عكس [ 3 ]DT_RPATH .
بدلاً من تحديد -rpathالرابط، يمكن تعيين متغير البيئة LD_RUN_PATHلتحقيق نفس التأثير.
Solaris ld.so
يبحث الرابط الديناميكي لنظام سولاريس ، وتحديدًا /lib/ld.soفي نظام SunOS 5.8 والأنظمة المشابهة، عن المكتبات في الدلائل المحددة في LD_LIBRARY_PATHالمتغير قبل البحث في DT_RPATHالسمة. وكانت شركة صن مايكروسيستمز أول من أدخل تحميل المكتبات الديناميكي . لاحقًا، أضافت صن خيار rpath إلى أداة ld واستخدمته في المكتبات الأساسية كميزة أمان إضافية. وقد فعل نظام GNU ld الشيء نفسه لدعم المكتبات الديناميكية على نمط صن.
$ORIGINمدعوم. [ 4 ]
في روابط ديناميكية أخرى
صيغة ELF:
- يتعامل ملف ld.so الخاص بـ musl
DT_RUNPATHمع المسارات بنفس طريقةDT_RPATH. ويستخدم الترتيب التالي:LD_LIBRARY_PATH، ثم rpath/runpath، ثم المسارات الافتراضية. وهو يفهم$ORIGIN. - لا يتعرف ملف ld.so الخاص بمكتبة bionic libc على أي شكل من أشكال rpath.
- يحترم ملف ld.so الخاص بنظام FreeBSD عدم التوريث والأولوية الأدنى لـ
DT_RUNPATH. كما أنه يتعامل مع$ORIGIN. [ 5 ]
التنسيقات غير ELF:
الاعتبارات الأمنية
قد يُشكل استخدام rpath وrunpath مخاطر أمنية عندما تتضمن القيمة المُطبقة مجلدات تحت سيطرة المُهاجم. يشمل ذلك الحالات التي تُشير فيها القيمة المُحددة صراحةً إلى موقع قابل للكتابة من قِبل المُهاجم، بالإضافة إلى الحالات التي يُستخدم فيها مسار نسبي $ORIGIN، أو عندما تُترك عبارة المجلد فارغة. يُمكن استغلال ذلك لخداع البرنامج لتحميل مكتبات خبيثة من أحد المجلدات الخاضعة لسيطرة المُهاجم. يُعد هذا الأمر خطيرًا بشكل خاص مع البرامج التي تستخدم setUID، حيث تعمل هذه البرامج بصلاحيات مستخدم مختلف (عادةً ما يكون بصلاحيات أعلى، وغالبًا ما يكون المستخدم الجذر). [ 7 ]
مراجع
- ↑ – دليل مبرمج لينكس – أوامر الإدارة والأوامر ذات الامتيازات من Manned.org
- ↑ "المكتبات المشتركة: مشاكل التوزيع ونظام البناء" . الموقع الرسمي لمترجم هاسكل . تم الاطلاع عليه بتاريخ 4 أبريل 2019 .
- ↑ "الخطأ رقم 1253638 "الرابط الديناميكي لا يستخدم DT_RUNPATH للتنقل... : الأخطاء : حزمة Eglibc : أوبونتو" . 21 نوفمبر 2013.
- ↑ "تقديم $ORIGIN (دليل الروابط والمكتبات)" . docs.oracle.com .
- ↑ – دليل الأوامر العامة لنظام FreeBSD
- ↑ "مكتبات Run-Path المعتمدة" . developer.apple.com .
- ↑ كسر الروابط: استغلال أداة الربط (2011)
روابط خارجية
- chrpath - أداة لتغيير
DT_RPATHسمة ملف تنفيذي وتحويلها إلىDT_RUNPATHسمة - منفذ تطوير FreeBSD devel/chrpath - أداة لتعديل DT_RPATH في ملفات ELF الثنائية الموجودة
- patchELF - أداة صغيرة لتعديل الرابط الديناميكي وسمات
DT_RUNPATHملفات ELF التنفيذية.
- مكتبات الحاسوب
- تقنية نظام التشغيل
