setuid(2)

الاسم
setuid - تعيين هوية المستخدم

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

موجز
#include <unistd.h>

int setuid(uid_t uid);

الوصف
تضبط setuid() معرف المستخدم الفعّال للعملية المستدعية. إذا كانت العملية المستدعية مميزة (بدقة: إذا كانت العملية تملك القدرة CAP_SETUID في نطاق المستخدم الخاص بها)، يتم أيضًا ضبط UID الحقيقي ومعرف المستخدم المُعدّ المحفوظ.

تحت لينكس، تُنفّذ setuid() مثل نسخة POSIX مع ميزة _POSIX_SAVED_IDS. يسمح هذا لبرنامج set-user-ID (غير root) بإسقاط جميع صلاحيات المستخدم الخاصة به، والقيام ببعض العمل غير المميز، ثم إعادة استخدام معرف المستخدم الفعّال الأصلي بطريقة آمنة.

إذا كان المستخدم هو root أو البرنامج هو set-user-ID-root، يجب توخي الحذر الخاص: تفحص setuid() معرف المستخدم الفعّال للمستدعي وإذا كان المستخدم الفائق، يتم ضبط جميع معرفات المستخدم المرتبطة بالعملية إلى uid. بعد حدوث هذا، يستحيل على البرنامج استعادة صلاحيات root.

وبالتالي، لا يمكن لبرنامج set-user-ID-root الذي يرغب في إسقاط صلاحيات root مؤقتًا، وافتراض هوية مستخدم غير مميز، ثم استعادة صلاحيات root لاحقًا استخدام setuid(). يمكنك تحقيق هذا باستخدام seteuid(2).

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

ملاحظة: هناك حالات قد تفشل فيها setuid() حتى عندما يكون UID المستدعي هو 0؛ إنه خطأ أمني جسيم إغفال التحقق من إرجاع الفشل من setuid().

الأخطاء

EAGAIN
    سيغير الاستدعاء UID الحقيقي للمستدعي (أي، uid لا يطابق UID الحقيقي للمستدعي)، ولكن كان هناك فشل مؤقت في تخصيص هياكل بيانات النواة الضرورية.

EAGAIN
    لا يطابق uid معرف المستخدم الحقيقي للمستدعي وسيجلب هذا الاستدعاء عدد العمليات التابعة لمعرف المستخدم الحقيقي uid فوق حد المورد RLIMIT_NPROC للمستدعي. منذ لينكس 3.1، لم تعد حالة الخطأ هذه تحدث (لكن يجب على التطبيقات القوية التحقق من هذا الخطأ)؛ انظر وصف EAGAIN في execve(2).

EINVAL
    معرف المستخدم المحدد في uid غير صالح في نطاق المستخدم هذا.

EPERM
    المستخدم غير مميز (لينكس: لا يملك القدرة CAP_SETUID في نطاق المستخدم الخاص به) ولا يطابق uid UID الحقيقي أو معرف المستخدم المُعدّ المحفوظ للعملية المستدعية.

الإصدارات

  الاختلافات بين مكتبة C والنواة
على مستوى النواة، معرفات المستخدم ومعرفات المجموعة هي سمة لكل خيط. ومع ذلك، تتطلب POSIX أن تشارك جميع الخيوط في عملية ما نفس بيانات الاعتماد. تعالج تنفيذ خيوط NPTL متطلبات POSIX من خلال توفير دوال غلاف لاستدعاءات النظام المختلفة التي تغير UIDs و GIDs للعملية. تستخدم دوال الغلاف هذه (بما في ذلك دالة setuid()) تقنية قائمة على الإشارات لضمان أنه عندما يغير خيط واحد بيانات الاعتماد، فإن جميع الخيوط الأخرى في العملية تغير أيضًا بيانات اعتمادها. للتفاصيل، انظر nptl(7).

المعايير
POSIX.1-2024.

التاريخ
POSIX.1-2001، SVr4.

غير متوافق تمامًا مع استدعاء 4.4BSD، الذي يضبط جميع معرفات المستخدم الحقيقية والمحفوظة والفعالة.

دعم استدعاء نظام لينكس الأصلي setuid() معرفات مستخدم 16-bit فقط. لاحقًا، أضاف لينكس 2.4 setuid32() لدعم معرفات 32-bit. تتعامل دالة الغلاف setuid() في glibc بشفافية مع الاختلاف عبر إصدارات النواة.

ملاحظات
يملك لينكس مفهوم معرف مستخدم نظام الملفات، الذي يساوي عادة معرف المستخدم الفعّال. يضبط استدعاء setuid() أيضًا معرف مستخدم نظام الملفات للعملية المستدعية. انظر setfsuid(2).

إذا كان uid مختلفًا عن UID الفعّال القديم، سيُمنع العملية من ترك تفريغات أساسية.

انظر أيضًا
getuid(2), seteuid(2), setfsuid(2), setreuid(2), capabilities(7), credentials(7), user_namespaces(7)

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

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

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