Speciální oprávnění v Linuxu

Z Milan Kerslager
Přejít na: navigace, hledání

Speciální oprávnění v Linuxu je v unixových systémech metoda, jak propůjčit uživateli (resp. procesu) jiná oprávnění, než by vyplynula ze standardního chování systému. SUID a SGID bit se na souborech využívá pro přidělení jiných (často vyšších) oprávnění pro přesně definovaný úkol (resp. běh nějakého programu). Sticky bit na souborech naopak standardní oprávnění omezuje. SGID bit na souborech ovlivňuje vlastnictví skupiny u nových souborů a adresářů.

Speciální oprávnění sama o sobě neposkytují zabezpečení proti zneužití, které tak musí být implementováno přímo do programů, které je využívají. Nejsou-li takové programy naprogramovány velmi obezřetně, můžou být zdrojem bezpečnostních problémů.[1]

Standardní chování unixového systému

Speciální oprávnění ovlivňují standardní chování unixového systému, a proto je potřeba nejprve definovat, co standardní chování vlastně znamená.

V unixovém systému se rozlišují dvě úrovně oprávnění: správce systému (s názvem účtu root) a běžný uživatel. Oprávnění jsou implementována jak na uložená data (soubory a adresáře), tak pro běžící procesy. Pro správce systému se přístupová práva v jádře operačního systému nekontrolují (typicky), takže má ke všemu neomezený přístup. Naopak běžní uživatelé podléhají vzájemnému oddělení.

Oprávnění pro soubory a adresáře

Na soubory a adresáře se vztahují standardní unixová oprávnění (tzv. svatá trojice).

Podrobnosti v článku: Přístupová práva v Linuxu

Oddělení procesů

Spuštěné programy se nazývají procesy. Procesy jsou navzájem odděleny jak z hlediska adresního prostoru (procesy standardně nemohou zasahovat do paměťového prostoru jiného procesu), tak z hlediska příjmu signálů (mohou přijímat jen signály stejného uživatele nebo správce systému). Procesy i uživatelé jsou z hlediska oprávnění odděleny podle UID, takže každý uživatel může spravovat svoje procesy (a správce systému může spravovat všechny).

Dědění oprávnění

Unixový systém standardně dědí oprávnění po rodičovském procesu. Hierarchie procesů je ryze stromová, přičemž první proces, který je jádrem operačního systému při jeho startu vytvořen a spuštěn, je init (typicky). Jádro operačního systému samo o sobě již dále nevytvoří žádný další proces, dovoluje pouze vznik potomků z již existujících procesů pomocí systémových volání fork() a exec(). Proto je init faktickým rodičem nebo prarodičem (resp. prarodičem v několikátém stupni) všech procesů, které v systému existují.

Pokud má běžící proces oprávnění správce systému, může své oprávnění změnit na libovolného běžného uživatele. Proces s oprávněním běžného uživatele nemůže své oprávnění nijak měnit (tj. změnit své UID na UID jiného uživatele).

Přihlášení uživatele

Při přihlašování uživatele je obsluha (a kontrola uživatelského jména a hesla) realizována procesem, který je spuštěn s oprávněním správce systému. Při pokusu o přihlášení uživatele je nejprve z takového procesu odštěpen potomek (voláním fork()), který má též práva administrátora, a dále proces autentizace obsluhuje. Pokud je uživatel autentizován, změní obslužný proces své UID na UID autentizovaného uživatele a následně sám sebe změní na shell (pomocí systémového volání exec()).

Uživatel je tak do systému přihlášen a zároveň obsluhován vlastním procesem (shellem). Ze shellu jsou dále spouštěny další programy, které pomocí principu dědění oprávnění běží také pod právy tohoto uživatele (se stejným UID).

Chování se speciálním oprávněním

K souborům a adresářům, které jsou označeny SUID, SGID nebo sticky bitem, přistupuje systém speciálním způsobem. V této kapitole je uveden rozpis jednotlivých odchylek od výše zmíněných standardních pravidel.

SUID bit

SUID bit na souboru se programem způsobí, že při spuštění tohoto programu nejsou oprávnění děděna od rodičovského procesu, ale jsou nastavena na UID uživatele, kterému tento soubor patří (je jeho vlastníkem). Proces tedy běží s právy majitele souboru s programem místo s právy toho, kdo jej spustil. SUID bit se nejčastěji používá pro poskytnutí větších oprávnění, než by měl uživatel standardně. Přestože takto lze spustit proces s právy jakéhokoliv uživatele v systému, používá se zejména pro poskytnutí oprávnění správce systému (root), takže v tomto případě musí být vlastníkem souboru se spouštěným programem správce systému (root).

SUID bit na adresáři

SUID bit nemá na adresáři žádný speciální význam.

SGID bit

SGID bit na souboru pracuje obdobným způsobem jako SUID bit, avšak s ohledem na skupinu, které soubor patří. Spustíme-li tedy soubor s programem, který je označen SGID bitem, má běžící proces oprávnění skupiny, které soubor patří.

SGID bit na adresáři

SGID bit na adresáři má odlišný význam. Vytvoříme-li v takovém adresáři nový soubor nebo adresář, není jeho majitelem primární skupina aktuálního uživatele, ale skupina, které patří nadřízený adresář s nastaveným SGID bitem (bez ohledu na členství ve skupinách právě uživatele, který ho vytvořil). Vytvořené adresáře mají též nastaven SGID bit, takže se celek chová jako by byl SGID bit na adresáři děděn do podadresářů.

Sticky bit

Sticky bit je v současných systémech funkční pouze pro adresáře. Má-li uživatel do adresáře právo zápisu, může v takovém adresáři nejen soubory vytvářet, ale i přejmenovávat i mazat. Tato vlastnost je nevhodná v případě sdílených adresářů, do kterých si uživatelé a programy odkládají dočasné informace (typicky adresář /tmp). Nastavený sticky bit způsobí, že uživatel může volně soubory nebo další podadresáře vytvářet, ale mazat může pouze ty svoje (kterých je majitelem). Jedná se tedy o restrikci na přejmenování nebo smazání objektu uvnitř adresáře se sticky bitem.

Sticky bit na soubor

Sticky bit měl na souborech význam pouze v dřívějších dobách, kdy nebyla dostatečně vyvinuta správa paměti uvnitř jádra operačního systému. V současné době žádný význam nemá.

Využití v běžném systému

V běžném unixovém systému (tedy i v Linuxu) se nachází několik binárek s nastaveným SUID bitem. Obecně je snaha jejich počet minimalizovat. V uplynulých 10 letech bylo v Linuxu opraveno velmi mnoho bezpečnostních problémů týkajících se SUID root. V současné době je upravován server X.org[2] pro grafické prostředí X Window System[3], aby SUID bit nepotřeboval (pro umožnění přímého přístupu k hardware grafické karty).

Změna hesla

Hesla pro přístup uživatelů do systému jsou z bezpečnostních důvodů umístěna v souboru /etc/shadow. Do tohoto souboru však nemá žádný běžný uživatel přístup:

$ ls -l /etc/shadow
-r--------. 1 root root 1458 19. lis 19.18 /etc/shadow

Dokonce ani uživatel root nemá do souboru právo zapisovat (avšak pro něj se přístupová práva nevyhodnocují, takže do něj stejně zapisovat může). Proto je nástroj pro změnu hesla nutno opatřit SUID bitem a uživatel root musí být jeho majitelem:

$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 25336 14. zář 14.14 /usr/bin/passwd

Spustí-li uživatel program passwd, běží tento program s právy uživatele root (root je majitelem SUID binárky) a může tedy změnit heslo, které je uloženo v souboru /etc/shadow. SUID program však musí být naprogramován tak, aby nedošlo k tomu, že uživatel bude vinou v algoritmu schopen změnit heslo někomu jinému (třeba kolegovi nebo rootovi), protože pak by to znamenalo bezpečnostní problém. Pokud se běžný uživatel pokusí změnit heslo někomu jinému, program to odmítne:

$ passwd root
passwd: Pouze root smí zadat uživatelské jméno.

Skóre ve hře

Pokud je ve víceuživatelském systému k dispozici hra (např. Tetris, gnuchess, gnomine atp.), je dosažené skóre ukládáno do běžného souboru. Do souboru musí mít všichni uživatelé přístup, aby program mohl jejich skóre aktualizovat. Tím však do skóre může zasahovat nejen program, ale i sami uživatelé, kteří mohou záznamy o skóre snadno zmanipulovat běžným editorem. Proto jsou využita speciální oprávnění tak, že hra (program gnuchess) má nastaven SGID bit a patří skupině games, ve které není žádný běžný uživatel. DO souboru se skóre má právo zápisu jen tato konkrétní skupina. Program pak může skóre aktualizovat (ale jen na základě skutečně odehraných bodů), ale uživatelé ho mohou skóre jen číst.

Přímý přístup k hardware

Přímý přístup k hardware počítače má jen uživatel root. Běžný uživatel musí využívat služby jádra operačního systému, což však může být pomalé (jádro musí nejprve ověřit, že daná operace je bezpečná). Při přístupu k běžnému hardware to nevadí, protože jádro dokáže přístup zorganizovat efektivněji (například k pevnému disku) nebo rychlost není kritická (počítačová myš, klávesnice). Avšak v případě ovládání grafické karty (v GUI – grafickém uživatelském prostředí) jde zejména o rychlost. X server, který to má v běžném unixovém systému na starosti, musí mít přímý přístup k hardware grafické karty, aby byl schopen dosáhnout požadované rychlosti (např. ve hrách). Proto binárka s X serverem patří uživateli root a má nastaven SUID bit:

$ ls -l /usr/bin/Xorg
-rws--x--x. 1 root root 1935688  6. lis 01.44 /usr/bin/Xorg

X server je však poměrně komplikovaný a objemný software, u kterého je velké riziko, že v něm bude nějaká skrytá chyba. Proto se současné době (rok 2009) dokončují práce na přesunutí nastavování grafické karty do jádra Linux (tzv. kernel-mode-setting, KMS) a zároveň byla vybudována infrastruktura pro společnou správu operační paměti RAM a paměti grafické karty (GEM a TTM), která umožní X serveru neprivilegovaný běh se současnou efektivní možností ovládání grafické karty.

Zneužití SUID

Ochrana proti zneužití

Nalezení SUID programů

Následující příkaz nalezne všechny soubory, které mají nastaven SUID nebo SGID bit. Příkaz find projde všechny připojené souborové systémy a příslušné soubory vypíše pomocí volání příkazu ls -l:

find / -type f -a \( -perm /u+s -o -perm /g+s \) -exec ls -l {} \;

Reference

  1. http://www.ms.mff.cuni.cz/~zembm2am/exploity/exploity.html
  2. http://cs.wikipedia.org/wiki/X.org
  3. http://cs.wikipedia.org/wiki/X_Window_System