Pour FreeBSD, une implémentation d'un mécanisme d'isolation des applications, similaire aux appels système plegde et unveil développés par le projet OpenBSD, a été proposée. L'isolation dans plegde se fait par l'interdiction d'accès aux appels système non utilisés par l'application, tandis qu'avec unveil, l'accès est ouvert sélectivement uniquement pour certains chemins de fichiers avec lesquels l'application peut interagir. Un semblant de liste blanche d'appels système et de chemins de fichiers est formé pour l'application, et tous les autres appels et chemins sont interdits.
La différence entre l'analogue de plegde et unveil développé pour FreeBSD réside dans la fourniture d'une couche supplémentaire permettant d'isoler les applications sans modifier leur code ou avec des modifications minimales. Il est important de rappeler qu'avec OpenBSD, plegde et unveil visent une intégration étroite avec l'environnement de base et s'appliquent en ajoutant des annotations spéciales dans le code de chaque application. Pour simplifier l'organisation de la protection, les filtres permettent d'éviter la spécification détaillée au niveau des appels système individuels et de manipuler des classes d'appels système (entrée/sortie, lecture de fichiers, écriture de fichiers, sockets, ioctl, sysctl, lancement de processus, etc.). Les fonctions de restriction d'accès peuvent être appelées dans le code de l'application au fur et à mesure de l'exécution de certaines actions, par exemple, l'accès aux sockets et fichiers peut être fermé après l'ouverture des fichiers nécessaires et l'établissement d'une connexion réseau.
L'auteur du port plegde et unveil pour FreeBSD entend fournir la possibilité d'isoler des applications arbitraires, pour cela un utilitaire appelé curtain a été proposé, permettant d'appliquer aux applications des règles définies dans un fichier séparé. La configuration proposée comprend un fichier avec des paramètres de base, définissant des classes d'appels système et des chemins de fichiers types spécifiques à certaines applications (travail avec le son, interaction réseau, journalisation, etc.), ainsi qu'un fichier avec des règles d'accès pour des applications spécifiques.
L'utilitaire curtain peut être utilisé pour isoler la plupart des utilitaires non modifiés, des processus serveur, des applications graphiques et même des sessions de bureau entières. L'utilisation conjointe de curtain avec les mécanismes d'isolation fournis par les sous-systèmes Jail et Capsicum est supportée. Une isolation imbriquée est également possible, où les applications lancées héritent des règles imposées au processus parent, en les complétant par des restrictions individuelles. Certaines opérations du noyau (outils de débogage, IPC POSIX/SysV, PTYs) sont protégées par un mécanisme de barrières, empêchant l'accès aux objets du noyau créés par un processus qui n'est pas le processus courant ou parent.
Un processus peut configurer sa propre isolation en appelant curtainctl ou en utilisant les fonctions pledge() et unveil() fournies par la bibliothèque libcurtain, similaires à des fonctions existantes dans OpenBSD. Pour suivre les blocages pendant l'exécution de l'application, un sysctl ‘security.curtain.log_level’ est prévu. L'accès aux protocoles X11 et Wayland s'active séparément en spécifiant lors du lancement de curtain les options « -X »/« -Y » et « -W », mais le support des applications graphiques n'est pas encore suffisamment stabilisé et présente un certain nombre de problèmes non résolus (les problèmes se manifestent principalement lors de l'utilisation de X11, et le support de Wayland est réalisé de manière nettement meilleure). Les utilisateurs peuvent ajouter des restrictions supplémentaires en créant des fichiers locaux avec des règles (~/.curtain.conf). Par exemple, pour autoriser l'écriture de Firefox uniquement dans le répertoire ~/Downloads/, on peut ajouter une section « [firefox] » avec la règle « ~/Downloads/ : rw + ».
L'implémentation comprend un module noyau mac_curtain pour le contrôle d'accès obligatoire (MAC, Mandatory Access Control), un ensemble de patches pour le noyau FreeBSD mettant en œuvre les gestionnaires et filtres nécessaires, une bibliothèque libcurtain pour utiliser les fonctions pledge et unveil dans les applications, l'utilitaire curtain, des exemples de fichiers de configuration, un ensemble de tests et des patches pour certains programmes dans l'espace utilisateur (par exemple, pour utiliser $TMPDIR afin d'unifier le travail avec des fichiers temporaires). Dans la mesure du possible, l'auteur souhaite minimiser le nombre de modifications nécessitant des patches au noyau et aux applications.
Source : opennet.ru
