Projekt zur Portierung des Pledge-Isolationsmechanismus fĂŒr Linux

Der Autor der Standard-C-Bibliothek Cosmopolitan und der Plattform Redbean hat die Umsetzung des Pledge()-Isolationsmechanismus fĂŒr Linux bekannt gegeben. UrsprĂŒnglich wurde Pledge vom OpenBSD-Projekt entwickelt und ermöglicht es, Anwendungen selektiv den Zugriff auf ungenutzte Systemaufrufe zu untersagen (fĂŒr jede Anwendung wird eine Art von Whitelist der Systemaufrufe erstellt, wĂ€hrend andere Aufrufe verboten werden). Im Gegensatz zu den in Linux verfĂŒgbaren Mechanismen zur Zugangskontrolle fĂŒr Systemaufrufe, wie seccomp, wurde der Pledge-Mechanismus von Anfang an mit dem Ziel entwickelt, die Anwendung zu vereinfachen.

Die gescheiterte Initiative zur Isolierung von Anwendungen des Basisumfelds von OpenBSD unter Verwendung des Systrace-Mechanismus hat gezeigt, dass die Isolierung auf der Ebene einzelner Systemaufrufe zu kompliziert und aufwendig ist. Als Alternative wurde Pledge vorgeschlagen, das es ermöglicht, Isolationsregeln zu erstellen, ohne sich in die Details zu vertiefen und bereits bestehende Zugriffsklassen zu nutzen. Zum Beispiel werden Klassen wie stdio (Eingabe/Ausgabe), rpath (nur Lesezugriff auf Dateien), wpath (Schreibzugriff auf Dateien), cpath (Dateierstellung), tmppath (Arbeiten mit temporĂ€ren Dateien), inet (Netzwerksockets), unix (Unix-Sockets), dns (DNS-Resolution), getpw (Lesezugriff auf die Benutzerdatenbank), ioctl (ioctl-Aufruf), proc (Prozessverwaltung), exec (ProzessausfĂŒhrung) und id (Zugriffsrechteverwaltung) angeboten.

Die Regeln fĂŒr den Umgang mit Systemaufrufen werden in Form von Anmerkungen festgelegt, die eine Liste der erlaubten Klassen von Systemaufrufen sowie ein Array von Dateipfaden enthalten, auf die der Zugriff erlaubt ist. Nach dem Erstellen und Starten der modifizierten Anwendung ĂŒbernimmt der Kernel die Überwachung der Einhaltung der festgelegten Regeln.

Eine separate Implementierung von Pledge fĂŒr FreeBSD wird entwickelt, die die Isolierung von Anwendungen ermöglicht, ohne deren Code zu Ă€ndern, wĂ€hrend der Aufruf von Pledge in OpenBSD auf eine enge Integration mit dem Basisumfeld und das HinzufĂŒgen von Anmerkungen im Code jeder Anwendung abzielt.

Die Entwickler des Pledge-Ports fĂŒr Linux haben sich am Beispiel von FreeBSD orientiert und anstelle von Änderungen am Code ein ĂŒbergreifendes Tool pledge.com erstellt, das es ermöglicht, EinschrĂ€nkungen anzuwenden, ohne den Anwendungscode zu Ă€ndern. Um beispielsweise das Tool curl mit eingeschrĂ€nktem Zugriff nur auf die Klassen der Systemaufrufe stdio, rpath, inet und threadstdio zu starten, genĂŒgt der Befehl „./pledge.com -p 'stdio rpath inet thread' curl http://example.com”.

Das Tool pledge funktioniert in allen Linux-Distributionen ab RHEL6 und benötigt keinen Root-Zugriff. DarĂŒber hinaus wird auf Basis der Bibliothek cosmopolitan eine API bereitgestellt, die eine Verwaltung der EinschrĂ€nkungen im C-Code ermöglicht und es unter anderem erlaubt, Enklaven zur selektiven EinschrĂ€nkung des Zugriffs in Verbindung mit bestimmten Funktionen der Anwendung zu erstellen.

Die Implementierung erfordert keine Änderungen am Kernel — die pledge-EinschrĂ€nkungen werden in SECCOMP BPF-Regeln ĂŒbersetzt und mit dem nativen Isolationsmechanismus fĂŒr Systemaufrufe in Linux verarbeitet. Beispielsweise wird der Aufruf pledge("stdio rpath", 0) in einen BPF-Filter umgewandelt: 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 */ };

Quelle: opennet.ru

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster