Povolenia súborov v systéme Linux

Ahojte všetci. Aktívne sa púšťame do práce a už v januári pripravujeme veľa výkonných spustení. Okrem iného bol ohlásený zápis do nového streamu obľúbeného kurzu všetkých. "Správca Linuxu". V očakávaní spustenia už tradične zdieľame preklady užitočného materiálu.

Povolenia súborov v systéme Linux

Povolenia súborov ponúkajú bezpečnú alternatívu k spustiteľným súborom SUID, ale na prvý pohľad sa môžu zdať trochu mätúce.


Všetci vieme, že dvojhviezdy Suidzlé rozhodnutie z bezpečnostného hľadiska. Našťastie, ak vaša aplikácia vyžaduje nejaké obmedzené privilégiá, existuje efektívnejší spôsob tzv povolenia súborov.

Ušetrím vám čas, ak sa chcete vyhnúť podrobnému čítaniu vyššie uvedeného článku: Povolenia súborov v podstate umožňujú procesy, ktoré bežia ako root, a preto môžu robiť niečo, aby si zachovali určité schopnosti, obmedzené tento zoznamkeď zrušia privilégiá a sú spustené neprivilegovaným používateľom. To znamená, že ak sa útočníkovi podarí kompromitovať proces pomocou pretečenia vyrovnávacej pamäte alebo iného exploitu, nebude môcť využiť nič iné ako určité minimálne privilégiá, ktoré proces skutočne potrebuje.

Povolenia sú skvelé pre služby, ktoré sa zvyčajne vždy spúšťajú ako root, ale čo nástroje príkazového riadku? Našťastie je to podporované za predpokladu, že máte nainštalované správne nástroje. Ak používate Ubuntu, budete potrebovať napríklad balík libcap2-bin. Budete tiež musieť spustiť nearchaické jadro (od verzie 2.6.24).

Tieto funkcie umožňujú priradiť oprávnenia k spustiteľným súborom, podobne ako nastavenie bitu SUID, ale len pre konkrétnu množinu oprávnení. Utility setcap používa sa na pridávanie a odstraňovanie povolení zo súboru.

Prvým krokom je vybrať potrebné povolenia. V záujme tohto článku predpokladám, že existuje nástroj na diagnostiku siete tzv tracewalk, ktorý by mal byť schopný používať surové zásuvky. To zvyčajne vyžaduje, aby bola aplikácia spustená ako root, ale pri prezeraní zoznam ukazuje sa, že je potrebné iba povolenie CAP_NET_RAW.

Za predpokladu, že ste v adresári, kde sa nachádza binárny súbor tracewalk, toto povolenie môžete pridať takto:

sudo setcap cap_net_raw=eip tracewalk

Príponu zatiaľ ignorujte =eip pre vyriešenie, o tom budem hovoriť za pár sekúnd. Všimnite si, že názov povolenia je napísaný malými písmenami. Teraz môžete skontrolovať, či ste správne nakonfigurovali povolenia pomocou:

setcap -v cap_new_raw=eip tracewalk

Alebo môžete uviesť všetky povolenia nastavené pre daný spustiteľný súbor:

getcap tracewalk

Pre referenciu môžete tiež odstrániť všetky povolenia zo spustiteľného súboru pomocou:

setcap -r tracewalk

V tomto bode by ste mali byť schopní spustiť spustiteľný súbor ako neprivilegovaný používateľ a mal by byť schopný pracovať s raw soketmi, ale nemal by mať žiadne iné privilégiá, ktoré má užívateľ root.

Čo teda znamená táto zvláštna prípona? =eip? To si vyžaduje určité pochopenie povahy povolení. Každý proces má tri sady povolení − účinné, dedičné a povolené:

  • Efektívne Povolenia sú tie, ktoré definujú, čo môže proces skutočne robiť. Nevie si napríklad poradiť so surovými zásuvkami if CAP_NET_RAW nie je v efektívnom súbore.
  • Dostupné oprávnenia sú tie, ktoré môže mať proces, ak si ich vyžiada pomocou príslušného volania. Zabraňujú procesu, aby skutočne robil čokoľvek, pokiaľ to nebolo špecificky napísané na vyžiadanie uvedeného povolenia. To umožňuje zapisovať procesy tak, aby pridali kritické oprávnenia do efektívnej množiny len na obdobie, kedy sú skutočne potrebné.
  • Dedičné oprávnenia sú tie, ktoré možno zdediť v dostupnej množine vytvoreného podriadeného procesu. Počas operácie fork() alebo clone() podriadený proces vždy dostane kópiu povolení nadradeného procesu, pretože v tomto bode stále beží rovnaký spustiteľný súbor. Dedičná množina sa používa, keď exec() (alebo ekvivalent) sa volá, aby nahradil spustiteľný súbor iným. V tomto bode je dostupná množina procesu maskovaná dedičnou množinou, aby sa získala dostupná množina, ktorá sa použije pre nový proces.

Takže užitočnosť setcap nám umožňuje pridať povolenia týchto troch sád nezávisle pre daný spustiteľný súbor. Všimnite si, že význam skupín sa pre povolenia súborov interpretuje trochu inak:

  • k dispozícii oprávnenia súborov sú tie, ktoré sú vždy dostupné pre spustiteľný súbor, aj keď ich nadradený proces, ktorý ho volal, ich nemal. Kedysi sa im hovorilo „nútené“ povolenia.
  • Zdedené povolenia súboru definujú ďalšiu masku, ktorú možno použiť aj na odstránenie povolení zo sady volajúceho procesu. Aplikujú sa navyše k zdedenej množine volajúceho procesu, takže povolenie sa zdedí iba vtedy, ak existuje v oboch množinách.
  • Efektívne oprávnenia súboru sú v skutočnosti len jeden bit, nie množina, a ak sú nastavené, znamená to, že celá dostupná množina sa skopíruje aj do efektívnej množiny nového procesu. Toto je možné použiť na pridanie oprávnení k procesom, ktoré neboli špecificky napísané na ich vyžiadanie. Keďže je to jeden bit, ak ho nastavíte pre akékoľvek povolenie, musí byť nastavené pre všetky povolenia. Môžete si to predstaviť ako starý bit, pretože sa používa na to, aby povolenia mohli používať aplikácie, ktoré ich nepodporujú.

Pri zadávaní povolení cez setcap tri písmená e, i и p týkajú sa efektívne, dedičné a prístupné sady resp. Takže skoršia špecifikácia:

sudo setcap cap_net_raw=eip tracewalk

...označuje, že uznesenie CAP_NET_RAW musí byť pridaný k dostupným a dedičným množinám a že musí byť nastavený aj efektívny bit. Tým sa prepíšu všetky predtým nastavené povolenia pre súbor. Ak chcete nastaviť viacero povolení naraz, použite zoznam oddelený čiarkami:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Sprievodca povoleniami rozoberá to všetko podrobnejšie, ale dúfam, že tento príspevok trochu demystifikoval, čo sa deje. Zostáva spomenúť len niekoľko upozornení a trikov.

Po prvé, možnosti súborov nefungujú so symbolickými odkazmi – musíte ich použiť na samotný binárny súbor (t. j. na cieľ symbolického odkazu).

Po druhé, nepracujú s interpretovanými skriptami. Ak máte napríklad skript Python, ktorému chcete prideliť povolenie, musíte ho priradiť samotnému interpretu jazyka Python. Je zrejmé, že ide o potenciálny bezpečnostný problém, pretože potom budú mať všetky skripty spustené týmto tlmočníkom špecifikované oprávnenie, aj keď je to stále podstatne lepšie, ako urobiť z neho SUID. Zdá sa, že najbežnejším riešením je napísať samostatný spustiteľný súbor v jazyku C alebo ekvivalent, ktorý dokáže vykonávať potrebné operácie a volať ho zo skriptu. Toto je podobné prístupu, ktorý používa Wireshark, ktorý používa binárny kód /usr/bin/dumpcap vykonávať privilegované operácie:

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

Po tretie, ak používate premennú prostredia, povolenia k súborom sú zakázané LD_LIBRARY_PATH zo zrejmých bezpečnostných dôvodov(1). To isté platí pre LD_PRELOAD, pokiaľ viem.

1. Keďže útočník môže samozrejme nahradiť jednu zo štandardných knižníc a použiť LD_LIBRARY_PATHvynútiť, aby bola jeho knižnica volaná prednostne pred systémovou, a preto má svoj vlastný ľubovoľný kód spustený s rovnakými privilégiami ako volajúca aplikácia.

To je všetko. Bližšie informácie o programe kurzu nájdete na webinár, ktorý sa uskutoční 24. januára.

Zdroj: hab.com

Pridať komentár