Explication de l'API Sandbox

L'API Sandboxed (SAPI) s'appuie sur le projet Sandbox2 bien établi. Cette page décrit l'architecture de conception de SAPI et les concepts clés.

Présentation

SAPI est conçu pour fournir aux développeurs des outils permettant de préparer les bibliothèques C/C++ en bac à sable, ainsi que les API nécessaires à la communication avec la version en bac à sable des bibliothèques C/C++.

Ce schéma illustre l'architecture d'une bibliothèque C/C++ en bac à sable SAPI:

Schéma SAPI

SAPI fournit également des primitives pour la synchronisation manuelle et automatique (basée sur des attributs de pointeur personnalisés) de la mémoire (tableaux, structures) entre les bibliothèques SAPI et le code hôte.

Enfin, une API Transactions de haut niveau permet de surveiller les bibliothèques SAPI et de les redémarrer en cas de défaillance (par exemple, en raison de violations de sécurité, de plantages ou de l'épuisement des ressources).

Sandbox2

Le projet Open Source Sandbox2 est développé et géré par les ingénieurs en sécurité de Google. Il s'agit de la principale technologie de bac à sable utilisée par SAPI. Le bac à sable2 contient trois composants principaux : la règle de bac à sable, l'exécuteur et le bac à sable.

Règles de bac à sable

La règle de bac à sable définit l'environnement d'exécution restreint pour la bibliothèque en bac à sable. Pour cela, il clarifie les appels système qui peuvent être exécutés. SAPI utilise le même mécanisme que Sandbox2. Consultez la section Règles relatives au bac à sable et la page de démarrage de Sandbox2 pour savoir comment concevoir et définir une règle de bac à sable.

SAPI utilise une stratégie par défaut. Vous pouvez également utiliser une stratégie de bac à sable dédiée en la définissant dans un fichier d'en-tête sandbox.h et en la transmettant en tant qu'argument dans la règle de compilation sapi_library.

Bibliothèque en bac à sable

Il s'agit de la bibliothèque C/C++ en bac à sable qui sera exécutée dans l'environnement de bac à sable restreint fourni par Sandbox2. En fin de compte, la bibliothèque en bac à sable expose la fonctionnalité requise qui peut être utilisée par le code hôte.

La bibliothèque Sandboxed est conçue avec la règle de compilation sapi_library, dans laquelle vous pouvez spécifier une règle de bac à sable personnalisée qui définit l'environnement d'exécution restreint. Selon la bibliothèque, vous devrez peut-être écrire du code wrapper ou bouchon (voir libcurl), mais vous n'êtes pas censé modifier le code source de la bibliothèque C/C++ lors de la préparation de la version SAPI.

Objet SAPI et souche RPC

L'objet SAPI est un objet C++ qui expose l'API de la bibliothèque Sandboxed. Il transfère les appels du code hôte vers le bouchon RPC, qui est intégré à la bibliothèque SAPI avec la bibliothèque en bac à sable.

Ces deux éléments sont générés automatiquement par le système de compilation à l'aide de la règle de compilation sapi_library(). SAPI est compatible avec deux systèmes de compilation : Bazel et CMake de Google.

Code de l'hôte

Le code hôte implémente la logique fournie par la bibliothèque SAPI. C'est ce qui, autrement, consommerait la version sans bac à sable de la bibliothèque C/C++. Ainsi, le code hôte appelle des fonctions exportées par la bibliothèque SAPI, en transmettant et en recevant des données du bac à sable.

Le code hôte doit être adapté pour utiliser la bibliothèque SAPI. En particulier, il n'est pas possible d'appeler les fonctions de la bibliothèque, car celle-ci se trouve dans un processus distinct en bac à sable. Par conséquent, SAPI fournit des outils qui créent un objet SAPI qui sert de proxy pour les appels vers une bibliothèque SAPI.

Concepts

Règles de compilation Bazel

Le projet SAPI fournit deux règles de compilation Bazel pour la mise en bac à sable d'une bibliothèque C/C++:

  • sapi_library() : crée toutes les sorties nécessaires au bac à sable de la bibliothèque C/C++ en tant que bac à sable Sandbox2. Le résultat de la compilation peut être utilisé comme dépendance de la règle cc_binary() utilisée pour compiler le binaire du code hôte.
  • sapi_interface() : génère automatiquement l'en-tête pouvant être inclus dans le binaire du code hôte.

Pour obtenir une explication plus exhaustive des règles de compilation, consultez Build Rules (Règles de compilation).

Variables

SAPI fournit un certain nombre de types spéciaux, appelés types SAPI, que nous vous recommandons d'utiliser dans le code hôte. La principale raison pour laquelle les types SAPI sont nécessaires est en raison du processus, et donc de la mémoire, de l'isolation entre le code hôte et la bibliothèque en bac à sable.

Pour obtenir une explication plus exhaustive à ce sujet et une présentation de certains types de SAPI couramment utilisés, consultez la section Variables.

Transactions

Comme expliqué ci-dessus, tout appel d'API à une bibliothèque en bac à sable est transmis via une couche RPC. Pour pouvoir gérer une défaillance sur cette couche, vous devez implémenter une gestion des erreurs appropriée. Le module Transaction SAPI fournit le mécanisme nécessaire pour s'assurer que tous les appels à une bibliothèque en bac à sable sont effectués sans problème au niveau du RPC ou qu'ils sont renvoyés avec une erreur pertinente.

Pour obtenir une explication plus exhaustive à ce sujet, consultez la page Transactions.

Premiers pas

Consultez notre page Premiers pas pour configurer votre premier projet d'API en bac à sable.