Dozvole za datoteke u Linuxu

Bok svima. Aktivno smo krenuli s radom i već pripremamo mnoga snažna lansiranja u siječnju. Među ostalim, objavljeni su i upisi za novi stream svima omiljenog tečaja. "Linux administrator". U iščekivanju lansiranja, tradicionalno dijelimo prijevode korisnog materijala.

Dozvole za datoteke u Linuxu

Dozvole za datoteke nude sigurnu alternativu SUID izvršnim datotekama, ali u početku mogu djelovati malo zbunjujuće.


Svi znamo da binarne datoteke SUID su loša odluka sa sigurnosnog stajališta. Srećom, ako vaša aplikacija zahtijeva neke ograničene privilegije, postoji učinkovitiji način tzv dopuštenja za datoteke.

Uštedjet ću vam malo vremena ako želite izbjeći detaljno čitanje gornjeg članka: U suštini, dozvole za datoteke dopuštaju procese koji se izvode kao root i stoga im je dopušteno učiniti nešto kako bi zadržali određene mogućnosti, ograničene ovaj popiskada ispuštaju privilegije i pokreće ih neprivilegirani korisnik. To znači da ako napadač uspije kompromitirati proces korištenjem prekoračenja međuspremnika ili drugog iskorištavanja, neće moći iskoristiti ništa osim određenih minimalnih privilegija koje proces zapravo treba.

Dopuštenja su izvrsna za usluge koje obično uvijek rade kao root, ali što je s uslužnim programima naredbenog retka? Srećom, ovo je također podržano pod uvjetom da imate instalirane odgovarajuće uslužne programe. Ako koristite Ubuntu, trebat će vam, na primjer, paket libcap2-bin. Također ćete morati pokrenuti ne-arhaični kernel (od verzije 2.6.24).

Ove funkcije dopuštaju da se dopuštenja povezuju s izvršnim datotekama, slično postavljanju SUID bita, ali samo za određeni skup dopuštenja. Korisnost setcap koristi se za dodavanje i uklanjanje dopuštenja iz datoteke.

Prvi korak je odabir dopuštenja koja su vam potrebna. Za potrebe ovog članka, pretpostavljam da postoji mrežni dijagnostički alat pod nazivom tracewalk, koji bi se trebao znati koristiti sirove utičnice. To obično zahtijeva pokretanje aplikacije kao root, ali prilikom pregledavanja popis ispada da je potrebno samo dopuštenje CAP_NET_RAW.

Pod pretpostavkom da ste u direktoriju u kojem se nalazi binarna datoteka tracewalk, ovu dozvolu možete dodati ovako:

sudo setcap cap_net_raw=eip tracewalk

Za sada zanemarite sufiks =eip za rješenje, govorit ću o tome za nekoliko sekundi. Imajte na umu da je naziv dopuštenja napisan malim slovima. Sada možete provjeriti jeste li ispravno konfigurirali dopuštenja pomoću:

setcap -v cap_new_raw=eip tracewalk

Ili možete navesti sva dopuštenja postavljena za određenu izvršnu datoteku:

getcap tracewalk

Za referencu, također možete ukloniti sva dopuštenja iz izvršne datoteke pomoću:

setcap -r tracewalk

U ovom trenutku, trebali biste moći pokrenuti izvršnu datoteku kao neprivilegirani korisnik, i ona bi trebala moći raditi s neobrađenim utičnicama, ali ne bi imala druge privilegije koje ima root korisnik.

Dakle, što znači ovaj čudni sufiks? =eip? To zahtijeva određeno razumijevanje prirode dopuštenja. Svaki proces ima tri skupa dopuštenja − djelotvoran, nasljediv i dopušten:

  • Učinkovito Dozvole su one koje definiraju što proces zapravo može učiniti. Na primjer, ne može se nositi s neobrađenim utičnicama ako CAP_NET_RAW nije u efektivnom skupu.
  • Dostupno dozvole su one koje proces smije imati ako ih zatraži pomoću odgovarajućeg poziva. Oni sprječavaju proces da zapravo učini bilo što osim ako nije posebno napisano da traži navedeno dopuštenje. To omogućuje pisanje procesa za dodavanje kritičnih dozvola efektivnom skupu samo za razdoblje kada su stvarno potrebne.
  • Nasljedna dozvole su one koje se mogu naslijediti u dostupnom skupu stvorenog procesa djeteta. Tijekom operacije fork() ili clone() podređeni proces uvijek dobiva kopiju dopuštenja nadređenog procesa budući da u tom trenutku još uvijek izvodi istu izvršnu datoteku. Nasljedni skup se koristi kada exec() (ili ekvivalent) poziva se da zamijeni izvršnu datoteku drugom. U ovoj točki, dostupni skup procesa maskiran je naslijeđenim skupom kako bi se dobio dostupni skup koji će se koristiti za novi proces.

Dakle, korisnost setcap omogućuje nam dodavanje dopuštenja ova tri skupa neovisno za danu izvršnu datoteku. Imajte na umu da se značenje grupa tumači malo drugačije za dopuštenja datoteka:

  • dostupan dozvole za datoteke su one koje su uvijek dostupne izvršnoj datoteci, čak i ako ih roditeljski proces koji ju je pozvao nije imao. Prije su se zvale "prisilne" dozvole.
  • Naslijeđeno dopuštenja za datoteke definiraju dodatnu masku koja se također može koristiti za uklanjanje dopuštenja iz skupa procesa pozivanja. Primjenjuju se uz naslijeđeni skup pozivajućeg procesa, tako da se dopuštenje nasljeđuje samo ako postoji u oba skupa.
  • Učinkovito dopuštenja za datoteke zapravo su samo jedan bit, a ne skup, a ako su postavljena, to znači da se cijeli dostupni skup također kopira u efektivni skup novog procesa. Ovo se može koristiti za dodavanje dopuštenja procesima koji nisu posebno napisani da ih zahtijevaju. Budući da je to jedan bit, ako ga postavite za bilo koje dopuštenje, mora biti postavljeno za sve dopuštenja. Možete ga smatrati naslijeđenim dijelom jer se koristi za dopuštanje korištenja dozvola aplikacijama koje ih ne podržavaju.

Prilikom određivanja dopuštenja putem setcap tri slova e, i и p pozivati ​​se na učinkovit, nasljediv i dostupan postavlja odnosno. Dakle, ranija specifikacija:

sudo setcap cap_net_raw=eip tracewalk

...označava da je rezolucija CAP_NET_RAW mora biti dodan dostupnim i naslijeđenim skupovima i da efektivni bit također mora biti postavljen. Ovo će nadjačati sva prethodno postavljena dopuštenja za datoteku. Za postavljanje više dopuštenja odjednom koristite popis odvojen zarezima:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Vodič za dopuštenja raspravlja o svemu ovome detaljnije, ali nadamo se da je ovaj post malo demistificirao što se događa. Ostalo je spomenuti samo nekoliko upozorenja i trikova.

Prvo, mogućnosti datoteke ne rade sa simboličkim vezama - morate ih primijeniti na samu binarnu datoteku (tj. cilj simboličke veze).

Drugo, oni ne rade s interpretiranim skriptama. Na primjer, ako imate Python skriptu kojoj želite dodijeliti dopuštenje, morate je dodijeliti samom Python tumaču. Očito je ovo potencijalni sigurnosni problem jer će tada sve skripte koje se izvode s tim tumačem imati navedeno dopuštenje, iako je to još uvijek znatno bolje nego da bude SUID. Čini se da je najčešće zaobilazno rješenje pisanje zasebne izvršne datoteke u C-u ili ekvivalentu koji može izvesti potrebne operacije i pozvati je iz skripte. Ovo je slično pristupu koji koristi Wireshark koji koristi binarni zapis /usr/bin/dumpcap za obavljanje privilegiranih operacija:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

Treće, dopuštenja za datoteke su onemogućena ako koristite varijablu okruženja LD_LIBRARY_PATH iz očitih sigurnosnih razloga(1). Isto vrijedi i za LD_PRELOAD, koliko ja znam.

1. Budući da napadač očito može zamijeniti jednu od standardnih biblioteka i koristiti LD_LIBRARY_PATHda prisili svoju biblioteku da bude pozvana umjesto one sistemske, i stoga ima vlastiti proizvoljni kod koji se izvršava s istim privilegijama kao i pozivna aplikacija.

To je sve. Više detalja o programu tečaja možete pronaći na webinar koji će se održati 24.

Izvor: www.habr.com

Dodajte komentar