Gerçek Kullanıcı ID’si, Etkin Kullanıcı ID’si ve Saklanmış Kullanıcı ID’si
(Saved Set User ID)
Bilindiği gibi bir dosyaya erişimde process’in etkin kullanıcı ID’si ve etkin grup ID’si test
işlemlerine sokulmaktadır. Normalde process’in gerçek kullanıcı ID’si ve grup ID’si passwd
ve group dosyalarından bakılarak login programı tarafından set edilmektedir. Normal olarak
etkin kullanıcı ID’si gerçek kullanıcı ID’sine eşittir. Ancak exec işlemi sırasında çalıştırılan
programın “set user ID” bayrağı set edilmişse process’in etkin kullanıcı ID’si çalıştırılan
dosyanın user ID’si olur. Her ne kadar konunun başlığı kullanıcı ID’sine yönelikse de burada
anlatılanların hepsi gerçek grup ID’si ve etkin grup ID’si için de geçerlidir. Şüphesiz exec ile
çalıştırılan programların “set group ID” bayrakları da vardır.
Bilindiği gibi super user önceliğine sahip olmak demek etkin kullanıcı ID’sinin root
olmasıdır. Process’in grup ID’sinin ya da etkin grup ID’sinin root olması yalnızca root
dosyalarına erişimde bir ayrıcalık sağlar.
POSIX güvenlik sisteminde ilginç bir kusuru örtmek için saved set user ID denilen ilginç bir
ID kavramı da tanımlanmıştır. saved set user ID exec sonrasında etkin kullanıcı ID’si olarak
set edilir. Örneğin etkin kullanıcı ID’si A olan bir process fork ve exec yaparak B
kullanıcısına ait X dosyasını çalıştırsın. X’in set user ID bayrağı set edilmişse exec sonrasında
alt process’in etkin user ID’si B olur ve saved set user ID’si de B olur.
setuid ve setgid Fonksiyonları
Bu fonksiyonlar basit gibi görünmesine karşın nispeten karmaşık bir kontrol ve set işlemi
yaparlar.
int setuid(uid_t uid);
int setgid(gid_t gid);
Bu fonksiyonlar,
1) Eğer process’in etkin kullanıcı ID’si root ise process’in kullanıcı ID’sini, etkin kullanıcı
ID’sini ve saved set user ID’sini set eder. Benzer biçimde setgid fonksiyonu da eğer etkin
kullanıcı ID’si root ise process’in grup ID’sini, etkin grup ID’sini parametresiyle belirtilen ID
değeri olarak set eder.
2) Eğer process root hakkına sahip değilse, parametreyle belirtilen ID değeri kullanıcı ID
değeri ya da saved set user ID değerine eşitse setuid fonksiyonu process’in etkin kullanıcı
ID’sini parametresiyle belirtilen ID değeri olarak set eder. Benzer biçimde setgid fonksiyonu
da bu koşullarda process’in etkin grup ID’sini set etmektedir.
3) Fonksiyonlar başarısız olursa –1 değerine geri dönerler ve bir erişim nedeniyle başarısız
olmuşlarsa errno EPERM değerine set edilir.
Görüldüğü gibi process root hakkına sahip değilse bu fonksiyonlar yalnızca etkin kullanıcı
ID’sini ve etkin grup ID’sini set ederler. Ancak bunun için parametresinin kullanıcı ID
değerine ya da saved set user ID değerine eşit olması gerekir. Örneğin process’in kullanıcı
ID’si A, fakat etkin kullanıcı ID’si B olsun. setuid fonksiyonu ile etkin kullanıcı ID’sini A
yapabilir.
Saved set user ID neden tanımlanmıştır?
Saved set user ID tipik olarak set user ID bayrağı set edilmiş bir program exec yapıldığında
exec yapılan process’in
setuid(getuid());
ile eski etkin kullanıcı ID’sine geri dönüp sonra yeniden exec yapıldığı durumdaki yeni etkin
kullanıcı ID’sine geçmek için düşünülmüştür. Örneğin kullanıcı ID’si A olan process set user
ID bayrağı set edilmiş bir programı çalıştırarak etkin kullanıcı ID’si B olarak devam etsin.
Process’in saved set user ID’si de B olmuştur. Şimdi process A’nın dosyalarına erişmek istese
erişemez. Ancak etkin kullanıcı ID’sini A yaparak bu erişimi gerçekleştirir.
id = geteuid();
setuid(getuid());
...
...
Şimdi process’in kullanıcı ID’si A, etkin kullanıcı ID’si A fakat saved set user ID’si B’dir.
Şimdi process A’nın dosyalarına erişebilir. Bu işlemden sonra process tekrar etkin kullanıcı
ID’sini B yaparak devam edebilir.
setuid(id);
Saved set user ID kavramı POSIX standartlarına girmiştir. Bazı sistemler (BSD4.3 ve sonrası
ve SystemV-R4) saved set user ID kavramı yerine etkin kullanıcı ID’si ile kullanıcı ID’sini
yer değiştiren ve etkin grup ID’si ile grup ID’sini yer değiştiren setreuid ve setregid
fonksiyonlarına sahiptir.