تفاوت real user id و effective user id

برای توضیح این تفاوت لازم است کمی به عمق سیستم عامل‌های شبه یونیکس بروم. در کرنل به دلیل نیاز به سرعت و کارآیی بالا از ساختارهای داده‌ای (تا حد امکان) ساده استفاده می‌شود. به همین دلیل است که به جای نام‌ها و گروه‌های کاربری (user /group) از یک متغییر منحصربفرد از نوع unsigned interger استفاده می‌شود که یک عدد است. مشخصا کارکردن با اعداد سریعتر از کارکردن با رشته‌ها (string) است. user ها و groupها بر اساس فایل‌های etc/passwd/ و etc/group/ به شناسه‌ی انحصاری خودشان (user id/ group id) مرتبط می‌شوند. به عنوان مثال، عدد صفر (۰) مشخص کننده‌ی user id و group id کاربر ریشه (root) است.

این user id/ group id در پروسه‌ها نیز وجود دارد. کرنل بر اساس همین user id/group id تصمیم می‌گیرد که پروسه به چه منابعی دسترسی داشته باشد. اغلب منظور از user id/group id  همان effective user id/ effective group id است. پس به طور ساده می‌توان گفت که EUID/EGID تعیین کننده‌ی دسترسی پروسه به منابع سیستم است.

ابزار passwd را در نظر بگیرید. این ابزاری است که برای تنظیم رمزعبور کاربران استفاده می‌شود. این ابزار فایل etc/passwd/ را مورد دسترسی قرار می‌دهد. هر کاربری این دستور را اجرا کند می‌تواند رمزعبور خودش را تغییر دهد. ولی چطور برنامه تشخیص می‌دهد که چه کسی آن را اجرا کرده؟ به کمک effective UID/ effective GID فقط می‌توان گفت که دسترسی به فایل passwd وجود داشته باشد یا خیر. اینجاست که جفت دیگر user id/ group id مطرح می‌شوند که به آن real user id/read group id گفته می‌شود. این دو پارامتر پروسه‌، مشخص می‌کنند که کاربر اجرا کننده‌ی پروسه با چه حساب کاربری لوگین کرده است. پس کافیست برنامه این مشخصات را درخواست کند تا بتواند به درستی عمل کند.

معمولا effective user id/effective group id با جفت‌های real user id/real group id یکی هستند. موضوع وقتی جالب می‌شود که یک برنامه‌ی setuid دار را اجرا کنید. فرض کنید به حساب کاربری خودتان که user id آن ۵۰۰ است وارد شده اید. حالا برنامه‌ای که setuid root دارد اجرا می‌کنید. بخاطر وجود setuid root سیستم عامل effective user ID پروسه را به root (معادل صفر) تغییر می‌دهد. ولی real user id همچنان ۵۰۰ می‌ماند. به این ترتیب برنامه همچنان هویت کسی که آن را اجرا کرده می‌شناسد و می‌تواند به فایل‌ها و سایر منابع با مجوز کاربر ریشه دسترسی داشته باشد.

برگرفته از Real and Effective IDs با تصرف و تلخیص

———————————————

ظاهرا این مقاله‌ چندان گویا نبوده است. پس تصمیم گرفتم مساله رو کمی بیشتر شفاف کنم:

effective UID / effective GID روی ساختن و دسترسی به فایل تاثیر می‌گذارند. موقع ساخته شدن فایل، کرنل ویژگی owner (مالک) فایل را بر اساس effective UID و effective GID پروسه‌ی سازنده‌ی فایل تنظیم می‌کند. یعنی اگر آن effective UID پروسه root بود، مالک فایل root می‌شود. همچنین موقع دسترسی به فایل (مثلا خواندن/نوشتن یا اجرا کردن) کرنل از effective UID و effective GID پروسه برای تشخیص امکان دسترسی به فایل استفاده می‌کند.

پس کاربرد effective UID منحصر به تعیین دسترسی به منابع است. (accessing to resouces)

از طرف دیگر real UID/ real GID برای تشخیص اجرا کننده‌ی پروسه استفاده می‌شود. این مثلا در مجوز‌های ارسال سیگنال تاثیر گذار است. همانطور که می‌دانیم پروسه‌ای که از طرف کاربر root اجرا نشده باشد، فقط در شرایطی می‌تواند به پروسه‌ای دیگر سیگنال ارسال کند که real UID آن پروسه با real UID خودش یکی باشد.

پس کاربرد real UID منحصر به تشخیص کاربر اجرا کننده‌ی پروسه است. (process owner)

چند نکته کاربردی:

real UID: این UID پروسه/کاربر است که تعیین می‌کند چه کسی پروسه را بوجود آورده است. این مقدار فقط وقتی قابل تغییر است که EUID پروسه برابر با صفر باشد.

effective UID: این uid برای تعیین دسترسی پروسه برای اجرای اعمال خاصی استفاده می‌شود. euid می‌تواند به RUID یا SUID تغییر داده شود (در حالتیکه euid برابر با صفر نباشد، اگر euid برابر با صفر باشد می‌تواند به هر چیزی تغییر داده شود!)

Saved UID: اگر بیت set-UID فایل باینری که اجرا شده فعال باشد، SUID با UID مالک فایل یکی خواهد بود. در غیر اینصورت SUID با RUID یکی است.

نکته: set-UID مجوزی است که بر روی فایل‌های باینری فعال می‌شود (به کمک دستور chmod) که Saved UID را تحت تاثیر قرار می‌دهد، این را نباید با setuid که تابعی در زبان‌های برنامه‌نویسی است اشتباه گرفت. این تابع effective UID را تغییر می‌دهد.

منابع:

what i learned 2day

allexperts.com

Thanks for passing by: ↓



2 دیدگاه برای “تفاوت real user id و effective user id”

  1. تو داری حروم میشی ها…!

    حالا برای اینکه ثابت کنم خوندمش یه غلط املایی ازت میگیرم. پاراگراف سوم، خط سوم، read group id
    😉

    میگم الان اینایی که گفتی میتونه منشاء یک عملیات هکینگ باشه؟!!!

    [پاسخ]

    ali پاسخ در تاريخ آذر ۲۶ام, ۱۳۸۹ ۷:۰۵ ب.ظ:

    مرسی نبی جون! لطف داری گلم.
    دستت درد نکنه اصلاحش کردم.
    😉
    راستش این تشریح بخشی از مکانیزم امنیتی لینوکس بوده. اگه با دید «هکینگ» بخوایم بهش نگاه کنیم. باید بگم اگه هکر برنامه‌ای روی سیستم آپلود کنه که بتونه بدون اجرا ازطرف کاربر root مقدار، euid صفر بگیره، مشخصا کنترل کل سیستم رو به کمک سیگنال‌ها یا حتی ساده‌تر از اون با دسترسی به فایل سیستم می‌تونه به دست بیاره. حالا اینکه چطور بتونه همچین کاری بکنه با شما و هکر‌های عزیز!!

    [پاسخ]

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *