Hej alle sammen. Vi træder aktivt ind i arbejdet og forbereder mange kraftfulde lanceringer allerede i januar. Blandt andet er der åbent for tilmeldinger til det nye hold af den populære kursus. Forud for lanceringen deler vi traditionelt en oversættelse af nyttigt materiale.

Filrettigheder tilbyder et sikkert alternativ til SUID-exekverbare filer, men kan ved første øjekast virke lidt forvirrende.
Vi ved alle, at binære filer er Heldigvis, hvis din applikation har brug for nogle begrænsede privilegier, findes der en mere effektiv metode, kaldet .
Jeg vil spare dig for tid, hvis du vil undgå at læse artiklen ovenfor i detaljer: i essensen tillader filrettigheder processer, der kører under root-brugeren, og derfor har ret til at gøre hvad som helst, at bevare visse begrænsede kapabiliteter, som er afgrænset af , når de afsætter privilegier og kører som en ikke-privilegeret bruger. Det betyder, at hvis en angriber formår at kompromittere processen ved hjælp af en buffer-overløb eller anden udnyttelse, kan han ikke udnytte andet end de specifikke minimale privilegier, som processen faktisk har brug for.
Rettigheder er fremragende til tjenester, der typisk altid kører under root-brugeren, men hvad med kommandolinjeværktøjer? Heldigvis understøttes dette også, forudsat at du har de rette værktøjer installeret. Hvis du bruger Ubuntu, skal du for eksempel bruge pakken libcap2-bin.Du skal også køre et ikke forældet kernel (startende fra version 2.6.24).
Disse funktioner gør det muligt at binde rettigheder til eksekverbare filer på en måde, der ligner opsætningen af SUID-bit, men kun for et bestemt sæt rettigheder. Værktøjet setcap bruges til at tilføje og fjerne rettigheder fra en fil.
Det første skridt er at vælge de rettigheder, du har brug for. For denne artikel antager jeg, at der findes et netværksdiagnosticeringsværktøj kaldet tracewalk,som bør kunne bruge Normalt kræves det, at applikationen kører som root-bruger, men ved at se på fremgår det, at der kun kræves tilladelse CAP_NET_RAW..
Forudsat at du befinder dig i den mappe, hvor den binære fil er placeret, tracewalk,kan du tilføje denne tilladelse som følger:
sudo setcap cap_net_raw=eip tracewalk Ignorer suffikset for nu, =eip for tilladelsen, jeg vil forklare det om et par sekunder. Vær opmærksom på, at tilladelsesnavnet er med små bogstaver. Nu kan du kontrollere, om du har konfigureret tilladelserne korrekt med:
setcap -v cap_new_raw=eip tracewalkEller du kan liste alle tilladelser, der er indstillet for den givne eksekverbare fil:
getcap tracewalk
Til reference kan du også fjerne alle tilladelser fra den eksekverbare fil med:
setcap -r tracewalkPå dette tidspunkt skal du være i stand til at køre den eksekverbare fil som en ikke-privilegeret bruger, og den skal kunne arbejde med rå sockets, men ikke have andre privilegier, som root-brugeren har.
Så hvad betyder dette mærkelige suffiks =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — effektive, arvelige og tilladte (effective, inheritable og permitted):
- Effektive (Effective) tilladelser — det er dem, der bestemmer, hvad processen faktisk kan gøre. For eksempel kan den ikke håndtere rå sockets, hvis
CAP_NET_RAW.den ikke er i det effektive sæt. - Tilladte (Permitted) tilladelser — det er dem, der er tilladt for processen, hvis den anmoder om dem med det relevante kald. De giver ikke processen mulighed for faktisk at udføre noget, medmindre den er specifikt skrevet til at anmode om den angivne tilladelse. Dette giver mulighed for at skrive processer, som kun tilføjer særligt vigtige tilladelser til det effektive sæt i den periode, hvor de virkelig er nødvendige.
- Arvelige (Inheritable) tilladelser — det er dem, der kan arves i det tilgængelige sæt af den afledte datterproces. Under operationen
fork()ellerclone()får datterprocessen altid en kopi af tilladelserne fra forælderprocessen, da den på dette tidspunkt stadig kører den samme eksekverbare fil. Det arvelige sæt anvendes, nårexec()(eller lignende) kaldes for at erstatte den eksekverbare fil med en anden. På dette stadium maskeres processens tilgængelige sæt af det arvelige sæt for at opnå det tilgængelige sæt, der vil blive brugt til den nye proces.
Derfor er værktøjet setcap giver os mulighed for at tilføje tilladelser for disse tre sæt uafhængigt for den pågældende eksekverbare fil. Vær opmærksom på, at værdien af grupperne fortolkes lidt anderledes for filadgangsrettigheder:
- Tilgængelige filrettigheder er dem, der altid er tilgængelige for den eksekverbare fil, selvom den overordnede proces, der kaldte den, ikke havde dem. Tidligere blev de kaldt "tvungne" tilladelser.
- Arvet Filrettigheder definerer en yderligere maske, som også kan bruges til at fjerne tilladelser fra den kaldende proces. De anvendes som supplement til den arv-en-masse fra den kaldende proces, så tilladelsen arves kun, hvis den eksisterer i begge sæt.
- Effektive filrettigheder repræsenterer faktisk blot ét bit og ikke et sæt, og hvis det er indstillet, betyder det, at hele det tilgængelige sæt også kopieres til det effektive sæt for den nye proces. Dette kan bruges til at tilføje tilladelser til processer, der ikke specifikt er skrevet til at anmode om dem. Da det er ét bit, hvis du indstiller det for nogen tilladelser, skal det være indstillet for alle tilladelser. Du kan tænke på det som et legacy-bit, fordi det bruges til at tillade brug af tilladelser for applikationer, der ikke understøtter dem.
Når der angives tilladelser via setcap tre bogstaver e, i og p henviser til effektive, arvede og tilgængelige masser henholdsvis. Så den tidligere specifikation:
sudo setcap cap_net_raw=eip tracewalk … angiver, at tilladelsen CAP_NET_RAW. skal tilføjes til de tilgængelige og arvede sæt, og at det effektive bit også skal være indstillet. Dette vil erstatte eventuelle tidligere indstillede tilladelser i filen. For at indstille flere tilladelser på én gang, brug en kommasepareret liste:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkdiskuterer alt dette mere detaljeret, men forhåbentlig har dette indlæg afmystificeret det, der sker. Kun et par forbehold og tricks er tilbage at nævne.
For det første fungerer filmuligheder ikke med symlinkede filer – du skal anvende dem på selve den binære fil (dvs. målet for symlinket).
For det andet arbejder de ikke med fortolkede scripts. For eksempel, hvis du har et Python-script, som du vil tildele tilladelser til, skal du tildele dem direkte til Python-fortolkeren. Det er åbenlyst et potentielt sikkerhedsproblem, fordi alle scripts, der køres med denne fortolker, dermed vil have de angivne tilladelser, selvom det stadig er betydeligt bedre end at gøre det SUID. Den mest almindelige løsning synes at være at skrive en separat eksekverbar fil i C eller et tilsvarende sprog, der kan udføre de nødvendige operationer og kalde den fra scriptet. Dette ligner den tilgang, der anvendes af Wireshark, som benytter en binær fil. /usr/bin/dumpcap til udførelse af privilegerede operationer:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip For det tredje bliver fil-tilladelser deaktiveret, hvis du bruger en miljøvariabel LD_LIBRARY_PATH af åbenlyse sikkerhedsmæssige grunde(1). Det samme gælder for LD_PRELOAD, så vidt jeg ved.
1. Da en angriber åbenlyst kan erstatte en af de standardbiblioteker og bruge LD_LIBRARY_PATH, for at få sin egen bibliotek til at blive kaldt i stedet for systembiblioteket, og dermed have sin egen vilkårlige kode udført med de samme privilegier som den kaldende applikation.
Det var alt. Du kan få flere detaljer om kursusprogrammet på
Kilde: habr.com
