Privilegovaný přístup k souborům a adresářům je ve skutečnosti určen schopnostmi, nejen tím, že je root
nebo ne. V praxi root
má obvykle všechny možné schopnosti, ale jsou situace, kdy všechny/mnoho z nich může být zrušeno nebo některé dány jiným uživatelům (jejich procesům).
Stručně jste již popsali, jak fungují kontroly řízení přístupu u privilegovaného procesu. Zde je návod, jak to ve skutečnosti ovlivňují různé schopnosti:
Hlavní schopnost je zde CAP_DAC_OVERRIDE
, proces, který ji má, může „obcházet čtení, zápis a provádění kontrol oprávnění“. To zahrnuje čtení a zápis do libovolných souborů, stejně jako čtení, zápis a přístup k adresářům.
Ve skutečnosti se nevztahuje na spouštění souborů, které nejsou označeny jako spustitelné. Komentář v generic_permission
(fs/namei.c
), než přístup zkontroluje soubory, říká, že
Čtení/zápis DAC lze vždy přepsat. Spustitelné DAC lze přepsat, pokud je nastaven alespoň jeden exec bit.
A kód zkontroluje, zda existuje alespoň jeden x
bit nastaven, pokud se pokoušíte spustit soubor. Domnívám se, že jde pouze o pohodlnou funkci, která má zabránit náhodnému spuštění náhodných datových souborů a získání chyb nebo zvláštních výsledků.
Každopádně, pokud můžete přepsat oprávnění, stačí vytvořit spustitelnou kopii a spustit ji. (Ačkoli to může znamenat teoretický rozdíl, protože soubory setuid procesu dokázaly přepsat oprávnění k souboru (CAP_DAC_OVERRIDE
), ale neměl další související funkce (CAP_FSETID
/CAP_FOWNER
/CAP_SETUID
). Ale mít CAP_DAC_OVERRIDE
umožňuje editaci /etc/shadow
a podobné věci, takže je to přibližně stejné, jako kdybychom měli úplný root přístup.)
Je zde také CAP_DAC_READ_SEARCH
schopnost, která umožňuje číst libovolné soubory a přistupovat k libovolným adresářům, ale nikoli je spouštět nebo do nich zapisovat; a CAP_FOWNER
což procesu umožňuje provádět věci, které jsou obvykle vyhrazeny pouze pro vlastníka souboru, jako je změna bitů oprávnění a skupiny souborů.
Přepsání lepivého bitu v adresářích je zmíněno pouze pod CAP_FOWNER
, takže se zdá, že CAP_DAC_OVERRIDE
to by nestačilo ignorovat. (Dalo by vám to oprávnění k zápisu, ale obvykle je stejně máte v adresářích s lepivým obsahem a +t
omezuje to.)
(Myslím, že speciální zařízení se zde počítají jako "soubory". Alespoň generic_permission()
má pouze typovou kontrolu pro adresáře, ale mimo ni jsem to nekontroloval.)
Samozřejmě stále existují situace, kdy vám ani schopnosti nepomohou upravit soubory:
- některé soubory ve formátu
/proc
a/sys
, protože se ve skutečnosti nejedná o skutečné soubory - SELinux a další bezpečnostní moduly, které mohou omezovat root
chattr
neměnný+i
a připojit pouze+a
příznaky na ext2/ext3/ext4, které oba zastaví i root a zabrání také přejmenování souborů atd.- síťové souborové systémy, kde server může provádět vlastní řízení přístupu, např.
root_squash
v NFS mapuje root na nikoho - FUSE, o kterém předpokládám, že by mohl dělat cokoliv
- připojení pouze pro čtení
- zařízení pouze pro čtení
Přesně tak, jak jste si všimli u výchozích oprávnění:
-
Čtení a zápis:
Ve výchozím nastavení má uživatel root přístup k jakémukoli souboru v systému. Tento přístup můžete odebrat změnou atributů, jako je vysvětlení zde:chattr. To je pak spojeno se schopnostmi. -
Provést:
Uživatel root nemá oprávnění ke spuštění, pokud není nastaven alespoň jeden ze spouštěcích bitů.
myFile.txt
se získá pomocí chmod 000 myFile.txt
.
0 no permission
1 execute
2 write
3 execute + write
4 read
5 read + execute
6 read + write
7 all
---------
znamená, že neexistuje žádná oprávnění pro uživatele , skupinu a další.
Uživatel root má neomezené možnost upravit tento soubor. Čtení/zápis je povolen. Aby mohl uživatel root spustit tento soubor, musí jej přesto učinit spustitelným. (chmod 100, 010 nebo 001)