Sandbox2 expliqué

La conception du bac à sable s'appuie sur des technologies bien établies et bien établies, un cadre de règles et deux processus: l'exécuteur bac à sable et le bac à sableee.

Technologies concernées

Les sections suivantes décrivent les technologies qui constituent la couche de base de Sandbox2.

Espaces de noms Linux

Les espaces de noms Linux tentent de fournir une virtualisation au niveau du système d'exploitation. Bien que plusieurs espaces utilisateur s'exécutent apparemment indépendamment les uns des autres, ils partagent une seule instance de noyau. Le bac à sable2 utilise les types d'espaces de noms suivants:

  • IPC
  • Réseau (sauf s'il est explicitement désactivé en appelant PolicyBuilder::AllowUnrestrictedNetworking())
  • Installer (à l'aide d'une vue personnalisée de l'arborescence du système de fichiers)
  • ID d'achat
  • Utilisateur (sauf s'il est explicitement désactivé en appelant PolicyBuilder::AllowUnsafeKeepCapabilities())
  • UTS

Pour en savoir plus sur les espaces de noms Linux, consultez Wikipédia ou la page de manuel correspondante.

IPC

Le bac à sable2 permet d'échanger des données arbitraires entre l'exécuteur de bac à sable et le bac à sableee non approuvé. Il prend en charge les messages TLV (Type-Length-Value), la transmission de descripteurs de fichier et l'échange d'identifiants via des jetons et des handle.

Seccomp-BPF

Sandbox2 s'appuie sur seccomp-bpf, une extension du mode de calcul sécurisé (seccomp) qui permet d'utiliser des règles BPF (Berkeley Packet Filter) pour filtrer les appels système.

seccomp est une fonctionnalité de noyau Linux qui limite les appels système d'un processus pour n'autoriser que exit, sigreturn, read et write. Si un processus tente d'exécuter un autre appel système, il sera arrêté. L'extension seccomp-bpf offre plus de flexibilité que seccomp. Au lieu d'autoriser un ensemble fixe d'appels système, seccomp-bpf exécute un programme BPF sur les données des appels système et, en fonction de la valeur renvoyée par le programme, il peut exécuter l'appel système, ignorer l'appel système et renvoyer une valeur factice, arrêter le processus, générer un signal ou envoyer une notification au traceur.

Ptrace

L'appel système ptrace (trace de processus) fournit une fonctionnalité qui permet au processus de traceur d'observer et de contrôler l'exécution du processus tracee. Le processus de traçage contrôle totalement la trace une fois l'association effectuée. Pour en savoir plus sur ptrace, consultez Wikipédia ou la page de manuel correspondante.

Règles de bac à sable

Les règles de bac à sable sont la partie la plus importante d'un bac à sable, car elles spécifient les actions que le bac à sable peut ou ne peut pas exécuter. Une règle de bac à sable se compose de deux parties:

  • Règlement Syscall
  • Configuration de l'espace de noms

Règle Syscall par défaut

La règle par défaut bloque les appels système toujours dangereux et prévaut sur la règle étendue fournie par l'utilisateur.

Règle Syscall étendue

La règle d'appel système étendue peut être créée à l'aide de notre classe PolicyBuilder. Cette classe définit un certain nombre de règles de commodité (par exemple, AllowStaticStartup, AllowDynamicStartup, AllowOpen) qui peuvent être utilisées pour améliorer la lisibilité de votre stratégie.

Si vous souhaitez restreindre davantage les appels système ou exiger des règles plus complexes, vous pouvez spécifier des macros BPF brutes avec AddPolicyOnSyscall et AddPolicyOnSyscalls. L'exemple crc4 utilise ce mécanisme pour restreindre les arguments des appels système read, write et close.

En règle générale, plus la règle de bac à sable est stricte, mieux c'est, car l'exploitation de toute faille présente dans le code sera limitée par cette règle. Si vous êtes en mesure de spécifier exactement quels appels système et quels arguments sont nécessaires au fonctionnement normal du programme, tout pirate informatique exploitant une vulnérabilité d'exécution de code est également soumis aux mêmes limites.

Une stratégie de bac à sable très stricte pourrait refuser tous les appels système, sauf les lectures et les écritures sur les descripteurs de fichier d'entrée et de sortie standards. Dans ce bac à sable, un programme peut recevoir des entrées, les traiter et renvoyer le résultat. Cependant, si le processus tentait d'effectuer tout autre appel système, il serait arrêté pour non-respect des règles. Par conséquent, si le processus est compromis (l'exécution du code par un utilisateur malveillant), il ne peut rien faire de plus dangereux que la production d'un mauvais résultat (que l'exécuteur et les autres doivent toujours gérer correctement).

Configuration de l'espace de noms

L'objet PolicyBuilder permet également de configurer une vue individuelle du système de fichiers pour un bac à sable. Des fichiers uniques (AddFile / AddFileAt), des répertoires entiers (AddDirectory / AddDirectoryAt) et un espace de stockage temporaire (AddTmpfs) peuvent être mappés dans l'environnement du Sandboxee. De plus, AddLibrariesForBinary peut être utilisé pour mapper automatiquement toutes les bibliothèques nécessaires au fichier exécutable spécifié associé de manière dynamique.

Indicateurs de ligne de commande

Vous pouvez désactiver n'importe quelle règle Sandbox2 en spécifiant l'un des indicateurs de ligne de commande suivants. Ces indicateurs sont destinés à des fins de test (par exemple, afin d'affiner la règle Extended Syscall).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Exécuteur bac à sable

L'exécuteur de bac à sable est un processus qui ne s'exécute pas lui-même dans un bac à sable. Il s'agit du processus ptrace traceur associé au Sandboxee (processus ptrace tracee). L'exécuteur de bac à sable configure et exécute également une instance Monitor qui suit le bac à sable et fournit des informations sur l'état.

Le bac à sable2 permet trois modes d'exécution: autonome, serveur dupliqué de bac à sable2 et serveur de données fork personnalisé. Si vous utilisez un serveur forkserver, le Sandboxee est créé en tant que processus enfant de l'exécuteur Sandbox. Ces modes sont expliqués en détail ici.

Jeu bac à sable

Le bac à sable est le processus qui s'exécute dans l'environnement de bac à sable restreint défini par les règles de bac à sable. L'exécuteur de bac à sable envoie la règle au bac à sableee via IPC. Le bac à sable applique ensuite la règle. Tout non-respect de cette règle entraînera l'arrêt du processus, sauf disposition contraire (voir le Règlement relatif au bac à sable).