Víceuživatelská přístupová práva k souborům

Linux je víceuživatelský operační systém, ve kterém jsou plná systémová oprávnění v rukou administrátorského účtu zvaném „ root“. Kromě uživatele  root jsou v systému další uživatelské účty a skupiny. Více uživatelů může náležet jedné skupině a jeden uživatel může spadat pod více skupin. Přístupová práva k souborům jsou založena jak na uživatelích, tak na skupinách, takže jiní uživatelé nemohou číst vaše soubory, pokud nemají explicitně udělena práva. Každý soubor je přidružený k uživateli a skupině a práva mohou být udělena pouze vlastníkem souboru. Existují tři práva: číst (read), zapisovat ( write) a spouštět ( execute) a mohou být zapnuta nebo vypnuta ve třech položkách: uživatel ( user), skupina ( group) a ostatní ( other). Položka uživatel značí, co vše může vlastník se souborem dělat, skupina upřesňuje, co vše mohou se souborem dělat uživatelé spadající do stejné skupiny jako vlastník, a ostatní logicky popisuje práva ostatních uživatelů. Tato oprávnění se zobrazují písmeny r, w a x, ve třech polích uživatel, skupina a ostatní. V následujícím příkladu má uživatel právo čtení a zápisu, skupina čtení a spouštění a ostatní zápis a spouštění.


-rw-r-x-wx 1 guest visitors 149 Jul 15 23:59 tmp


Jsou situace, kdy je potřeba povolit neprivilegovanému uživateli vykonání nějaké systémové akce, která vyžaduje práva roota, jako je například změna hesla. Jedno možné řešení je dát uživateli práva roota; tímhle krokem se ovšem udělí veškerá systémová práva, což není z bezpečnostního hlediska příliš vhodné. Místo toho je dána programům možnost běžet v kontextu roota, takže systémová činnost může správně proběhnout, aniž by uživatel musel být zároveň root. Tomuto typ oprávnění se říká právo suid ( Set User ID – nastav uživatelovo ID) nebo také suid bit. Když program s tímto právem spustí nějaký uživatel, jeho euid ( Effective User ID – efektivní uživatelské ID) se změní na UID vlastníka souboru a pak je teprve program vykonán. Až se program ukončí, uživatelovo euid se změní zpět na svoji původní hodnotu. Tento bit se ve výpisu souborů označuje písmenem s. Existuje také právo sgid ( Set Group ID – nastav ID skupiny), které dělá přesně to samé s efektivním ID skupiny.


-rwsr-xr-x 1 root root 29592 Aug 8 13:37 /usr/bin/passwd


Například, pokud by chtěl uživatel změnit svoje heslo, musí spustit program /usr/bin/ passwd, jehož vlastníkem je root a má nastavený suid bit. UID uživatele se před spuštěním změní na UID roota (tedy 0) a po skončení se změní nazpět. Programy, které mají právo suid a jejichž vlastníkem je root se nazývají suid root programy. 26 0x200 Programování Toto je místo, kde se změna toku spouštěného programu může stát kritickou. Pokud se dá tok suid root programu změnit tak, aby spustil nějaký cizí kód, útočník se může stát rootem. Pokud útočník dokáže přinutit program, aby pro něj spustil shell, ke kterému by se mohl dostat, bude mít oprávnění roota na uživatelské úrovni. Jak již bylo zmíněno výše, toto je obecně z bezpečnostního hlediska velmi špatné, protože to dává útočníkovi plná práva k ovládání celého systému. Vím co si teď myslíte: „To zní úžasně, ale jak mohu změnit tok vykonávání programu, pokud se program sestává ze striktního souboru pravidel?“ Mnohé programy jsou napsány ve vysokoúrovňových jazycích (tzv. HLL – High-Level Languages), jako je třeba C. Když programátor pracuje v těchto jazycích, často mu unikne způsob, jakým program nakládá s proměnnými, se zásobníkem, s pointery ( ukazateli) a s dalšími nízkoúrovňovými záležitostmi, které nejsou v HLL jazycích tolik zřejmé. Hacker znalý nízkoúrovňových příkazů, ze kterých se HLL program skládá, rozumí vykonávání programu lépe než programátor, který jej napsal. Hackování běhu programu tedy není žádné porušování programových pravidel, je to o znalosti více věcí a jejich souvislostí a o jejich použití nevšedními způsoby. Abyste pochopili tyto exploitovací metody a byli schopni psát programy, které jim dovedou zabránit, je zapotřebí hlubšího porozumění programátorským pravidlům nižší úrovně, jakým je třeba virtuální paměť programu.