Lêertoestemmings in Linux

Hi almal. Ons begin aktief aan die werk en berei reeds baie kragtige bekendstellings in Januarie voor. Inskrywings is onder meer aangekondig vir 'n nuwe stroom van almal se gunsteling kursus. "Linux Administrateur". In afwagting van die bekendstelling deel ons tradisioneel vertalings van nuttige materiaal.

Lêertoestemmings in Linux

Lêertoestemmings bied 'n veilige alternatief vir SUID-uitvoerbare, maar kan aanvanklik 'n bietjie verwarrend lyk.


Ons weet almal dat binaries SUID is slegte besluit uit 'n veiligheidsoogpunt. Gelukkig, as jou aansoek 'n paar beperkte voorregte vereis, is daar 'n meer doeltreffende manier genoem lêertoestemmings.

Ek sal jou tyd spaar as jy wil vermy om die artikel hierbo in detail te lees: In wese laat lêertoestemmings prosesse toe wat as wortel loop en word dus toegelaat om iets te doen om sekere vermoëns te behou, beperk hierdie lyswanneer hulle voorregte laat vaar en deur 'n onbevoorregte gebruiker bestuur word. Dit beteken dat as 'n aanvaller dit regkry om 'n proses te kompromitteer deur 'n buffer-oorloop of ander ontginning te gebruik, sal hulle nie voordeel kan trek uit enigiets anders as sekere minimale voorregte wat die proses eintlik nodig het nie.

Toestemmings is ideaal vir dienste wat gewoonlik altyd as wortel loop, maar wat van opdragreëlhulpmiddels? Gelukkig word dit ook ondersteun mits jy die regte nutsprogramme geïnstalleer het. As jy Ubuntu gebruik, sal jy byvoorbeeld die pakket nodig hê libcap2-bin. Jy sal ook 'n nie-argaïese kern (van weergawe 2.6.24).

Hierdie funksies laat toe dat toestemmings geassosieer word met uitvoerbare lêers, soortgelyk aan die opstel van die SUID-bis, maar slegs vir 'n spesifieke stel toestemmings. Nut setcap gebruik om toestemmings van 'n lêer by te voeg en te verwyder.

Die eerste stap is om die toestemmings te kies wat u benodig. Ter wille van hierdie artikel, neem ek aan dat daar 'n netwerk diagnostiese hulpmiddel genoem word tracewalk, wat behoort te kan gebruik rou voetstukke. Dit vereis gewoonlik dat die toepassing as wortel uitgevoer word, maar wanneer dit gekyk word die lys dit blyk dat slegs toestemming nodig is CAP_NET_RAW.

Gestel jy is in die gids waar die binêre geleë is tracewalk, kan jy hierdie toestemming soos volg byvoeg:

sudo setcap cap_net_raw=eip tracewalk

Ignoreer die agtervoegsel vir eers =eip vir resolusie, sal ek oor 'n paar sekondes daaroor praat. Let daarop dat die toestemmingsnaam in kleinletters is. Jy kan nou kyk of jy toestemmings korrek opgestel het met:

setcap -v cap_new_raw=eip tracewalk

Of jy kan alle toestemmings wat vir 'n gegewe uitvoerbare bestand is, lys:

getcap tracewalk

Ter verwysing kan u ook alle toestemmings van die uitvoerbare lêer verwyder met:

setcap -r tracewalk

Op hierdie stadium behoort jy die uitvoerbare lêer as 'n onbevoorregte gebruiker te kan laat loop, en dit moet met rou voetstukke kan werk, maar nie enige van die ander voorregte hê wat die wortelgebruiker het nie.

So wat beteken hierdie vreemde agtervoegsel? =eip? Dit vereis 'n mate van begrip van die aard van toestemmings. Elke proses het drie stelle toestemmings - effektief, oorerflik en toegelaat:

  • Effektief Toestemmings is dié wat definieer wat 'n proses werklik kan doen. Byvoorbeeld, dit kan nie handel oor rou voetstukke as CAP_NET_RAW is nie in die effektiewe stel nie.
  • Beskikbaar toestemmings is dié wat 'n proses toegelaat word om te hê as dit hulle versoek deur die toepaslike oproep te gebruik. Hulle verhoed dat 'n proses iets doen tensy dit spesifiek geskryf is om genoemde toestemming te versoek. Dit laat toe dat prosesse geskryf word om kritieke toestemmings by die effektiewe stel te voeg slegs vir die tydperk wanneer dit werklik vereis word.
  • Oorerflik toestemmings is dié wat geërf kan word in die toeganklike stel van die ontstaande kind-proses. Tydens die operasie fork() of clone() die kinderproses kry altyd 'n kopie van die ouerproses se toestemmings aangesien dit steeds dieselfde uitvoerbare lêer op daardie stadium laat loop. 'n Oorerfbare stel word gebruik wanneer exec() (of ekwivalent) word opgeroep om die uitvoerbare lêer met 'n ander te vervang. Op hierdie stadium word die proses se beskikbare stel gemasker deur die oorerfbare stel om die toeganklike stel te verkry wat vir die nuwe proses gebruik sal word.

Dus die nut setcap laat ons toe om die toestemmings van hierdie drie stelle onafhanklik by te voeg vir 'n gegewe uitvoerbare. Let daarop dat die betekenis van groepe effens anders geïnterpreteer word vir lêertoestemmings:

  • Beskikbaar lêertoestemmings is dié wat altyd beskikbaar is vir 'n uitvoerbare lêer, selfs al het die ouerproses wat dit genoem het dit nie gehad nie. Hulle is vroeër “gedwonge” permitte genoem.
  • Geërf lêertoestemmings definieer 'n bykomende masker wat ook gebruik kan word om toestemmings van die oproepproses se stel te verwyder. Hulle is van toepassing bykomend tot die oproepproses se oorgeërfde stel, dus word die toestemming slegs geërf as dit in beide stelle bestaan.
  • Effektief lêertoestemmings is eintlik net 'n enkele bietjie, nie 'n stel nie, en as dit gestel is, beteken dit dat die hele beskikbare stel ook na die nuwe proses se effektiewe stel gekopieer word. Dit kan gebruik word om toestemmings by prosesse te voeg wat nie spesifiek geskryf is om dit aan te vra nie. Aangesien dit een bietjie is, as jy dit vir enige toestemming stel, moet dit vir alle toestemmings gestel word. Jy kan daaraan dink as 'n nalatenskapstuk, want dit word gebruik om toestemmings toe te laat om gebruik te word deur toepassings wat dit nie ondersteun nie.

Wanneer toestemmings gespesifiseer word via setcap drie letters e, i и p verwys na effektief, oorerflik en toeganklik stelle onderskeidelik. Dus, die vroeëre spesifikasie:

sudo setcap cap_net_raw=eip tracewalk

...dui aan dat die resolusie CAP_NET_RAW moet by die beskikbare en oorerfbare stelle gevoeg word en dat die effektiewe bis ook gestel moet word. Dit sal enige voorheen gestelde toestemmings op die lêer ignoreer. Gebruik 'n kommageskeide lys om veelvuldige toestemmings gelyktydig te stel:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Toestemmingsgids bespreek dit alles in meer besonderhede, maar hopelik het hierdie pos 'n bietjie gedemystifiseer wat aangaan. Daar is net 'n paar waarskuwings en truuks oor om op te noem.

Eerstens werk lêervermoëns nie met simlinks nie – jy moet dit op die binêre lêer self toepas (d.w.s. die teiken van die simlink).

Tweedens werk hulle nie met geïnterpreteerde skrifte nie. As jy byvoorbeeld 'n Python-skrip het waaraan jy toestemming wil toeken, moet jy dit aan die Python-tolk self toewys. Dit is duidelik dat dit 'n potensiële sekuriteitskwessie is, want dan sal alle skrifte wat met daardie tolk uitgevoer word die gespesifiseerde toestemming hê, hoewel dit steeds aansienlik beter is as om dit SUID te maak. Die algemeenste oplossing is blykbaar om 'n aparte uitvoerbare in C of ekwivalent te skryf wat die nodige bewerkings kan uitvoer en dit vanaf 'n skrif kan noem. Dit is soortgelyk aan die benadering wat Wireshark gebruik wat 'n binêre gebruik /usr/bin/dumpcap om bevoorregte operasies uit te voer:

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

Derdens word lêertoestemmings gedeaktiveer as jy 'n omgewingsveranderlike gebruik LD_LIBRARY_PATH om ooglopende sekuriteitsredes(1). Dieselfde geld vir LD_PRELOAD, so ver ek weet.

1. Aangesien 'n aanvaller natuurlik een van die standaard biblioteke kan vervang en gebruik LD_LIBRARY_PATHom sy biblioteek te dwing om eerder as die stelsel een geroep te word, en daarom sy eie arbitrêre kode te hê wat uitgevoer word met dieselfde voorregte as die oproeptoepassing.

Dis al. Meer besonderhede oor die kursusprogram kan gevind word by webinar, wat op 24 Januarie sal plaasvind.

Bron: will.com

Voeg 'n opmerking