Projet de portage du mécanisme d'isolation pledge pour Linux

L'auteur de la bibliothèque standard C Cosmopolitan et de la plateforme Redbean a annoncé la mise en œuvre du mécanisme d'isolation pledge() pour Linux. À l'origine, pledge a été développé par le projet OpenBSD et permet d'interdire sélectivement aux applications d'accéder à des appels système inutilisés (un semblant de liste blanche des appels système est formé pour l'application, tandis que les autres appels sont interdits). Contrairement aux mécanismes d'accès aux appels système disponibles sous Linux, tels que seccomp, le mécanisme pledge a été conçu dès le départ pour maximiser la simplicité d'utilisation.

L'initiative infructueuse de l'isolation des applications de l'environnement de base OpenBSD utilisant le mécanisme systrace a montré que l'isolation au niveau des appels système individuels est trop complexe et laborieuse. Comme alternative, pledge a été proposé, permettant de créer des règles d'isolation sans se plonger dans les détails et en manipulant des classes d'accès prêtes à l'emploi. Par exemple, des classes telles que stdio (entrée/sortie), rpath (lecture seule de fichiers), wpath (écriture de fichiers), cpath (création de fichiers), tmppath (travail avec des fichiers temporaires), inet (sockets réseau), unix (sockets unix), dns (résolution DNS), getpw (accès en lecture à la base d'utilisateurs), ioctl (appel ioctl), proc (gestion des processus), exec (lancement de processus) et id (gestion des permissions) sont proposées.

Les règles de travail avec les appels système sont définies sous forme d'annotations, comprenant une liste de classes d'appels système autorisées et un tableau de chemins de fichiers auxquels l'accès est autorisé. Après la compilation et le démarrage de l'application modifiée, le noyau prend en charge le contrôle du respect des règles établies.

Une implémentation distincte de pledge est en cours de développement pour FreeBSD, qui se distingue par la possibilité d'isoler des applications sans modifier leur code, tandis qu'avec OpenBSD, l'appel pledge est destiné à une intégration étroite avec l'environnement de base et à l'ajout d'annotations dans le code de chaque application.

Les développeurs du port pledge pour Linux se sont inspirés de FreeBSD et, au lieu de modifier le code, ont préparé un utilitaire complémentaire pledge.com, permettant d'appliquer des restrictions sans modifier le code de l'application. Par exemple, pour lancer l'utilitaire curl avec un accès uniquement aux classes d'appels système stdio, rpath, inet et threadstdio, il suffit d'exécuter « ./pledge.com -p 'stdio rpath inet thread' curl http://example.com ».

L'outil pledge fonctionne sur toutes les distributions Linux à partir de RHEL6 et ne nécessite pas d'accès root. De plus, basé sur la bibliothèque cosmopolitan, une API est fournie pour gérer les restrictions dans le code des programmes en C, permettant notamment de créer des enclaves pour limiter sélectivement l'accès en fonction de certaines fonctions de l'application.

L'implémentation ne nécessite pas de modifications du noyau — les restrictions pledge sont traduites en règles SECCOMP BPF et traitées par le mécanisme natif d'isolement des appels système de Linux. Par exemple, l'appel pledge("stdio rpath", 0) sera converti en filtre BPF 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 */ };

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster