# Setuid
Setuid a setgid (skratka pre set user ID upon execution a set group ID upon execution) sú Unixové príznaky pre prístupové práva, ktoré umožňujú užívateľovi spustiť  spustiteľný súbor s oprávnením od vlastníka spustiteľného súboru, alebo  skupiny, ktorej súbor s programom patrí. Umožňujú užívateľom spustenie programov s dočasne zvýšenými privilégiami za účelom vykonania špecifickej úlohy.  
Setuid a setgid sú potrebné pre úlohy, ktoré vyžadujú vyššie privilégiá ako tie, ktoré bežný užívateľ vlastní, ako napríklad zmena svojho prihlasovacieho hesla. Niektoré z úloh, ktoré vyžadujú zvýšené privilégiá nemusia byť okamžite zrejmé; ako napríklad príkaz ping, ktorý musí poslať a žiadať kontrolné pakety na sieťovom rozhraní. 

## Setuid pri spustiteľných súboroch
Po tom, ako binárny spustiteľný súbor dostal „setuid“ atribút, normálni užívatelia systému, ktorí majú povolenie na spustenie súboru, získajú privilégiá užívateľa, ktorý vlastní súbor (zvyčajne root)  vo vytvorenom procese. Po získaní privilégií roota v procese môže aplikácia vykonávať v systéme úlohy, ktoré bežní užívatelia vykonávať nemôžu. Volajúcemu užívateľovi systém zakáže vykonanie nového procesu inou cestou, napríklad použitím ptrace, premennej LD_LIBRARY_PATH alebo zaslaním signálov do neho (signály z terminálu budú napriek tomu stále akceptované). Kvôli zvýšenej pravdepodobnosti bezpečnostných trhlín , mnoho operačných systémov ignoruje setuid atribút aplikovaný na spustiteľné shell skripty.
I keď je funkcia setuid v mnohých prípadoch veľmi užitočná, môže predstavovať bezpečnostné riziko, ak je atribút setuid pridelený spustiteľným programom, ktoré nie sú pozorne navrhnuté.Užívatelia môžu využiť zraniteľnosť v chybných programoch na získanie permanentne zvýšených privilégií, alebo neúmyselne spustiť trójskeho koňa.
Atribút setgid  umožňuje zmenu skupinových privilégií v procese, podobne ako príznak setuid povoľuje zmenu užívateľských privilégií.
Charakter setuid spustiteľných súborov dosvedčuje fakt, že systémové volanie chroot nie je v Unixe dostupné pre non-root užívateľov.
Setuid a setgid bity sú bežne nastavované príkazom chmod nastavením najvyššieho oktetu na 4 (pre setuid) alebo 2 (pre setgid). `chmod 6711` nastavením setuid a setgid bit (6) umožňuje čítať/zapisovať/spúšťať súbor vlastníkovi (7), skupine (prvá 1) a ostatným (druhá 1). Všetky chmod príznaky sú oktety a najnižší bit najvyššieho oktetu je používaný pre špeciálny mód známy ako  sticky bit.  
Väčšina implementácií príkazu chmod tiež podporuje symbolické argumenty na nastavovanie týchto bitov, čo je ukázané aj v demonštrácii ako príkaz `chmod ug+s` .
Demonštračný program v jazyku C jednoducho získava a ukazuje reálne a efektívne user a group id aktuálne priradené k procesu. Príkazy uvedené najskôr kompilujú proces ako užívateľ `bob` a následne používajú `chmod` na zavedenie setuid a setgid bitov. Príkaz `su`, samotný klient funkcie setuid, je vzápätí použitý na prijate id `alice`. Efektivita príkazu `chmod` je overená pomocou `ls -l` a nakoniec, demonštračný program je spustený, odhaľujúc očakávanú zmenu identity, konzistentnú so súborom /etc/passwd. 
Je nutné poznamenať, že demonštračný program uvedený nižšie zlyhá pri zmene efektívneho UID, ak beží na disku inštalovanom s `nosuid` voľbou. 

### Ukážka
```
[
bob@foo
]
$
 
cat
 
/etc/passwd
alice:x:1007:1007::/home/alice:/bin/bash
bob:x:1008:1008::/home/bob:/bin/bash


[
bob@foo
]
$
 
cat
 
printid.c

#include <sys/types.h>


#include <unistd.h>


#include <stdio.h>


int
 
main
()
 
{


    
printf
(


        
"Real      UID = %d\n"


        
"Effective UID = %d\n"


        
"Real      GID = %d\n"


        
"Effective GID = %d\n"
,

        
getuid
 
()
,

        
geteuid
()
,

        
getgid
 
()
,

        
getegid
()


    
)
;


    
return
 
0
;


}



[
bob@foo
]
$
 
gcc
 
-Wall
 
printid.c
 
-o
 
printid

[
bob@foo
]
$
 
chmod
 
ug+s
 
printid

[
bob@foo
]
$
 
su
 
alice
 

Password:
 


[
alice@foo
]
$
 
ls
 
-l
-rwsr-sr-x
 
1
 
bob
 
bob
 
6944
 
2007
-11-06
 
10
:22
 
printid

[
alice@foo
]
$
 
./printid
 

Real
      
UID
 
=
 
1007

Effective
 
UID
 
=
 
1008

Real
      
GID
 
=
 
1007

Effective
 
GID
 
=
 
1008


[
alice@foo
]
$

```


## setgid pri adresároch
Príznaky setuid a setgid flags nastavené na adresári, majú úplne rozdielny význam..
Nastavenie setgid oprávnenia na adresári (chmod g+s) spôsobuje, že nové súbory a podadresáre vytvorené v ňom zdedia jeho groupID skôr než primárne  groupID užívateľa, ktorý vytvoril súbor (ownerID nie je nikdy ovplyvnené, iba groupID). Novovytvorené podadresáre dedia setgid bit. Nastavenie setgid oprávnenia na adresári ovplyvňuje iba groupID od nových súborov a podaresárov vytvorených po tom, ako bol nastavený setgid bit, a neaplikuje sa na existujúce entity. Nastavenie setgid bitu na existujúce podadresáre musí byť vykonané manuálne, napríklad nasledujúcim príkazom:
```
[root@foo]# find /path/to/directory -type d -exec chmod g+s '{}' \;
```

Setuid oprávnenie nastavené na adresári je ignorované v systémoch UNIX a Linux . FreeBSD môže byť nastavené tak, aby ho interpretovalo analogicky k setgid, teda aby boli všetky súbory a podadresáre vlastnené vlastníkom vrchného adresára.

## História
Používanie setuid bitu navrhol Dennis Ritchie. Jeho zamestnávateľ, AT&T, požiadal o patent v roku 1972; patent bol pridelený  v roku 1979 pod patentovým číslom 4 135 240. Patent sa neskôr stal verejným.