chroot(2)

الاسم
chroot - تغيير الدليل الجذر

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <unistd.h>

int chroot(const char *path);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

chroot():
    Since glibc 2.2.2:
        _XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
            || /* Since glibc 2.20: */ _DEFAULT_SOURCE
            || /* glibc <= 2.19: */ _BSD_SOURCE
    Before glibc 2.2.2:
        none

الوصف
يغير chroot() الدليل الجذر للعملية المستدعية إلى ذلك المحدد في path. سيُستخدم هذا الدليل لأسماء المسارات التي تبدأ بـ /. يُورث الدليل الجذر بواسطة جميع أبناء العملية المستدعية.

فقط عملية مميزة (لينكس: التي تملك القدرة CAP_SYS_CHROOT في مساحة المستخدم الخاصة بها) قد تستدعي chroot().

يغير هذا الاستدعاء مكونًا في عملية تحليل اسم المسار ولا يفعل شيئًا آخر. على وجه الخصوص، ليس مخصصًا للاستخدام لأي غرض أمني، لا لعزل عملية بالكامل ولا لتقييد استدعاءات نظام نظام الملفات. في الماضي، استُخدم chroot() بواسطة الخدمات الخلفية لتقييد نفسها قبل تمرير مسارات يقدمها مستخدمون غير موثوقون إلى استدعاءات نظام مثل open(2). ومع ذلك، إذا نُقل مجلد خارج دليل chroot، يمكن للمهاجم استغلال ذلك للخروج من دليل chroot أيضًا. أسهل طريقة لفعل ذلك هي استخدام chdir(2) إلى المجلد المراد نقله، وانتظار نقله للخارج، ثم فتح مسار مثل ../../../etc/passwd.

نوع مختلف أكثر صعوبة قليلاً يعمل أيضًا في بعض الظروف إذا لم يكن chdir(2) مسموحًا به. إذا سمحت خدمة خلفية بتحديد "دليل chroot"، فهذا يعني عادةً أنه إذا أردت منع المستخدمين البعيدين من الوصول إلى ملفات خارج دليل chroot، يجب عليك ضمان عدم نقل المجلدات خارجه أبدًا.

لا يغير هذا الاستدعاء دليل العمل الحالي، لذا بعد الاستدعاء يمكن أن يكون '.' خارج الشجرة المتجذرة عند '/'. على وجه الخصوص، يمكن للمستخدم الفائق الهروب من "سجن chroot" بفعل:

    mkdir foo;
    chroot foo;
    cd ..;

لا يغلق هذا الاستدعاء واصفات الملفات المفتوحة، وقد تسمح هذه الواصفات بالوصول إلى ملفات خارج شجرة chroot.

قيمة الإرجاع
عند النجاح، يُعاد الصفر. وعند حدوث خطأ، يُعاد الرقم -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء
اعتمادًا على نظام الملفات، يمكن إرجاع أخطاء أخرى. الأخطاء الأكثر عمومية مُدرجة أدناه:

EACCES
    أُذونات البحث مرفوضة في أحد مكونات بادئة المسار. (انظر أيضًا path_resolution(7).)

EFAULT
    المسار path يشير إلى خارج مساحة العناوين التي يمكن الوصول إليها.

EIO حدث خطأ إدخال/إخراج.

ELOOP
    وُجد عدد كبير جدًا من الوصلات الرمزية أثناء تحليل path.

ENAMETOOLONG
    المسار path طويل جداً.

ENOENT
    الملف غير موجود.

ENOMEM
    ذاكرة النواة المتوفرة غير كافية.

ENOTDIR
    أحد مكونات المسار path ليس دليلاً.

EPERM
    المستدعي لديه امتياز غير كافٍ.

المعايير
لا شيء.

التاريخ
SVr4, 4.4BSD, SUSv1 (مُوسومة ليتم سحبها), SUSv2 (مُوسومة قديمة). هذه الدالة ليست جزءًا من POSIX.1-2001.

ملاحظات
عملية ابنة مُنشأة عبر fork(2) ترث الدليل الجذر لأبويها. يُترك الدليل الجذر دون تغيير بواسطة execve(2).

الرابط الرمزي السحري، /proc/pid/root، يمكن استخدامه لاكتشاف الدليل الجذر لعملية؛ انظر proc(5) للتفاصيل.

فري بي إس دي لديها استدعاء نظام jail() أقوى.

انظر أيضًا
chroot(1), chdir(2), pivot_root(2), path_resolution(7), switch_root(8)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.