Bestandsrechten in Linux

Dag Allemaal. We gaan actief aan de slag en bereiden in januari al veel krachtige lanceringen voor. Er is onder meer de inschrijving bekend gemaakt voor een nieuwe stream van ieders favoriete cursus. "Linux-beheerder". In afwachting van de lancering delen we traditioneel vertalingen van nuttig materiaal.

Bestandsrechten in Linux

Bestandsrechten bieden een veilig alternatief voor uitvoerbare SUID-bestanden, maar kunnen in eerste instantie een beetje verwarrend lijken.


We kennen allemaal binaire bestanden SUID zijn vanuit veiligheidsoogpunt een slechte beslissing. Als uw toepassing beperkte rechten vereist, is er gelukkig een efficiëntere manier bestandsrechten.

Ik zal je wat tijd besparen als je het bovenstaande artikel niet in detail wilt lezen: in wezen staan ​​bestandsrechten processen toe die als root draaien en daarom mogen ze iets doen om bepaalde mogelijkheden te behouden, beperkt deze lijstwanneer ze de rechten laten vallen en worden uitgevoerd door een gebruiker zonder rechten. Dit betekent dat als een aanvaller erin slaagt een proces te compromitteren met behulp van een bufferoverflow of een andere exploit, hij niet kan profiteren van iets anders dan bepaalde minimale privileges die het proces daadwerkelijk nodig heeft.

Machtigingen zijn geweldig voor services die doorgaans altijd als root worden uitgevoerd, maar hoe zit het met opdrachtregelhulpprogramma's? Gelukkig wordt dit ook ondersteund, op voorwaarde dat je de juiste hulpprogramma's hebt geïnstalleerd. Als u Ubuntu gebruikt, heeft u bijvoorbeeld het pakket nodig libcap2-bin. Je zult ook een niet-archaïsche kernel moeten draaien (vanaf versie 2.6.24).

Met deze functies kunnen machtigingen worden gekoppeld aan uitvoerbare bestanden, vergelijkbaar met het instellen van de SUID-bit, maar alleen voor een specifieke set machtigingen. Nutsvoorziening setcap gebruikt om machtigingen aan een bestand toe te voegen en te verwijderen.

De eerste stap is het selecteren van de machtigingen die u nodig hebt. In het belang van dit artikel ga ik ervan uit dat er een netwerkdiagnosetool bestaat met de naam tracewalk, die zou moeten kunnen gebruiken rauwe stopcontacten. Hiervoor moet de applicatie meestal als root worden uitgevoerd, maar tijdens het bekijken de lijst het blijkt dat alleen toestemming nodig is CAP_NET_RAW.

Ervan uitgaande dat u zich in de map bevindt waar het binaire bestand zich bevindt tracewalk, kunt u deze toestemming als volgt toevoegen:

sudo setcap cap_net_raw=eip tracewalk

Negeer het achtervoegsel voorlopig =eip Voor een oplossing zal ik daar over een paar seconden over praten. Houd er rekening mee dat de machtigingsnaam in kleine letters is. U kunt nu controleren of u de machtigingen correct heeft geconfigureerd met:

setcap -v cap_new_raw=eip tracewalk

Of u kunt alle machtigingen weergeven die voor een bepaald uitvoerbaar bestand zijn ingesteld:

getcap tracewalk

Ter referentie: u kunt ook alle machtigingen van het uitvoerbare bestand verwijderen met:

setcap -r tracewalk

Op dit punt zou je het uitvoerbare bestand moeten kunnen uitvoeren als een gebruiker zonder rechten, en het zou in staat moeten zijn om met raw sockets te werken, maar geen van de andere rechten te hebben die de rootgebruiker heeft.

Dus wat betekent dit vreemde achtervoegsel? =eip? Dit vereist enig inzicht in de aard van de machtigingen. Elk proces heeft drie sets machtigingen − effectief, erfelijk en toegestaan:

  • Effectief Machtigingen zijn machtigingen die bepalen wat een proces daadwerkelijk kan doen. Het kan bijvoorbeeld niet overweg met raw sockets if CAP_NET_RAW bevindt zich niet in de effectieve set.
  • Beschikbaar machtigingen zijn de machtigingen die een proces mag hebben als het hierom vraagt ​​met behulp van de juiste aanroep. Ze voorkomen dat een proces daadwerkelijk iets doet, tenzij het specifiek is geschreven om de genoemde toestemming te vragen. Hierdoor kunnen processen worden geschreven om alleen kritische machtigingen aan de effectieve set toe te voegen voor de periode waarin ze daadwerkelijk nodig zijn.
  • Overerfbaar machtigingen zijn machtigingen die kunnen worden overgenomen in de toegankelijke set van het voortgebrachte onderliggende proces. Tijdens een operatie fork() of clone() het onderliggende proces krijgt altijd een kopie van de machtigingen van het bovenliggende proces, aangezien het op dat moment nog steeds hetzelfde uitvoerbare bestand uitvoert. Er wordt gebruik gemaakt van een overerfbare set exec() (of gelijkwaardig) wordt aangeroepen om het uitvoerbare bestand door een ander bestand te vervangen. Op dit punt wordt de beschikbare set van het proces gemaskeerd door de overerfbare set om de toegankelijke set te verkrijgen die voor het nieuwe proces zal worden gebruikt.

Het nut dus setcap stelt ons in staat de machtigingen van deze drie sets onafhankelijk toe te voegen voor een bepaald uitvoerbaar bestand. Merk op dat de betekenis van groepen enigszins anders wordt geïnterpreteerd voor bestandsrechten:

  • beschikbaar bestandsmachtigingen zijn de machtigingen die altijd beschikbaar zijn voor een uitvoerbaar bestand, zelfs als het bovenliggende proces dat het heeft aangeroepen deze niet had. Vroeger werden ze ‘gedwongen’ vergunningen genoemd.
  • Geërfd bestandsmachtigingen definiëren een extra masker dat ook kan worden gebruikt om machtigingen uit de set van het aanroepende proces te verwijderen. Ze zijn van toepassing naast de overgenomen set van het aanroepproces, dus de machtiging wordt alleen overgenomen als deze in beide sets bestaat.
  • Effectief bestandsrechten zijn eigenlijk slechts een enkele bit, geen set, en als ze ingesteld zijn, betekent dit dat de gehele beschikbare set ook wordt gekopieerd naar de effectieve set van het nieuwe proces. Dit kan worden gebruikt om machtigingen toe te voegen aan processen die niet specifiek zijn geschreven om deze aan te vragen. Omdat het één bit is, moet u, als u het voor welke machtiging dan ook instelt, deze voor alle machtigingen instellen. Je kunt het beschouwen als een verouderd onderdeel, omdat het wordt gebruikt om machtigingen te laten gebruiken door toepassingen die deze niet ondersteunen.

Bij het opgeven van machtigingen via setcap drie letters e, i и p verwijzen naar effectief, erfelijk en toegankelijk respectievelijk sets. Dus de eerdere specificatie:

sudo setcap cap_net_raw=eip tracewalk

...geeft aan dat de resolutie CAP_NET_RAW moet worden toegevoegd aan de beschikbare en overerfbare sets en dat ook het effectieve bit moet worden ingesteld. Hiermee worden alle eerder ingestelde machtigingen voor het bestand overschreven. Als u meerdere machtigingen tegelijk wilt instellen, gebruikt u een door komma's gescheiden lijst:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

Handleiding voor machtigingen bespreekt dit allemaal in meer detail, maar hopelijk heeft dit bericht een beetje duidelijk gemaakt wat er aan de hand is. Er zijn nog maar een paar kanttekeningen en trucs te noemen.

Ten eerste werken bestandsmogelijkheden niet met symlinks; je moet ze toepassen op het binaire bestand zelf (dat wil zeggen het doel van de symlink).

Ten tweede werken ze niet met geïnterpreteerde scripts. Als u bijvoorbeeld een Python-script heeft waaraan u machtigingen wilt toewijzen, moet u dit aan de Python-interpreter zelf toewijzen. Uiteraard is dit een potentieel beveiligingsprobleem, omdat dan alle scripts die met die tolk worden uitgevoerd de gespecificeerde toestemming zullen hebben, hoewel dit nog steeds aanzienlijk beter is dan het SUID te maken. De meest gebruikelijke oplossing lijkt het schrijven van een afzonderlijk uitvoerbaar bestand in C of een gelijkwaardig bestand te zijn dat de noodzakelijke bewerkingen kan uitvoeren en dit vanuit een script kan aanroepen. Dit is vergelijkbaar met de aanpak die wordt gebruikt door Wireshark, waarbij gebruik wordt gemaakt van een binair bestand /usr/bin/dumpcap bevoorrechte bewerkingen uitvoeren:

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

Ten derde worden bestandsrechten uitgeschakeld als u een omgevingsvariabele gebruikt LD_LIBRARY_PATH om duidelijke veiligheidsredenen(1). Hetzelfde geldt voor LD_PRELOAD, voor zover ik weet.

1. Omdat een aanvaller uiteraard een van de standaardbibliotheken kan vervangen en gebruiken LD_LIBRARY_PATHom te forceren dat zijn bibliotheek wordt aangeroepen in plaats van die van het systeem, en daarom zijn eigen willekeurige code laat uitvoeren met dezelfde rechten als de aanroepende applicatie.

Dat is alles. Meer informatie over het cursusprogramma vindt u op webinar, dat plaatsvindt op 24 januari.

Bron: www.habr.com

Voeg een reactie