Hogyan használjam a capsh-t: Privilegizált pinget próbálok futtatni, minimális képességekkel
On február 13, 2021 by adminKépességekkel kísérletezem Debian Gnu / Linux rendszeren.
A / bin / ping fájlt átmásoltam a jelenlegi munkakönyvtáramba. Ahogy az várható volt, nem működik, eredetileg a setuid root volt.
Ezután megadom a ping-nek a minimális képességeket (nem a root) azáltal, hogy sudo /sbin/setcap cap_net_raw=ep ./ping
-t csinálok, és a pinget a várakozásoknak megfelelően működik.
Ezután sudo /sbin/setcap -r ./ping
visszavonja ezt a képességet. Most nem a várt módon működik.
Most megpróbálom a pinget működtetni a capsh
használatával.
capsh
nincsenek jogosultságai, ezért rootként kell futtatnom, de utána el kell dobnom a rootot és így az összes többi privilégiumok.
Azt hiszem, nekem is szükségem van a secure-keep-caps
-re, ez nincs dokumentálva a capsh
fájlban, de a képességben van kézikönyv. A bitszámokat a következőből kaptam: /usr/include/linux/securebits.h
. Helyesnek tűnnek, mivel a --print
kimenete ezeket a biteket helyesnek mutatja.
Órák óta babrálok, eddig ez van.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Azonban ping
hibák vannak ping: icmp open socket: Operation not permitted
, ez történik, ha nincs meg a képessége. A --print
is megmutatja a Current: =p cap_net_raw+i
elemeket, ez nem elég, ha szükségünk van e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
a képességet Current: = cap_net_raw+eip
értékre állítja, ez helyes, de root
.
Edit-1
Most megpróbáltam sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Ez a következőket eredményezi:
touch: cannot touch `zz": Permission denied ping: icmp open socket: Operation not permitted
Az első hiba várhatóan secure-noroot: yes
, de a második nem Current: = cap_net_raw+eip
Edit-2
Ha a ==
-t a --print
elé teszem, akkor most a Current: = cap_net_raw+i
elemet mutatja, tehát ez megmagyarázza az előző hibát, de nem azt, hogy miért veszítjük el a képességet a gyökérből való váltáskor, bár a secure-keep-caps
javítsa ki.
Edit-3
Amit látok, elveszítem az Effective (e) és az Engedélyezett (p) parancsokat, amikor az exec meghívásra kerül. Ez várható, de úgy gondoltam, hogy a biztonságos tartású sapkáknak meg kellene akadályozniuk, hogy elveszjenek. Hiányzik valami.
Edit-4
Több kutatást végeztem, és újra elolvastam a kézikönyvet. Úgy tűnik, hogy általában e
és p
képességek elvesznek, ha: a root
felhasználóról váltasz (vagy alkalmazza az secure-noroot
alkalmazást, ezáltal a root normál felhasználóvá válik), ez felülírható a secure-keep-caps
paranccsal; amikor felhívja a exec
számot, amennyire meg tudom állapítani, ez invariáns.
Amennyire meg tudom mondani, a kézikönyv szerint működik. Amennyire meg tudom mondani, nincs semmi hasznos eszköz a capsh
használatával. Amennyire meg tudom mondani, a szükséges képességek használatához: használjon fájl képességeket, vagy rendelkezzen olyan képességeket ismerő programmal, amely nem használja a exec
parancsot. Ezért nincs privilegizált csomagoló.
Tehát most az a kérdésem, hogy mi hiányzik, mire való a capsh
.
Edit-5
Hozzáadtam egy választ a környezeti képességekre. Lehet, hogy a capsh
örökölt képességekkel is használható, de a hasznosság érdekében ezeket be kell állítani a futtatható fájlban. Nem látom, hogy a capsh bármi hasznosat tud-e tenni a környezeti képességek nélkül, vagy hogy engedélyezze-e az öröklődő képességeket.
Verziók:
-
capsh
alibcap2-bin
verzió1:2.22-1.2
- edit-3 előtt megfogtam a legújabb
capsh
git://git.debian.org/collab-maint/libcap2.git
és elkezdte használni. -
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
A felhasználói terület 32 bites.
Megjegyzések
Válasz
A képességek a folyamatok tulajdonságai. Hagyományosan három készlet van:
- Megengedett képességek ( p ): képességek, amelyek “aktiválva” az aktuális folyamatban.
- Hatékony képességek ( e ): jelenleg használható képességek a jelenlegi folyamatban.
- Örökölhető képességek ( i ): az öröklődő fájlok képességei.
A gyökérként futtatott programok mindig teljes mértékben engedélyezett és hatékony képességekkel rendelkeznek, így a további képességek “hozzáadásának” nincs észrevehető hatása. (Az örökölhető képességkészlet általában üres.) Az setcap cap_net_raw+ep ping
beállítással alapértelmezés szerint engedélyezi ezeket a képességeket minden, a programot futtató felhasználó számára.
Sajnos ezek a képességek a végrehajtott fájlt, és az új gyermek folyamat végrehajtása után nem marad meg. A Linux 4.3 bevezette az Környezeti képességeket , amelyek lehetővé teszik a képességek öröklődését a gyermekfolyamatok által. (Lásd még: A képességek átalakítása az execve () során a képességekben (7) .)
Játék közben képességeket, vegye figyelembe ezeket a buktatókat:
- Amikor a felhasználót root-ról nem root-ra cseréli, a hatékony és engedélyezett képességek törlődnek (lásd: A felhasználói azonosítóval kapcsolatos változtatások hatása a képességekre a képességekben (7) ). A halmazok törlésének elkerülése érdekében használhatja a
capsh
--keep=1
opciót. - A környezeti képességkészlet törlődik, amikor a felhasználói vagy csoportazonosítók megváltoztatása. Megoldás: adja hozzá a környezeti képességeket a felhasználói azonosító megváltoztatása után , de egy gyermek folyamat végrehajtása előtt .
- Képesség csak a környezeti képességekhez adható hozzá set, ha már benne van az engedélyezett és az örökölhető képességekben.
A libcap 2.26 óta a capsh
program lehetőséget kapott a környezeti képességek módosítására. olyan opciók révén, mint a --addamb
( elkötelezettség ). Vegye figyelembe, hogy az opciók sorrendje jelentős. Példa használatra:
sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \ --keep=1 --user=nobody --addamb=cap_net_raw -- \ -c "./ping -c1 127.0.0.1"
Tipp: A --print
beállítást bárhová felveheti a capsh
parancssort, és nézze meg a jelenlegi képességek állapotát.
Megjegyzés: cap_setpcap
szükséges a --addamb
míg cap_setuid,cap_setgid
szükséges a --user
opcióhoz.
Megjegyzések
- Azóta a libcap melyik verziószámának van capsh –addamb? A 2.32 kiadási megjegyzések megemlítették az új capsh funkciókat, de a szavak homályosak voltak.
- @ 把 友情 留 在 无 盐 A válasz eredeti írásakor csak a git master támogatta. Azóta megjelent a libcap 2.26 a
--addamb
opció támogatásával. Ennek megfelelően frissítettem a választ. - Sajnos ezek a képességek a végrehajtott fájlhoz vannak kötve, és egy új gyermek folyamat végrehajtása után nem maradnak meg. – gyermek folyamat Én általában a
fork(2)
-re gondolok, amely valóban örökli a képességeket. Csakexecve(2)
nem örökli a képességeket, de nem hoz létre gyereket ‘ folyamat. Tévedek? - Idézem a következőt:
man capabiltiies
: Afork(2)
útján létrehozott gyermek örökli a szülő másolatait ‘ s képességkészletek.
Válasz
Lekensteyn válasza pontosnak és teljesnek tűnik, de megpróbálok egy másik magyarázatot adni egy másik szögből, amely megpróbálja hangsúlyozni azt a problémát, amelyet a beállított környezeti képességek megoldanak.
Amikor futtatja sudo capsh --user=<some_user> --
2 olyan rendszerhívás szól, amely a képességek újraszámítását (és esetleges elvetését) okozza:
-
setuid
:man capabilities
:
SECBIT_KEEP_CAPS A jelző beállítása lehetővé teszi egy vagy több 0 UID-t tartalmazó szálat. megtartani képességeit, amikor az összes UID-jét nem nulla értékre kapcsolja. Ha ez a jelző nincs beállítva, akkor egy ilyen UID-kapcsoló miatt a szál elveszíti az összes képességét.
Más szavakkal, a fenti capsh
parancsban meg kell győződnünk arról, hogy a SEC_BIT_KEEP_CAPS beállítást a setuid
rendszerhívás. Ellenkező esetben minden képesség elvész. Ezt teszi a --keep=1
. Tehát most a parancs sudo capsh --user=<some_user> --keep=1 --
-
execve
lesz: Ha használja a--keep=1
beállítást, az összes (hatékony, engedélyezett, örökölhető) képességkészlet megmarad aexecve
rendszerhívás, azonban aexecve
miatt a képességek újraszámításra kerülnek (nem root felhasználók számára is), és nem annyira nyilvánvaló módon.Röviden: a szett környezeti képességeinek hozzáadása előtt, hogy egy szál “s” engedélyezett legyen beállítva egyexecve
hívás után, vagy:- A fájlnak meg kell adnia ezt a képességet az “engedélyezett” halmazban . Ez A
setcap cap_net_raw+p /bin/bash
paranccsal végezhető el. Ezzel az egész gyakorlat használhatatlanná válik, mivel a szál képességkészleteinek (a határoló halmazon kívül) már nincs hatása. Gondolhatja, hogy asetcap cap_net_raw+i
megcsinálná a trükköt, de kiderült, hogy aexecve
miatt egy szál öröklhető engedélyei elesnek, egy kiváltságtalan felhasználó (aminek jelenleg köszönhetjük asetuid
-et). Tehát nincs mód kielégíteni ezt a feltételt kiváltságtalan felhasználóként.
- A fájlnak meg kell adnia ezt a képességet az “engedélyezett” halmazban . Ez A
A Linux 4.3-ban bevezetett környezeti képességek lehetővé teszik, hogy a szál megőrizze képességeit még setuid
után is egy kiváltságos felhasználóhoz, amelyet egy , anélkül, hogy a fájlok képességeire kellene támaszkodnia.
Válasz
Lehet, hogy van egy hiba / szolgáltatás a kernelben. Volt némi vita:
- https://bugzilla.altlinux.org/show_bug.cgi?id=16694
- http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-03/5224.html
Fogalmam sincs, ha valami történt d az egyik, hogy kijavítsam.
Ne érts félre – a jelenlegi viselkedés biztonságos. De annyira biztonságos, hogy akadályozza azokat a dolgokat, amelyeknek működniük kell.
Szerkesztés: http://man7.org/linux/man-pages/man7/capabilities.7.html van egy új Ambient képességkészlet (a Linux 4.3 óta). Úgy tűnik, ez lehetővé teszi, amire szükség van.
Válasz
A Lekensteyn válaszának enyhe módosítása rövidebb meghívást eredményez a legújabb kernelek számára:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw -- \ -c "./ping -c1 localhost"
Megjegyzés: A sudoers fájltól függően ez zűrzavart okozhat a környezetében (pl. a HOME megváltoztatása). A capsh megváltoztatja az uid-jét, de nem fog tenni semmit a sudo környezeti változásainak visszaállításáért.
Tehát mi folyik itt? Nézzünk utána:
-
sudo /usr/sbin/capsh
: Gyökérként indulunk, amelynek minden képessége megvan a hatékony (meg tudja csinálni) és az engedélyezett (ezt hozzáadhatja a hatékony) halmazokhoz, de a többi halmazban semmi . Ezeket a halmazokat egy pillanat alatt lefedjük. -
--keep=1
: Biztonsági (olvasható: régi) okokból a képességek általában nem öröklik a root- > nem root ID kapcsolók. Ez a jelző engedélyezi aSECBIT_KEEP_CAPS
néven ismert funkciót, amely ezt lehetővé teszi. Érdemes megjegyezni, hogy az exec során automatikusan törlődik , ami jó ötlet. -
--user=$USER
: Most, hogy az UID változtatásakor nem veszítjük el az összes képességünket, kiesünk a gyökérből. ASECBIT_KEEP_CAPS
-nek köszönhetően megtartjuk a root-szerű privilégiumokat, ami tovább kavarhat a képességeinkkel. -
--inh=cap_net_raw
: Ez hozzáadja a célképességünket az örökölhető halmazhoz, mert nem tehet egy képességet ambient (lásd a következő elemet), ha nem örökölhető. -
--addamb=cap_net_raw
: Annak ellenére, hogy “div div = = 8afebb4f01”>
-t kértünk, egy privilegizált (nincs setuid / setgid / setcap) bináris bináris fog még mindig execve
törölje képességeinket, így nem lesznek jogosultságai. A Linux 4.3 hozzáadta az ambient készletet, amelyet a kiváltságos bináris fájlok végrehajtásakor adnak vissza a hatékony és engedélyezett halmazokhoz. Tökéletes!
-- -c ...
: Miután mindent beállítottunk, ezekkel az argokkal hajtjuk végre a bash-t. A képességkészletek törlődnek (mert a bash kiváltságtalan), a környezeti halmaz hozzáadódik, és voila! Megvan a szükséges engedély a nyers nyershez aljzatok. Ezt a speciális ==
argumentum a capsh-re, ami a parancssor többi részével végrehajtja:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw == --print Current: = cap_net_raw+eip
Ami azt jelenti, hogy a cap_net_raw a hatékony (meg tudja csinálni), örökölhető (átadhatja a gyermekfolyamatoknak) és megengedett (megengedett, hogy megszerezze). És ezeken kívül nincs más képesség.
A képességekkel és működésükkel kapcsolatos további információkért a legjobb megoldás a képességek (7) kézikönyv . Pontosabban a Transformation of capabilities during execve()
címsor.
Megjegyzések
- Mit értesz alatt korán, mert ehhez számos további képességre van szükség, amelyek ‘ nem eshetnek le, amíg ‘ kész. ?A te esetedben ” root ” néven hajtod végre, tehát még így
--user
sem volt ‘ t megváltozott, ‘ d később is megvan a szükséges képessége? - Köszönjük, hogy felhívta erre a figyelmet! Ennek a parancssornak egy korábbi verziója kifejezetten elvetette a privátokat, ezért előtte szükséges volt a setuid beállítása. Most, hogy a privileket implicit módon az exec részeként elvetjük, ‘ nem szükséges.
capsh
eljut a kollaborációs repóból, nem kapta volna meg a „legújabb”capsh
fájlt, a Debian csomag továbbra sem támogatja környezeti képességek. Az Upstream 2.27.capsh
felhasználása, ambient hiányában (ahogy eredetileg volt). Mi hiányzik. Használnia kell.