Hvordan bruker jeg capsh: Jeg prøver å kjøre en uprivilegert ping, med minimale muligheter
On februar 13, 2021 by adminJeg eksperimenterer med evner på Debian Gnu / Linux.
Jeg har kopiert / bin / ping til min nåværende arbeidskatalog. Som forventet fungerer det ikke, det var opprinnelig setuid root.
Jeg gir deretter pingen min de minimale mulighetene (ikke root) ved å gjøre sudo /sbin/setcap cap_net_raw=ep ./ping
, og pingen min fungerer som forventet.
Deretter sudo /sbin/setcap -r ./ping
for å tilbakekalle denne muligheten. Det fungerer nå ikke som forventet.
Jeg prøver nå å få ping til å fungere ved hjelp av capsh
.
capsh
har ingen privilegier, så jeg trenger å kjøre det som root, men deretter slippe root og dermed alle andre privilegier.
Jeg tror jeg også trenger secure-keep-caps
, dette er ikke dokumentert i capsh
, men er i evnen Håndbok. Jeg fikk bitnumrene fra /usr/include/linux/securebits.h
. De virker riktige, ettersom utdataene fra --print
viser at disse bitene er korrekte.
Jeg har tuslet i timevis, så langt har jeg dette. >
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
Imidlertid ping
feil med ping: icmp open socket: Operation not permitted
, dette er hva som skjer når det ikke har evnen. Også --print
viser Current: =p cap_net_raw+i
, dette er ikke nok vi trenger e
.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
vil sette muligheten til Current: = cap_net_raw+eip
dette er riktig, men etterlater oss som root
.
Edit-1
Jeg har nå prøvd sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
Dette gir:
touch: cannot touch `zz": Permission denied ping: icmp open socket: Operation not permitted
Den første feilen forventes som secure-noroot: yes
Men den andre er ikke Current: = cap_net_raw+eip
Edit-2
Hvis jeg setter ==
før --print
, er det nå viser Current: = cap_net_raw+i
, slik at det forklarer den forrige feilen, men ikke hvorfor vi mister muligheten når vi bytter ut av roten, jeg skjønt at secure-keep-caps
fikse det.
Edit-3
Fra det jeg kan se, mister jeg Effektiv (e) og Tillatt (p), når exec kalles. Dette er forventet, men jeg trodde at sikre oppbevaringshetter burde hindre at de går tapt. Mangler jeg noe.
Edit-4
Jeg har forsket mer og lest håndboken på nytt. Det ser ut til at e
og p
funksjoner går tapt når: du bytter fra bruker root
(eller bruk secure-noroot
, og gjør dermed roten til en normal bruker), dette kan overstyres med secure-keep-caps
; når du ringer til exec
, så vidt jeg kan si er dette en invariant.
Så vidt jeg kan se, fungerer det i henhold til manualen. Så vidt jeg kan fortelle er det ingen måte å gjøre noe nyttig med capsh
. Så vidt jeg kan si, for å bruke evner, må du: bruke filfunksjoner eller ha et program som er klar over funksjoner som ikke bruker exec
. Derfor ingen privilegert innpakning.
Så nå er spørsmålet mitt hva jeg mangler, hva er capsh
til.
Edit-5
Jeg har lagt til et svar om omgivelsesfunksjonene. Kanskje capsh
også kan brukes med arvelige muligheter, men for å være nyttig må disse settes på den kjørbare filen. Jeg kan ikke se hvordan capsh kan gjøre noe nyttig uten omgivelsesfunksjoner, eller for å tillate arvede evner.
Versjoner:
-
capsh
fra pakkelibcap2-bin
versjon1:2.22-1.2
- før edit-3 Jeg tok tak i den siste
capsh
fragit://git.debian.org/collab-maint/libcap2.git
og begynte å bruke den. -
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
User-land er 32bit.
Kommentarer
Svar
Evner er egenskaper for prosesser. Tradisjonelt er det tre sett:
- Tillatte muligheter ( p ): evner som kan være «aktivert» i den nåværende prosessen.
- Effektive evner ( e ): funksjoner som for øyeblikket er brukbare i den nåværende prosessen.
- Arvelige evner ( i ): filfunksjoner som kan arves.
Programmer som kjøres som root, har alltid full tillatte og effektive muligheter, så «å legge til» flere funksjoner har ingen merkbar effekt. (Det arvelige evnesettet er normalt tomt.) Med setcap cap_net_raw+ep ping
aktiverer du disse funksjonene som standard for alle brukere som kjører dette programmet.
Dessverre er disse mulighetene bundet til utført fil og blir ikke beholdt etter å ha utført en ny underordnet prosess. Linux 4.3 introduserte Omgivelsesfunksjoner som gjør at evner kan arves av underordnede prosesser. (Se også Transformasjon av evner under execve () i evner (7) .)
Mens du spiller med evner, vær oppmerksom på disse fallgruvene:
- Når du bytter bruker fra rot til ikke-rot, tømmes de effektive og tillatte funksjonene (se Effekt av endringer av bruker-ID på evner i evner (7) ). Du kan bruke
--keep=1
alternativet forcapsh
for å unngå å tømme settene. - Innstillingen for omgivelsesfunksjoner blir ryddet når endre bruker- eller gruppe-ID-ene. Løsning: legg til omgivelsesfunksjonene etter endring av bruker-ID, men før utføring av en underordnet prosess.
- En evne kan bare legges til omgivelsesfunksjonene sett hvis det allerede er i både tillatte og arvelige funksjonssett.
Siden libcap 2.26 fikk capsh
-programmet muligheten til å endre omgivelsesfunksjonene via alternativer som --addamb
( commit ). Merk at rekkefølgen for opsjoner er betydelig. Eksempel på bruk:
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"
Tips: Du kan legge til --print
alternativet hvor som helst i capsh
kommandolinje og se dens nåværende funksjonstilstand.
Merk: cap_setpcap
er nødvendig for --addamb
mens cap_setuid,cap_setgid
er nødvendig for --user
alternativet.
Kommentarer
- Hvilket spesifikt versjonsnummer på libcap har siden capsh –addamb? 2.32 utgivelsesnotater nevnte nye capsh-funksjoner, men ordene var vage.
- @ 把 友情 留 在 无 无 Da svaret opprinnelig ble skrevet, støttet bare git master det. Siden da har libcap 2.26 blitt utgitt med støtte for
--addamb
-alternativet. Jeg har oppdatert svaret tilsvarende. - Dessverre er disse funksjonene bundet til den utførte filen og blir ikke beholdt etter å ha kjørt en ny underordnet prosess. – av underordnet prosess Jeg tenker vanligvis på
fork(2)
, som arver evnene. Bareexecve(2)
arver ikke ‘ t evnene, men det skaper ikke ‘ t et barn prosess. Har jeg feil? - Sitering
man capabiltiies
: Et barn opprettet viafork(2)
arver kopier av foreldrene ‘ s funksjonssett.
Svar
Lekensteyns svar virker nøyaktig og fullstendig, men jeg vil prøve å gi en annen forklaring fra en annen vinkel som vil prøve å understreke problemet som omgivelseskapasiteten løser.
Når du kjører sudo capsh --user=<some_user> --
Det er to interessesystemanrop som fører til at kapasiteter beregnes på nytt (og potensielt blir droppet):
-
setuid
: I henhold tilman capabilities
:
SECBIT_KEEP_CAPS Hvis du angir dette flagget, kan en tråd som har en eller flere 0 UIDer for å beholde sine evner når den bytter alle sine UID-er til en ikke-null-verdi. Hvis dette flagget ikke er satt, fører en slik UID-bryter til at tråden mister alle muligheter.
Med andre ord, i capsh
-kommandoen ovenfor, må vi sørge for at SECBIT_KEEP_CAPS er satt under setuid
systemanrop. Ellers går alle evner tapt. Dette er hva --keep=1
gjør. Så nå blir kommandoen sudo capsh --user=<some_user> --keep=1 --
-
execve
: Hvis vi bruk alternativet--keep=1
, alle funksjonssett (effektive, tillatte, arvelige) bevares frem tilexecve
systemanrop, menexecve
fører til at evner blir beregnet på nytt (for ikke-rotbrukere) også, og i en ikke så åpenbar måte.Kort sagt, før tillegg av omgivelsesfunksjonene er satt , for en evne til å være i en tråd «s» tillatt » angitt etter etexecve
-anrop, enten:- Filen må ha den muligheten i sitt «tillatte» sett . Dette kan gjøres med
setcap cap_net_raw+p /bin/bash
. Å gjøre dette gjør at hele øvelsen er ubrukelig, siden trådens kapasitetssett (annet enn avgrensningssettet) ikke lenger har noen effekt. - Både filen og tråden må ha den muligheten i sine «arvelige» sett . Du tror kanskje at
setcap cap_net_raw+i
ville gjort susen, men det viser seg atexecve
fører til at en tråds nedarvbare tillatelser blir droppet når de blir kalt en uprivilegerte brukere (som vi for øyeblikket er takket væresetuid
). Det er altså ingen måte å tilfredsstille denne betingelsen som en uprivilegert bruker.
- Filen må ha den muligheten i sitt «tillatte» sett . Dette kan gjøres med
Omgivelsesfunksjoner introdusert i Linux 4.3 gjør det mulig for en tråd å beholde sine evner selv etter en setuid
til en uprivilegert bruker etterfulgt av en execve
, uten å måtte stole på filfunksjonene.
Svar
Det kan være en feil / funksjon i kjernen. Det har vært noen diskusjoner:
- https://bugzilla.altlinux.org/show_bug.cgi?id=16694
- http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-03/5224.html
Jeg aner ikke om noe har vært d en, for å fikse det.
Ikke misforstå – nåværende oppførsel er sikker. Men det er så sikkert at det kommer i veien for ting som skal se ut til å fungere.
Rediger: I henhold til http://man7.org/linux/man-pages/man7/capabilities.7.html er det et nytt funksjonssett Ambient (siden Linux 4.3). Det ser ut til at dette vil tillate det som trengs.
Svar
En liten justering av Lekensteyns svar gir en kortere påkalling for nylige kjerner:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw -- \ -c "./ping -c1 localhost"
Merk: Avhengig av sudoers-filen, kan dette gjøre et rot av miljøet ditt (f.eks. å endre HJEM). capsh vil endre din bruker, men den vil ikke gjøre noe for å tilbakestille sudos miljøendringer.
Så hva skjer her? La oss se:
-
sudo /usr/sbin/capsh
: Vi starter som root, som har alle muligheter i sine effektive (kan gjøre dette) og tillatt (kan legge dette til effektive) sett, men ingenting i de andre settene . Vi vil dekke de andre settene om et øyeblikk. -
--keep=1
: Av sikkerhetsmessige årsaker (les: eldre), arver evner normalt ikke over root- > ID-brytere som ikke er rot. Dette flagget aktiverer en funksjon, kjent somSECBIT_KEEP_CAPS
, som tillater dette. Verdt å merke seg at det blir automatisk ryddet ved exec , som er en god idé. -
--user=$USER
: Nå som vi ikke mister all vår evne til UID-endring, faller vi ut av roten. Takket væreSECBIT_KEEP_CAPS
beholder vi rotlignende privilegier, som lar oss ytterligere rote med våre evner. -
--inh=cap_net_raw
: Dette legger til vår målfunksjon i det arvelige settet, fordi du ikke kan lage en evne til omgivelser (se neste element) hvis det ikke er arvelig. -
--addamb=cap_net_raw
: Selv om vi har bedt omSECBIT_KEEP_CAPS
, vilexecve
av en uprivilegert (ingen setuid / setgid / setcap) binær vil fortsatt tømme våre evner, noe som resulterer i ingen privilegier. Linux 4.3 la til omgivelsessettet, som legges tilbake til de effektive og tillatte settene når du utfører uprivilegerte binærfiler. Perfekt! -
-- -c ...
: Etter å ha satt opp alt, utfører vi bash med disse argumentene. Funksjonssettene er ryddet (fordi bash er uprivilegert), omgivelsessettet blir lagt tilbake, og voila! Vi har nødvendig tillatelse til å gjøre open raw stikkontakter.
Du kan sjekke dette ved hjelp av den spesielle ==
argument til capsh, som får det til å utføre seg selv med resten av kommandolinjen:
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw == --print Current: = cap_net_raw+eip
Hvilket betyr at vi har cap_net_raw som effektiv (kan gjøre det), arvelig (kan overføre det til barneprosesser), og tillatt (får lov til å få det). Og ingen andre funksjoner i noen av disse.
For mer informasjon om evner og hvordan de fungerer, er det beste alternativet ditt evner (7) mansiden . Spesielt overskriften Transformation of capabilities during execve()
.
Kommentarer
- Hva mener du med Dette er gjort tidlig fordi det krever en rekke tilleggsmuligheter som kan ‘ t slippe før etter at ‘ er ferdig. ?I ditt tilfelle kjører du som » root «, så selv
--user
var ikke ‘ t endret, du ‘ vil du fremdeles ha de nødvendige funksjonene senere? - Takk for at du påpekte det! En tidligere versjon av denne kommandolinjen falt eksplisitt privs, så det var nødvendig å stille inn før det. Nå som privs slippes implisitt som en del av exec, er det ‘ ikke nødvendig.
capsh
fra collab-maint repo ville ikke ha gitt deg den «siste»capsh
, Debian-pakken støtter fremdeles ikke omgivelsesmuligheter. Oppstrøms 2.27 gjør det.capsh
, i fravær av omgivende omgivelser (slik det opprinnelig var). Hva savner jeg? Det må ha en bruk.