Fájlengedélyek Linux alatt

Sziasztok. Aktívan belekezdünk a munkába, és már sok erőteljes indítással készülünk januárban. Többek között beiratkozást hirdettek mindenki kedvenc tanfolyamának új folyamára. "Linux rendszergazda". Az indulásra várva hagyományosan hasznos anyagok fordításait osztjuk meg.

Fájlengedélyek Linux alatt

A fájlengedélyek biztonságos alternatívát kínálnak a SUID végrehajtható fájlok helyett, de elsőre kissé zavarónak tűnhetnek.


Mindannyian ismerjük ezeket a binárisokat SUID vannak biztonsági szempontból rossz döntés. Szerencsére, ha az alkalmazás korlátozott jogosultságokat igényel, van egy hatékonyabb módszer, az ún fájl engedélyek.

Megspórolok neked egy kis időt, ha nem szeretnéd elkerülni a fenti cikk részletes elolvasását: A fájljogosultságok lényegében olyan folyamatokat tesznek lehetővé, amelyek rootként futnak, és ezért tehetnek valamit bizonyos képességek megőrzése érdekében, korlátozottan ezt a listátamikor elveszítik a jogosultságokat, és egy nem jogosult felhasználó futtatja őket. Ez azt jelenti, hogy ha egy támadónak sikerül feltörnie egy folyamatot puffertúlcsordulás vagy más kizsákmányolás segítségével, akkor nem tud mást kihasználni, mint bizonyos minimális jogosultságokat, amelyekre a folyamatnak ténylegesen szüksége van.

Az engedélyek nagyszerűek azokhoz a szolgáltatásokhoz, amelyek általában mindig rootként futnak, de mi a helyzet a parancssori segédprogramokkal? Szerencsére ez is támogatott, feltéve, hogy telepítve vannak a megfelelő segédprogramok. Ha Ubuntut használsz, akkor például szükséged lesz a csomagra libcap2-bin. Ezenkívül egy nem archaikus kernelt is futtatnia kell (a verziótól 2.6.24).

Ezek a funkciók lehetővé teszik az engedélyek futtatható fájlokhoz való társítását, hasonlóan a SUID bit beállításához, de csak egy adott engedélykészlethez. Hasznosság setcap engedélyek hozzáadására és eltávolítására szolgál egy fájlból.

Az első lépés a szükséges engedélyek kiválasztása. A cikk kedvéért feltételezem, hogy létezik egy hálózati diagnosztikai eszköz, az úgynevezett tracewalk, amelyet tudni kell használni nyers foglalatok. Ehhez általában az alkalmazást rootként kell futtatni, de megtekintéskor a lista kiderül, hogy csak engedély kell CAP_NET_RAW.

Feltéve, hogy abban a könyvtárban van, ahol a bináris található tracewalk, ezt az engedélyt a következőképpen adhatja hozzá:

sudo setcap cap_net_raw=eip tracewalk

Az utótagot egyelőre figyelmen kívül hagyja =eip a megoldás érdekében pár másodperc múlva beszélek róla. Vegye figyelembe, hogy az engedély neve kisbetűvel van írva. Most ellenőrizheti, hogy megfelelően konfigurálta-e az engedélyeket:

setcap -v cap_new_raw=eip tracewalk

Vagy felsorolhatja az adott végrehajtható fájlhoz beállított összes engedélyt:

getcap tracewalk

Referencia kedvéért eltávolíthatja az összes engedélyt a végrehajtható fájlból:

setcap -r tracewalk

Ezen a ponton képesnek kell lennie arra, hogy a végrehajtható fájlt jogosulatlan felhasználóként tudja futtatni, és képesnek kell lennie a nyers socketekkel való működésre, de nem rendelkezik a root felhasználó egyéb jogosultságaival.

Tehát mit jelent ez a furcsa utótag? =eip? Ehhez meg kell érteni az engedélyek természetét. Minden folyamatnak három engedélykészlete van − hatékony, örökölhető és engedélyezett:

  • Hatékony Az engedélyek azok, amelyek meghatározzák, hogy egy folyamat valójában mit tehet. Például nem tud kezelni a nyers foglalatokat, ha CAP_NET_RAW nincs az effektív készletben.
  • Elérhető Az engedélyek azok, amelyekkel egy folyamat rendelkezhet, ha a megfelelő hívás segítségével kéri őket. Megakadályozzák, hogy egy folyamat ténylegesen bármit is csináljon, kivéve, ha kifejezetten az engedély kérésére írták. Ez lehetővé teszi a folyamatok írását, hogy kritikus jogosultságokat adjanak a hatályos halmazhoz csak arra az időszakra, amikor azokra ténylegesen szükség van.
  • Örökölhető Az engedélyek azok, amelyek örökölhetők a létrehozott gyermekfolyamat hozzáférhető halmazában. A műtét során fork() vagy clone() a gyermekfolyamat mindig megkapja a szülőfolyamat engedélyeinek másolatát, mivel az adott ponton még mindig ugyanazt a végrehajtható fájlt futtatja. Örökölhető halmazt használunk, ha exec() (vagy azzal egyenértékű) meghívásra kerül, hogy a végrehajtható fájlt lecserélje egy másikra. Ezen a ponton a folyamat elérhető halmazát az örökölhető halmaz maszkolja, hogy megkapja az új folyamathoz használt hozzáférhető halmazt.

Tehát a hasznosság setcap lehetővé teszi, hogy e három halmaz engedélyeit egymástól függetlenül adjuk hozzá egy adott végrehajtható fájlhoz. Vegye figyelembe, hogy a csoportok jelentése kissé eltérően értelmezhető a fájlengedélyeknél:

  • Elérhető A fájlengedélyek azok, amelyek mindig elérhetőek a végrehajtható fájl számára, még akkor is, ha az azt meghívó szülőfolyamat nem rendelkezett velük. Korábban „kényszerengedélyeknek” hívták őket.
  • Örökölt A fájljogosultságok további maszkot határoznak meg, amely a hívófolyamat készletéből való engedélyek eltávolítására is használható. A hívófolyamat örökölt halmaza mellett érvényesek, így az engedély csak akkor öröklődik, ha mindkét halmazban létezik.
  • Hatékony a fájlengedélyek valójában csak egy bit, nem egy halmaz, és ha be van állítva, az azt jelenti, hogy a teljes rendelkezésre álló halmaz is be lesz másolva az új folyamat tényleges halmazába. Ezzel olyan folyamatokhoz adhatunk engedélyeket, amelyek nem kifejezetten kérésre lettek írva. Mivel ez egybites, ha bármilyen jogosultságra beállítod, akkor minden engedélyre be kell állítani. Tekinthetjük örökölt bitnek, mert arra használják, hogy engedélyezzék az engedélyeket az azokat nem támogató alkalmazások számára.

Az engedélyek megadásakor keresztül setcap három betű e, i и p hivatkozni hatékony, örökölhető és hozzáférhető készletek ill. Tehát a korábbi specifikáció:

sudo setcap cap_net_raw=eip tracewalk

...jelzi, hogy a felbontás CAP_NET_RAW hozzá kell adni a rendelkezésre álló és örökölhető halmazokhoz, és az effektív bitet is be kell állítani. Ez felülír minden, a fájlra korábban beállított engedélyt. Ha egyszerre több engedélyt szeretne beállítani, használjon vesszővel elválasztott listát:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Engedélyezési útmutató részletesebben tárgyalja mindezt, de remélhetőleg ez a bejegyzés egy kicsit megmagyarázza, mi történik. Csak néhány figyelmeztetést és trükköt kell megemlíteni.

Először is, a fájlképességek nem működnek szimbolikus hivatkozásokkal – ezeket magára a bináris fájlra (vagyis a szimbolikus hivatkozás céljára) kell alkalmazni.

Másodszor, nem működnek értelmezett szkriptekkel. Ha például rendelkezik egy Python-szkripttel, amelyhez engedélyt szeretne rendelni, akkor azt magának a Python-értelmezésnek kell hozzárendelnie. Nyilvánvalóan ez egy potenciális biztonsági probléma, mert akkor az adott értelmezővel végrehajtott összes szkript megkapja a megadott engedélyt, bár ez még mindig lényegesen jobb, mint a SUID azonosítóvá tétele. A legáltalánosabb megoldásnak az tűnik, ha egy külön végrehajtható fájlt írunk C vagy azzal egyenértékű nyelven, amely képes végrehajtani a szükséges műveleteket, és meghívja azt egy parancsfájlból. Ez hasonló a Wireshark által használt megközelítéshez, amely binárist használ /usr/bin/dumpcap privilegizált műveletek elvégzéséhez:

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

Harmadszor, a fájlengedélyek le vannak tiltva, ha környezeti változót használ LD_LIBRARY_PATH nyilvánvaló biztonsági okokból(1). Ugyanez vonatkozik a LD_PRELOAD, tudomásom szerint.

1. Mivel a támadó nyilvánvalóan lecserélheti az egyik szabványos könyvtárat és használhatja LD_LIBRARY_PATHarra kényszeríti, hogy a könyvtárát a rendszerkönyvtár helyett hívják meg, és ezért saját tetszőleges kódot hajtson végre ugyanazokkal a jogosultságokkal, mint a hívó alkalmazás.

Ez minden. További részletek a tanfolyam programjáról a címen találhatók webináriumot, amelyre január 24-én kerül sor.

Forrás: will.com

Hozzászólás