Helló mindenkinek. Aktívan belevágunk a munkába, és januárban sok izgalmas indulást tervezünk. Mások mellett bejelentettük egy újabb, mindenki által kedvelt kurzusra való jelentkezést. . Az indulás előtt hagyományosan megosztjuk egy hasznos anyag fordítását.

A fájlengedélyek biztonságos alternatívát kínálnak a SUID futtatható fájlok számára, de első pillantásra kissé zavarosnak tűnhetnek.
Mindannyian tudjuk, hogy a bináris fájlok a következők . Szerencsére, ha az alkalmazásának bizonyos korlátozott jogosultságokra van szüksége, van hatékonyabb módja is, amit .
időt spórolok Önnek, ha el szeretné kerülni a fenti cikk részletes olvasását: lényegében a fájlengedélyek lehetővé teszik azokat a folyamatokat, amelyek root felhasználó nevében futnak, és így joggal tesznek bármit, hogy fenntartsanak bizonyos képességeket, melyek korlátozottak , amikor visszaadják a jogosultságokat, és nem privilegizált felhasználóként indulnak. Ez azt jelenti, hogy ha egy támadónak sikerül kompromittálni egy folyamatot puffer túlfolyás vagy egyéb exploit révén, akkor nem tudja kihasználni más dolgot, mint azokat a minimális jogosultságokat, amelyek valóban szükségesek a folyamathoz.
A jogosultságok kiválóan alkalmasak olyan szolgáltatásokra, amelyeket általában mindig root felhasználó nevében indítanak el, de mi a helyzet a parancssori eszközökkel? Szerencsére ezek is támogatottak, feltéve, hogy a megfelelő eszközöket telepítette. Ha Ubuntu-t használ, szüksége lesz például a csomagra libcap2-bin. Emellett egy nem archaius kernelre is szüksége lesz (a verziótól kezdődően 2.6.24).
Ezek a funkciók lehetővé teszik a jogosultságok társítását a futtatható fájlokhoz, hasonlóan a SUID bit beállításához, de csak egy adott jogosultságkészlet esetén. A setcap eszközt használják jogosultságok hozzáadására és eltávolítására a fájlból.
Az első lépés a szükséges jogosultságok kiválasztása. Ebben a cikkben azt feltételezem, hogy van egy hálózati diagnosztikai eszköz, amelynek neve tracewalk, amelynek képesnek kell lennie arra, hogy használja . Általában ahhoz, hogy ez működjön, az alkalmazást root felhasználó nevében kell futtatni, de ha megnézzük , kiderül, hogy csak a következő jogosultságra van szükség: CAP_NET_RAW.
Feltéve, hogy annak a könyvtárnak a mappájában van, ahol a bináris fájl található, tracewalkhozzáadhatja ezt a jogosultságot a következő módon:
sudo setcap cap_net_raw=eip tracewalk Most hagyja figyelmen kívül a végződést =eip a jogosultságokkal kapcsolatban, erről pár másodperc múlva beszélek. Vegye figyelembe, hogy a jogosultság neve kisbetűs. Most ellenőrizheti, hogy helyesen állította-e be a jogosultságokat a következő parancs segítségével:
setcap -v cap_new_raw=eip tracewalkVagy listázhatja az összes jogosultságot, amelyet a megadott végrehajtható fájlhoz beállítottak:
getcap tracewalk
Tájékoztatásul, az összes jogosultság eltávolításához a végrehajtható fájlból a következő parancsot használhatja:
setcap -r tracewalkEzen a ponton képesnek kell lennie a végrehajtható fájl nem privilegizált felhasználóként történő futtatására, és lehetősége lesz nyers socket-ekkel dolgozni, de nem rendelkezik más privilegiumokkal, amelyeket a root felhasználó birtokol.
Tehát mit jelent ez a furcsa végződés? =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — hatékony, örökölt és engedélyezett (effective, inheritable és permitted):
- Hatékony (Effective) jogosultságok – ezek azok, amelyek meghatározzák, mit tehet a folyamat. Például nem tud nyers socket-ekkel foglalkozni, ha
CAP_NET_RAWnem található a hatékony készletben. - Engedélyezett (Permitted) jogosultságok – ezek azok, amelyeket a folyamatnak engedélyezett, ha azokat a megfelelő hívás során kéri. Nem engedik meg a folyamatnak, hogy valójában bármit is tegyen, hacsak nem írták kifejezetten arra, hogy kérje a megadott jogosultságot. Ez lehetővé teszi, hogy olyan folyamatokat írjanak, amelyek különösen fontos jogosultságokat adnak a hatékony készlethez csak akkor, amikor ténylegesen szükségük van rájuk.
- Örökölt (Inheritable) jogosultságok – ezek azok, amelyek örökölhetők a származó gyermekfolyamat elérhető készletében. A clone()
fork()vagyclone()hívásakor a gyermekfolyamat mindig megkapja a szülőfolyamat jogosultságait, mivel ekkor még mindig ugyanazt a végrehajtható fájlt futtatja. Az örökölt készletet használják, amikorexec()(vagy hasonló) hívás történik a végrehajtható fájl helyettesítésére egy másikkal. Ezen a ponton a folyamat elérhető készletét az örökölt készlet elfedi, hogy megkapja azt az elérhető készletet, amelyet az új folyamat használ.
Így a segédeszköz setcap lehetővé teszi számunkra, hogy függetlenül adjunk meg jogosultságokat e három halmaz számára a megadott végrehajtható fájlra. Vegye figyelembe, hogy a csoportok értéke kissé eltérően értelmeződik a fájlokhoz való hozzáférési jogok esetén:
- Elérhető a fájl jogosultságai – azok a jogosultságok, amelyek mindig elérhetők a végrehajtható fájl számára, még akkor is, ha a szülő folyamat, amely meghívta, nem rendelkezett velük. Eddig ezeket 'kényszerített' jogosultságoknak nevezték.
- Örökölt a fájl jogosultságai meghatározzák a kiegészítő maszkot, amely szintén felhasználható a jogosultságok eltávolítására a hívó folyamat halmazából. Ezek a hívó folyamat örökölt halmazához képest alkalmazandók, ezért a jogosultság csak akkor öröklődik, ha mindkét halmazban megtalálható.
- Hatékony a fájl jogosultságai valójában mindössze egy bitet jelentenek, nem halmazt, és ha be van állítva, ez azt jelenti, hogy a teljes elérhető halmaz szintén a kibővített halmazba kerül a új folyamat számára. Ez felhasználható olyan folyamatok jogosultságainak hozzáadására, amelyek nincsenek kifejezetten elrendelve azok kérésére. Mivel ez egy bit, ha bármely jogosultsághoz beállítja, akkor azt minden jogosultsághoz be kell állítani. Gondolkodhat róla mint örökölt bit, mert játékos jogosultságokat enged meg olyan alkalmazások számára, amelyek nem támogatják azokat.
A jogosultságok megadásakor setcap három betű e, i és p vonatkozik hatékony, örökölt és elérhető halmazokra vonatkozóan. Tehát egy korábbi specifikáció:
sudo setcap cap_net_raw=eip tracewalk ... azt jelzi, hogy a jogosultságot CAP_NET_RAW hozzá kell adni az elérhető és örökölt halmazokhoz, és hogy a hatékony bitnek is be kell állítva lennie. Ez felülírja a fájlban korábban beállított jogosultságokat. Ha egyszerre több jogosultságot szeretne beállítani, használjon listát vesszővel elválasztva:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkrészletesebben tárgyalja ezeket, de remélhetőleg ez a bejegyzés egy kicsit eloszlatta a felmerülő kérdéseket. Csak néhány figyelmeztetést és trükköt kell még említeni.
Először is, a fájl jogosultságai nem működnek szimbolikus linkekkel – ezeket magának a bináris fájlnak kell alkalmaznia (azaz a szimbolikus link céljára).
Másrészt nem működnek értelmezett szkriptekkel. Például, ha van egy Python szkripted, amelynek jogosultságot szeretnél adni, azt magának a Python értelmezőnek kell megadnod. Nyilvánvaló, hogy ez potenciális biztonsági probléma, mert így minden, ezzel az értelmezővel végrehajtott szkriptnak a megadott jogosultsága lesz, bár ez még mindig lényegesen jobb, mint SUID használata. A legelterjedtebb megoldás látszólag az, hogy írsz egy külön végrehajtható fájlt C-ben vagy hasonlón, amely elvégezheti a szükséges műveleteket és az szkripten belül meghívhatod. Ez hasonló megközelítést alkalmaz, mint a Wireshark, amely bináris fájlt használ. /usr/bin/dumpcap privilegierte Operationen végrehajtásához:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip Harmadszor, a fájlengedélyek kikapcsolódnak, ha környezeti változót használsz LD_LIBRARY_PATH biztonsági okokból(1). Ugyanez vonatkozik LD_PRELOAD, amennyire tudom.
1. Mivel a támadó nyilvánvalóan helyettesítheti az egyik standard könyvtárat és használhatja LD_LIBRARY_PATH, hogy a saját könyvtárát a rendszeré helyett előnyben részesítse, és így a saját tetszőleges kódját végrehajtsa ugyanazokkal a jogosultságokkal, mint a hívó alkalmazás.
Ezzel véget ért. A tanfolyam részleteiről a
Forrás: habr.com
