Ahojte všetci. Aktívne sa zapájame do práce a už v januári pripravujeme veľa silných spustení. Medzi inými, bol vyhlásený nábor na nový beh obľúbeného kurzu . Pred spustením tradične zdieľame preklad užitočného materiálu.

Práva súborov poskytujú bezpečnejšiu alternatívu k vykonateľným súborom SUID, ale môžu sa na prvý pohľad zdať trochu zložité.
Všetci vieme, že binárne súbory sú . Našťastie, ak vaša aplikácia vyžaduje určité obmedzené oprávnenia, existuje efektívnejší spôsob, ktorý sa nazýva .
Ušetrím vám čas, ak sa chcete vyhnúť podrobnému prečítaniu vyššie uvedeného článku: v podstate, práva súborov umožňujú procesom, ktoré sú spúšťané menom používateľa root a tým pádom majú právo robiť čokoľvek, zachovať určité možnosti, obmedzené , keď zrušia oprávnenia a spúšťajú sa ako neprivilegovaný používateľ. To znamená, že ak sa útočníkovi podarí skompromitovať proces pomocou pretečenia vyrovnávacej pamäte alebo iného exploitu, nebude môcť využívať nič okrem určitých minimálnych právomocí, ktoré skutočne potrebujú proces.
Oprávnenia sú skvelé pre služby, ktoré sa zvyčajne vždy spúšťajú menom používateľa root, ale čo z príkazov? Našťastie, to je tiež podporované, ak máte nainštalované správne nástroje. Ak používate Ubuntu, budete potrebovať napríklad balík libcap2-bin. Taktiež budete musieť mať nainštalované nie archaické jadro (od verzie 2.6.24).
Tieto funkcie umožňujú viazať oprávnenia s vykonávacími súbormi podobne ako nastavenie SUID bitu, ale iba pre určitú množinu oprávnení. Nástroj setcap sa používa na pridávanie a odoberanie oprávnení zo súboru.
Prvý krok — vybrať požadované oprávnenia. Pre tento článok predpokladám, že existuje diagnostický nástroj siete, známy ako tracewalk, ktorý by mal mať možnosť používať . Obvykle je potrebné, aby aplikácia bežala menom používateľa root, ale po prezretí zistilo sa, že je potrebné iba povolenie CAP_NET_RAW.
Predpokladajme, že sa nachádzate v adresári, kde je binárny súbor tracewalk, môžete pridať toto povolenie nasledujúcim spôsobom:
sudo setcap cap_net_raw=eip tracewalk Zatiaľ ignorujte príponu =eip pre povolenie, o tom vám poviem o pár sekúnd. Všimnite si, že názov povolenia je malými písmenami. Teraz môžete skontrolovať, či ste správne nastavili povolenia, pomocou:
setcap -v cap_new_raw=eip tracewalkAlebo môžete získať zoznam všetkých povolení nastavených pre daný spustiteľný súbor:
getcap tracewalk
Pre informáciu, môžete tiež odstrániť všetky povolenia zo spustiteľného súboru pomocou:
setcap -r tracewalkV tomto štádiu by ste mali mať možnosť spustiť spustiteľný súbor ako neoprávnený používateľ, a mal by mať možnosť pracovať s surovými soketmi, ale nemal by mať žiadne ďalšie privilégia, ktoré má root používateľ.
Takže, čo znamená tento podivný sufix =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — efektívne, dedičné a dostupné (effective, inheritable a permitted):
- Efektívne (Effective) povolenia – to sú tie, ktoré určujú, čo proces môže skutočne robiť. Napríklad nemôže sa zaoberať surovými soketmi, ak
CAP_NET_RAWnie je v efektívnom súbore. - Dostupné (Permitted) povolenia – to sú tie, ktoré má proces povolené, ak ich požaduje pomocou príslušného volania. Nedovoľujú procesu skutočne nič robiť, pokiaľ nebol špeciálne naprogramovaný na požiadanie uvedeného povolenia. To umožňuje písať procesy na pridanie obzvlášť dôležitých povolení do efektívneho súboru len na dobu, kedy sú skutočne potrebné.
- Dedičné (Inheritable) povolenia – to sú tie, ktoré môžu byť zdedené v dostupnom súbore vytvoreného dcérskeho procesu. Počas operácie
fork()aleboclone()dcérskemu procesu je vždy daná kópia povolení rodičovského procesu, pretože v tomto okamihu stále vykonáva ten istý spustiteľný súbor. Dedičná súprava sa používa, keďexec()(alebo ekvivalent) je volaný na nahradenie spustiteľného súboru iným. V tomto štádiu je dostupná súprava procesu maskovaná dedičnou súpravou pre získanie dostupnej súpravy, ktorá sa bude používať pre nový proces.
Takže, nástroj setcap nám umožňuje nezávisle pridávať oprávnenia týchto troch súborov pre daný spustiteľný súbor. Všimnite si, že hodnota skupín sa interpretuje trochu inak pre prístupové práva k súborom:
- Dostupné súborové oprávnenia sú tie, ktoré sú vždy k dispozícii pre spustiteľný súbor, aj keď rodičovský proces, ktorý ho vyvolal, ich nemal. Predtým sa nazývali „nútené“ oprávnenia.
- Dedičné súborové oprávnenia určujú ďalšiu masku, ktorá sa môže tiež použiť na odobratie oprávnení zo sady vyvolávajúceho procesu. Používajú sa navyše k dedičnej sade vyvolávajúceho procesu, takže oprávnenie sa dedí iba vtedy, ak existuje v oboch sadách.
- Efektívne súborové oprávnenia sú v skutočnosti len jedným bitom, nie sadou, a ak je nastavený, znamená to, že celá dostupná sada sa tiež kopíruje do efektívnej sady nového procesu. Toto môže byť použité na pridanie oprávnení k procesom, ktoré neboli špeciálne napísané na ich požiadanie. Keďže ide o jeden bit, ak ho nastavíte pre akékoľvek oprávnenie, musí byť nastavený pre všetky oprávnenia. Môžete si na to myslieť ako na legát bit, pretože sa používa na povolenie použitia oprávnení pre aplikácie, ktoré ich nepodporujú.
Pri určení oprávnení prostredníctvom setcap troch písmen e, i a p sa týkajú efektívneho, dedičného a dostupného súborov. Takže skôr špecifikácia:
sudo setcap cap_net_raw=eip tracewalk … naznačuje, že oprávnenie CAP_NET_RAW má byť pridané k dostupným a dedičným súborom a že nastavený musí byť aj efektívny bit. To nahradí akékoľvek predtým nastavené oprávnenia v súbore. Ak chcete nastaviť viacero oprávnení naraz, použite zoznam oddelený čiarkou:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalksa podrobnejšie zaoberá všetkým týmto, ale dúfam, že tento príspevok trochu objasnil, čo sa deje. Zostáva spomenúť len niekoľko upozornení a trikov.
Po prvé, súborové schopnosti nefungujú so symbolickými odkazmi — musíte ich aplikovať na samotný binárny súbor (t.j. na cieľ symbolického odkazu).
Po druhé, nepracujú s interpretovanými skriptami. Napríklad, ak máte skript Python, ktorému chcete priradiť povolenia, musíte ich priradiť samotnému interpretu Python. Je zrejmé, že to predstavuje potenciálny bezpečnostný problém, pretože všetky skripty vykonávané s týmto interpretom budú mať priradené uvedené povolenia, hoci je to stále výrazne lepšie ako zabezpečiť SUID. Najbežnejším obchádzacím riešením je zjavne napísať samostatný spustiteľný súbor v C alebo jeho analógu, ktorý môže vykonávať potrebné operácie a vyvolať ho z skriptu. To je podobné prístupu, ktorý používa Wireshark, ktorý využíva binárny súbor. /usr/bin/dumpcap na vykonávanie privilegovaných operácií:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip Po tretie, povolenia súborov sa deaktivujú, ak používate premennú prostredia LD_LIBRARY_PATH z pochopiteľných bezpečnostných dôvodov(1). To isté platí aj pre LD_PRELOAD, pokiaľ viem.
1. Pretože útočník môže zjavne podvádzať jednu zo štandardných knižníc a používať LD_LIBRARY_PATH, aby donútil svoju knižnicu byť vyvolaná pred systémovou, a teda mať svoj vlastný ľubovoľný kód vykonávaný s tými istými privilégiami ako vyvolávajúca aplikácia.
Na tomto mieste je všetko. Podrobnosti o kurze sa budú dať získať na
Zdroj: habr.com
