Setuid

**Setuid** a **setgid** (skratka pre **set** **u**ser **ID** upon execution a **set** **g**roup **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 súbor|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 skript|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

```bash
[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.

## Pozri aj
* Bezpečnosť v Unixe

## Referencie

## Externé odkazy
* Hao Chen, David Wagner, Drew Dean: <cite>Setuid Demystified</cite> (pdf)
* Dan Tsafrir, Dilma Da Silva, David Wagner: Murky Issue of Changing Process Identity: Revising Setuid Demystified</cite> (pdf)
* Wayne Pollock: Unix File and Directory <cite>Permissions and Modes</cite>

## Zdroj
* 

Kategória:Unix