Dozvole za datoteke u Linuxu

Zdravo svima. Aktivno ulazimo u posao i već pripremamo mnoga moćna lansiranja u januaru. Između ostalog, raspisan je upis za novi stream svima omiljenih kurseva. "Linux administrator". Ususret lansiranju, tradicionalno dijelimo prijevode korisnog materijala.

Dozvole za datoteke u Linuxu

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


Svi znamo da binarnosti JUG su loša odluka sa sigurnosne tačke gledišta. Srećom, ako vaša aplikacija zahtijeva neke ograničene privilegije, postoji efikasniji način koji se zove dozvole za fajlove.

Uštedjet ću vam malo vremena ako želite izbjeći detaljno čitanje gornjeg članka: U suštini, dozvole za fajl dozvoljavaju procese koji se pokreću kao root i stoga im je dozvoljeno da urade nešto da zadrže određene mogućnosti, ograničene ovu listukada odbace privilegije i pokreće ih neprivilegirani korisnik. To znači da ako napadač uspije kompromitirati proces korištenjem prekoračenja bafera ili drugog eksploatacije, neće moći iskoristiti ništa osim određenih minimalnih privilegija koje su procesu zapravo potrebne.

Dozvole su odlične za usluge koje obično uvijek rade kao root, ali šta je sa uslužnim programima komandne linije? 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čno jezgro (od verzije 2.6.24).

Ove funkcije dozvoljavaju da se dozvole pridruže izvršnim datotekama, slično postavljanju bita SUID, ali samo za određeni skup dozvola. Utility setcap koristi se za dodavanje i uklanjanje dozvola iz datoteke.

Prvi korak je odabir dozvola koje su vam potrebne. Za dobrobit ovog članka, pretpostavljam da postoji mrežni dijagnostički alat koji se zove tracewalk, koji bi trebao biti u mogućnosti koristiti sirove utičnice. Ovo obično zahtijeva da se aplikacija pokrene kao root, ali prilikom pregleda popis ispostavilo se da je potrebna samo dozvola CAP_NET_RAW.

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

sudo setcap cap_net_raw=eip tracewalk

Zanemarite sufiks za sada =eip radi rješenja, pričat ću o tome za par sekundi. Imajte na umu da je naziv dozvole napisan malim slovima. Sada možete provjeriti da li ste ispravno konfigurirali dozvole sa:

setcap -v cap_new_raw=eip tracewalk

Ili možete navesti sve dozvole postavljene za datu izvršnu datoteku:

getcap tracewalk

Za referencu, također možete ukloniti sve dozvole iz izvršnog fajla sa:

setcap -r tracewalk

U ovom trenutku, trebalo bi da budete u mogućnosti da pokrenete izvršni fajl kao neprivilegovani korisnik, i trebalo bi da bude u stanju da radi sa sirovim utičnicama, ali ne i da ima druge privilegije koje ima root korisnik.

Dakle, šta znači ovaj čudni sufiks? =eip? Ovo zahtijeva određeno razumijevanje prirode dozvola. Svaki proces ima tri seta dozvola − efektivno, nasledno i dozvoljeno:

  • Efektivno Dozvole su one koje definiraju šta proces zapravo može učiniti. Na primjer, ne može se baviti sirovim utičnicama if CAP_NET_RAW nije u efektivnom setu.
  • Dostupan dozvole su one koje procesu smije imati ako ih zatraži koristeći odgovarajući poziv. Oni sprečavaju proces da zaista uradi bilo šta osim ako nije posebno napisano da traži pomenutu dozvolu. Ovo omogućava da se napišu procesi za dodavanje kritičnih dozvola efektivnom skupu samo za period kada su one stvarno potrebne.
  • Nasljedno dozvole su one koje se mogu naslijediti u pristupačnom skupu pokrenutog podređenog procesa. Tokom operacije fork() ili clone() podređenom procesu uvijek se daje kopija dozvola nadređenog procesa jer u tom trenutku još uvijek pokreće istu izvršnu datoteku. Nasljedni skup se koristi kada exec() (ili ekvivalentno) se poziva da zameni izvršnu datoteku drugom. U ovom trenutku, dostupni skup procesa je maskiran naslijeđenim skupom kako bi se dobio pristupačni skup koji će se koristiti za novi proces.

Dakle, korisnost setcap omogućava nam da dodamo dozvole ova tri skupa nezavisno za datu izvršnu datoteku. Imajte na umu da se značenje grupa tumači malo drugačije za dozvole datoteka:

  • Dostupno Dozvole datoteke su one koje su uvijek dostupne izvršnoj datoteci, čak i ako ih roditeljski proces koji ju je pozvao nije imao. Nekada su se zvale „prinudne“ dozvole.
  • Naslijeđeno файловые разрешения определяют дополнительную маску, которая также может использоваться для удаления разрешений из набора вызывающего процесса. Они применяются в дополнение к наследуемому набору вызывающего процесса, поэтому разрешение наследуется только в том случае, если она существует в обоих наборах.
  • Efektivno dozvole za fajl su zapravo samo jedan bit, a ne skup, i ako su postavljene, to znači da se cijeli dostupni skup također kopira u efektivni skup novog procesa. Ovo se može koristiti za dodavanje dozvola procesima koji nisu posebno napisani da ih traže. Pošto je to jedan bit, ako ga postavite za bilo koju dozvolu, mora se postaviti za sve dozvole. Možete ga smatrati zastarjelim bitom jer se koristi za omogućavanje korištenja dozvola aplikacijama koje ih ne podržavaju.

Prilikom navođenja dozvola putem setcap tri slova e, i и p se odnose na efektivni, nasljedni i dostupni skupova respektivno. Dakle, ranija specifikacija:

sudo setcap cap_net_raw=eip tracewalk

...označava da je rezolucija CAP_NET_RAW mora biti dodat dostupnim i nasljednim skupovima i da se efektivni bit također mora postaviti. Ovo će nadjačati sve prethodno postavljene dozvole za datoteku. Da postavite više dozvola odjednom, koristite listu odvojenu zarezima:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

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

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

Drugo, ne rade sa interpretiranim skriptama. Na primjer, ako imate Python skriptu kojoj želite dodijeliti dozvolu, morate je dodijeliti samom Python tumaču. Očigledno je ovo potencijalni sigurnosni problem jer će tada sve skripte koje se izvršavaju s tim interpretatorom imati specificiranu dozvolu, iako je to ipak znatno bolje nego da bude SUID. Čini se da je najčešće zaobilazno rješenje pisanje zasebne izvršne datoteke u C ili ekvivalentu koja može izvršiti potrebne operacije i pozvati ga iz skripte. Ovo je slično pristupu koji koristi Wireshark koji koristi binarni sistem /usr/bin/dumpcap za obavljanje privilegovanih operacija:

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

Treće, dozvole za datoteke su onemogućene ako koristite varijablu okruženja LD_LIBRARY_PATH iz očiglednih sigurnosnih razloga(1). Isto važi i za LD_PRELOAD, koliko ja znam.

1. Pošto napadač očito može zamijeniti jednu od standardnih biblioteka i koristiti LD_LIBRARY_PATHda prisili svoju biblioteku da bude pozvana u odnosu na sistemsku, i stoga ima svoj proizvoljni kod koji se izvršava sa istim privilegijama kao i aplikacija koja poziva.

To je sve. Više detalja o programu kursa možete pronaći na webinar, koji će se održati 24. januara.

izvor: www.habr.com

Dodajte komentar