Project voor de portering van het isolatiemechanisme pledge naar Linux

De auteur van de standaard C-bibliotheek Cosmopolitan en het Redbean-platform heeft de implementatie van het pledge()-isolatiemechanisme voor Linux aangekondigd. Oorspronkelijk is pledge ontwikkeld door het OpenBSD-project en stelt het in staat om selectief de toegang van toepassingen tot ongebruikte systeemaanroepen te verbieden (voor de toepassing wordt een soort witte lijst van systeemaanroepen opgesteld en andere aanroepen worden verboden). In tegenstelling tot de in Linux beschikbare mechanismen voor het beperken van de toegang tot systeemaanroepen, zoals seccomp, is het pledge-mechanisme oorspronkelijk ontwikkeld met het oog op maximale vereenvoudiging van het gebruik.

De mislukte inspanning tot isolatie van toepassingen in de basisomgeving van OpenBSD met behulp van het systrace-mechanisme toonde aan dat isolatie op het niveau van individuele systeemaanroepen te complex en arbeidsintensief is. Als alternatief werd pledge voorgesteld, waarmee isolatieregels konden worden opgesteld zonder in detail te duiken en met kant-en-klare toegangsclasses te werken. Zo worden de volgende classes aangeboden: stdio (invoer/uitvoer), rpath (alleen lezen van bestanden), wpath (schrijven naar bestanden), cpath (bestanden aanmaken), tmppath (werken met tijdelijke bestanden), inet (netwerksockets), unix (unix-sockets), dns (DNS-resolutie), getpw (leestoegang tot de gebruikersdatabase), ioctl (ioctl-aanroep), proc (procesbeheer), exec (processen starten) en id (toegangsrechtenbeheer).

De regels voor het werken met systeemaanroepen worden vastgesteld in de vorm van annotaties, waarin een lijst van toegestane classes van systeemaanroepen en een array van bestandslocaties wordt opgenomen waartoe toegang is toegestaan. Na de bouw en uitvoering van de gemodificeerde applicatie neemt de kernel de verantwoordelijkheid voor het controleren van de naleving van de vastgestelde regels op zich.

Er is een aparte implementatie van pledge voor FreeBSD in ontwikkeling, die zich onderscheidt door de mogelijkheid om toepassingen te isoleren zonder wijzigingen aan hun code aan te brengen, terwijl de pledge-aanroep in OpenBSD gericht is op een nauwe integratie met de basisomgeving en het toevoegen van annotaties in de code van elke toepassing.

De ontwikkelaars van de pledge-port voor Linux hebben het voorbeeld van FreeBSD gevolgd en in plaats van wijzigingen in de code aan te brengen, een hulpprogramma-venster pledge.com voorbereid, dat het mogelijk maakt beperkingen toe te passen zonder de code van de toepassing te wijzigen. Bijvoorbeeld, om de hulpprogramma curl te starten met toegang alleen tot de classes van systeemaanroepen stdio, rpath, inet en threadstdio, is het voldoende om ‘./pledge.com -p ‘stdio rpath inet thread’ curl http://example.com’ uit te voeren.

De pledge-tool werkt op alle Linux-distributies, te beginnen met RHEL6, en vereist geen root-toegang. Bovendien biedt de cosmopolitan-bibliotheek een API voor het beheren van beperkingen in C-code, waarmee het mogelijk is om enclaves te creëren voor het selectief beperken van toegang in verband met bepaalde functies van de applicatie.

De implementatie vereist geen wijzigingen in de kernel — de pledge-beperkingen worden omgezet in SECCOMP BPF-regels en behandeld met behulp van de native isolaatiemechanismen voor systeemaanroepen in Linux. Bijvoorbeeld, de aanroep pledge("stdio rpath", 0) wordt omgezet naar de BPF-filter static const struct sock_filter kFilter[] = { /* L0 */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 - 1), /* L1 */ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])), /* L2 */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 4 - 3, 0), /* L3 */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 0, 13 - 4), /* L4 */ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])), /* L5 */ BPF_STMT(BPF_ALU | BPF_AND | BPF_K, ~0x80800), /* L6 */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0), /* L7 */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 0, 13 - 8), /* L8 */ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[2])), /* L9 */ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 12 - 10, 0), /*L10*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 12 - 11, 0), /*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 17, 0, 13 - 11), /*L12*/ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* next filter */ };

Bron: opennet.ru

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster