Het is de bedoeling om het belofteisolatiemechanisme over te dragen naar Linux

Onlangs hebben de auteur van de Cosmopolitan C-standaardbibliotheek en het Redbean-platform de implementatie van het pledge()-isolatiemechanisme voor Linux aangekondigd.

Pledge, oorspronkelijk ontwikkeld door het OpenBSD-project , stelt je in staat om applicaties selectief de toegang tot ongebruikte systeemoproepen te ontzeggen (door een whitelist van systeemoproepen voor de applicatie te creëren en andere oproepen te blokkeren). In tegenstelling tot mechanismen voor toegangscontrole tot systeemoproepen die beschikbaar zijn in Linux, zoals seccomp, is pledge van de grond af aan ontworpen om zo gebruiksvriendelijk mogelijk te zijn.

Het mislukte initiatief om applicaties in de OpenBSD-basisomgeving te isoleren met behulp van het systrace-mechanisme toonde aan dat isolatie op het niveau van individuele systeemaanroepen te ingewikkeld en tijdrovend is.

Als alternatief werd pledge voorgesteld, waarmee isolatieregels konden worden gecreëerd zonder in detail te treden en voorbereide toegangsklassen te manipuleren.

De aangeboden klassen zijn bijvoorbeeld stdio (invoer/uitvoer), rpath (alleen-lezen bestanden), wpath (schrijfbestanden), cpath (bestanden maken), tmppath (werken met tijdelijke bestanden), inet (socketsnetwerk), unix (unix-sockets ), dns (DNS-resolutie), getpw (leestoegang tot gebruikersdatabase), ioctl (ioctl-aanroep), proc (procescontrole), exec (opstartprocessen) en id (toestemmingscontrole).

De regels voor het werken met systeemoproepen worden gespecificeerd in de vorm van annotaties die een lijst met toegestane systeemoproepklassen en een array met bestandspaden bevatten waartoe toegang is toegestaan. Na het compileren en uitvoeren van de aangepaste applicatie neemt de kernel de taak over om te controleren of aan de gespecificeerde regels wordt voldaan.

Afzonderlijk wordt de belofte-implementatie voor FreeBSD ontwikkeld, die zich onderscheidt door de mogelijkheid om applicaties te isoleren zonder wijzigingen aan hun code aan te brengen, terwijl in OpenBSD de belofte-oproep gericht is op nauwe integratie met de basisomgeving en het toevoegen van annotaties aan de code van elk.

Belofte is als de verboden vrucht die we allemaal begeren als de baas zegt dat we dingen als Linux moeten gebruiken. Waarom is dat belangrijk? Het is omdat de belofte() beveiliging eigenlijk begrijpelijk maakt. Linux heeft nooit echt een beveiligingslaag gehad die gewone stervelingen kunnen begrijpen.

De ontwikkelaars van de Linux-port van pledge volgden het voorbeeld van FreeBSD en maakten, in plaats van codewijzigingen door te voeren, een extra hulpprogramma van pledge.com waarmee je beperkingen kunt instellen zonder je applicatiecode aan te passen. Om bijvoorbeeld het curl-hulpprogramma alleen toegang te geven tot de systeemoproepklassen stdio, rpath, inet en threadstdio, voer je simpelweg `./pledge.com -p 'stdio rpath inet thread' curl http://example.com` uit.

Het hulpprogramma werkt op alle Linux-distributies vanaf RHEL6 en vereist geen root-toegang. Bovendien is er, gebaseerd op de Cosmopolitan-bibliotheek, een API beschikbaar voor het beheren van beperkingen in C-programmacode, waarmee onder andere enclaves kunnen worden gecreëerd om de toegang tot specifieke applicatiefuncties selectief te beperken.

Er zijn in het verleden een paar ontwikkelaars geweest die dit hebben geprobeerd. Ik ga geen namen noemen, omdat de meeste van deze projecten nooit zijn voltooid. Als het gaat om SECOMP, leggen online tutorials alleen uit hoe systeemoproepen op de witte lijst kunnen worden gezet, zodat de meeste mensen hun interesse verliezen voordat ze uitzoeken hoe ze argumenten kunnen filteren. De projecten die vooruit gingen, hadden ook onoplettendheden, zoals het toestaan ​​​​van het wijzigen van setuid/setgid/sticky bits. Daarom mag geen van de huidige alternatieven worden gebruikt. Ik denk dat deze inspanning ons veel dichter bij het hebben van belofte() brengt dan ooit tevoren.

Implementatie vereist geen kernelwijzigingen: beperkingen van hulpprogramma's worden vertaald in SECCOMP BPF-regels en verwerkt met behulp van Linux's native systeemoproepisolatiemechanisme. Als u bijvoorbeeld promise ("stdio rpath", 0) aanroept, wordt dit geconverteerd naar een BPF-filter

Als u tot slot meer wilt weten, kunt u de details vinden via de volgende link.


Voeg dit toe als voorkeursbron in Google.