V tomto druhém pokračování seriálu o bezpečnosti v systémech UNIX se budeme věnovat různým druhům souborů a jejich vlastnostem.
UNIX je souborově orientovaný operační systém a přístup k hardwarovým prostředkům se uskutečňuje přes speciální soubory. Speciální soubory k těmto zařízením jsou uloženy v adresáři /dev. Stejně jako ostatní soubory mají i speciální soubory nadefinována přístupová práva. Obecně by žádný speciální soubor neměl mít povolen zápis pro skupiny nebo ostatní (s výjimkou souborů jako /dev/null) a některé by neměly mít ani právo na čtení (/dev/tty*, /dev/mem). Požadavky na přístupová práva se mohou lišit pro speciální soubory disků, terminály a pseudoterminály, ale hlavní zásadou je nastavit přístupová práva tak, aby byla co nejmenší a aby zároveň soubor plnil svou funkci.
Většina programů, které uživatel spouští, běží s privilegii daného uživatele. Jádro operačního systému zajistí, aby uživatel mohl provádět pouze věci, ke kterým je oprávněn. Jsou ale situace, ve kterých taková oprávnění nestačí. Typickým příkladem je změna hesla. Změna hesla se provádí změnou záznamu v souboru /etc/passwd. Do tohoto souboru však může zapisovat pouze superuživatel. K tomu, aby si uživatel mohl sám změnit heslo, musí tedy získat některá práva superuživatele.
K tomuto účelu existují programy s propůjčením identifikace vlastníka nebo skupiny. Takový program je spuštěn s přístupovými právy vlastníka (nebo skupiny), kterému daný program patří. Takové programy můžete najít např. příkazem find /usr/bin -perm +07000 -print.
Většina programů s propůjčením identifikace patří superuživateli nebo systémovým účtům. Ale takové programy si může vytvořit i normální uživatel, který tak může zpřístupnit některá svá soukromá data ostatním. To je další důvod k tomu, aby uživatel nenechával svůj terminál nebo počítač nechráněný v době své nepřítomnosti. Útočníkovi jednoduše postačí zkopírovat shell do svého adresáře a propůjčit mu identifikaci uživatele. Tím může příště získat identifikaci tohoto uživatele i v budoucnosti pouhým spuštěním zkopírovaného shellu, a to bez jakékoli znalosti uživatelova hesla.
Programy tohoto typu s sebou nesou některá další rizika. Mezi ně patří například přeplnění bufferu. Pokud program používá funkce typu strcpy, může dojít k přeplnění bufferu, do něhož se řetězec překopírovává. To hrozí hlavně v případě, že se řetězec čte ze vstupu. Potom je možné pečlivou konstrukcí vstupního řetězce modifikovat program tak, aby dělal něco jiného, než bylo zapsáno v původním programu. Nejznámějším případem takového chování byla chyba v programu finger umožňující spouštět proceduru, kterou do něj uložil útočník. Tato procedura pak získala privilegia superuživatele.
Parametry pro spouštění většiny systémových programů jsou uloženy v konfiguračních souborech v adresáři /etc. Konfigurační soubory by měly být zapisovatelné pouze pro vlastníka. Některé soubory by také neměly mít povoleno čtení (připomeňme soubor /etc/shadow, jehož existence by neměla smysl, kdyby nebyl čitelný pouze superuživateli).
Uživatelé si také musí dávat pozor na programy používající při svém
spuštění konfigurační soubory z adresáře, ve kterém byly spuštěny.
Typickým příkladem je program vi, který spouští soubor .exrc
z adresáře, v němž se nachází. Tento soubor pak může provést příkazy
bez toho, aby to uživatel postřehl. Zvláště nebezpečné jsou tyto konfigurační
soubory pro superuživatele, protože bývají spuštěny s jeho privilegii.
Útočník například může do souboru .exrc uložit sekvenci:
!(rm -rf/)&
Pak už jen zbývá přimět správce, aby editoval nějaký soubor v příslušném
adresáři.
Některé další důležité konfigurační soubory:
daytime stream tcp nowait root /bin/ksh ksh -i |
bomba: "/usr/tajna/.exploze" |
echo "vybuch::0:0:prof.Semtex:/:/bin/sh" >> /etc/passwd |
Proměnná PATH nastavuje pořadí prohledávání adresářů při hledání programů. Pokud je tato proměnná špatně nastavena, může spustit programy, které uživatel spustit nechtěl. Pokud se uživatel překlepne a napíše např. mroe místo more, tak se prohledají všechny cesty, a teprve pokud není program mroe nalezen, je nahlášena chyba. Proto by mělo pro nastavení proměnné PATH platit následující:
Proměnná IFS slouží jako seznam oddělovačů slov pro shell. Většinou je tato proměnná nastavena na prázdné znaky (mezera, tabulátor a konec řádku). Pokud je do proměnné IFS přiřazena jiná hodnota, např.: /, může dojít k tomu, že je spuštěn jiný program, než bylo zamýšleno. Například script:
#!/bin/sh IFS=$IFS /bin/ls |
spustí program bin s parametrem ls. Pokud je v proměnné PATH nastaven zapisovatelný adresář, je možné tam umístit program bin, který provádí neoprávněné operace.