Sandbox2 expliqué

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

Technologies concernées

Les sections suivantes présentent les technologies qui constituent la couche de base de Sandbox2.

Espaces de noms Linux

Les espaces de noms Linux sont une tentative 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. Sandbox2 utilise les types d'espaces de noms suivants :

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

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

IPC

Sandbox2 permet d'échanger des données arbitraires entre l'exécuteur Sandbox et le Sandboxee non fiable. Il prend en charge les messages TLV (Type-Length-Value), la transmission des descripteurs de fichiers et l'échange d'identifiants via des jetons et des handles.

Seccomp-BPF

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

seccomp est une fonctionnalité du 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 d'appel système. En fonction de la valeur renvoyée par le programme, il peut exécuter l'appel système, l'ignorer et renvoyer une valeur fictive, mettre fin au processus, générer un signal ou avertir le traceur.

Ptrace

L'appel système ptrace (process trace) fournit une fonctionnalité qui permet au processus de traceur d'observer et de contrôler l'exécution du processus de tracé. Une fois le processus de traceur associé, il contrôle totalement le processus tracé. Pour en savoir plus sur ptrace, consultez Wikipedia ou la page de manuel associée.

Règlement du bac à sable

Le Règlement du bac à sable est la partie la plus importante d'un bac à sable, car il spécifie 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ègle Syscall
  • Configurer un espace de noms

Règle Syscall par défaut

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

Règles étendues concernant les appels système

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

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 limiter les arguments des appels système read, write et close.

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

Une règle Sandbox très stricte pourrait refuser tous les appels système, à l'exception des lectures et des écritures sur les descripteurs de fichiers d'entrée et de sortie standards. Dans ce bac à sable, un programme peut recevoir des entrées, les traiter et renvoyer les sorties. Toutefois, si le processus tentait d'effectuer un autre appel système, il serait arrêté pour non-respect des règles. Par conséquent, si le processus est compromis (exécution de code par un utilisateur malveillant), il ne peut pas faire autre chose que produire une sortie incorrecte (que l'exécuteur et d'autres doivent toujours gérer correctement).

Configurer un espace de noms

L'objet PolicyBuilder est également utilisé pour configurer la vue individuelle du système de fichiers d'un Sandboxee. Il est possible de mapper des fichiers individuels (AddFile / AddFileAt), des répertoires entiers (AddDirectory / AddDirectoryAt) et un espace de stockage temporaire (AddTmpfs) dans l'environnement Sandboxee. De plus, AddLibrariesForBinary peut être utilisé pour mapper automatiquement toutes les bibliothèques requises par l'exécutable à liaison dynamique spécifié.

Indicateurs de ligne de commande

Toute règle Sandbox2 peut être désactivée en spécifiant l'un des indicateurs de ligne de commande suivants. Ces indicateurs sont destinés à des fins de test (par exemple, lors de l'affinage de la stratégie de syscall étendue).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Exécuteur de bac à sable

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

Sandbox2 autorise trois modes d'exécution : autonome, Sandbox2 Forkserver et Custom Forkserver. Si vous utilisez un forkserver, le Sandboxee est créé en tant que processus enfant de l'exécuteur du bac à sable. Ces modes sont expliqués en détail ici.

Sandboxee

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