L'API bac à sable (SAPI) s'appuie sur le projet Sandbox2 bien établi. Cette page explique l'architecture de conception de l'API S 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++ pour le 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++ bac à sable 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 d'échec (par exemple, en raison de failles de sécurité, de plantages ou d'épuisement des ressources).
Sandbox2
Le projet Open Source Sandbox2 est développé et géré par des ingénieurs en sécurité de Google. Il s'agit de la technologie de sandboxing de base utilisée par SAPI. Sandbox2 contient trois composants principaux : la règle Sandbox, l'exécuteur et le Sandboxee.
Règlement du bac à sable
Les règles du bac à sable définissent l'environnement d'exécution restreint pour la bibliothèque bac à sable. Pour ce faire, nous précisons les appels système qui peuvent être exécutés. SAPI utilise le même mécanisme que Sandbox2. Pour en savoir plus sur la conception et la définition d'une règle de bac à sable, consultez la section sur les règles de bac à sable et la page "Premiers pas" pour Sandbox2.
SAPI utilise une règle par défaut. Vous pouvez également utiliser une règle 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 sandboxée expose la fonctionnalité requise qui peut être utilisée par le code hôte.
La bibliothèque bac à sable est créée 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 stub (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 stub RPC
L'objet SAPI est un objet C++ qui expose l'API de la bibliothèque sandboxée. Il transfère les appels du code hôte au stub RPC, qui est intégré à la bibliothèque SAPI avec la bibliothèque sandboxée.
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'organisateur
Le code hôte implémente la logique fournie par la bibliothèque SAPI. Il s'agit de ce qui consommerait autrement la version non sandboxée de la bibliothèque C/C++. Ainsi, le code hôte appelle les fonctions exportées par la bibliothèque SAPI, en transmettant des données au bac à sable et en recevant des données de celui-ci.
Le code hôte doit être adapté pour utiliser la bibliothèque SAPI. Plus précisément, il n'est pas possible d'appeler les fonctions de la bibliothèque, car celle-ci se trouve dans un processus sandbox distinct. Par conséquent, SAPI fournit des outils qui créent un objet SAPI servant de proxy pour les appels à une bibliothèque SAPI.
Concepts
Règles de compilation Bazel
Le projet SAPI fournit deux règles de compilation Bazel pour mettre en bac à sable une bibliothèque C/C++ :
sapi_library()
: crée toutes les sorties nécessaires pour que la bibliothèque C/C++ soit mise en bac à sable en tant que Sandboxee Sandbox2. La sortie de compilation peut être utilisée comme dépendance pour la règlecc_binary()
utilisée pour compiler le binaire du code hôte.sapi_interface()
: génère automatiquement l'en-tête qui peut être inclus dans le binaire du code hôte.
Pour obtenir une explication plus exhaustive des règles de compilation, consultez Règles de compilation.
Variables
L'API SAPI fournit un certain nombre de types spéciaux, appelés types SAPI, que nous vous recommandons d'utiliser dans le code hôte. Les types SAPI sont principalement nécessaires en raison de l'isolation des processus et de la mémoire entre le code hôte et la bibliothèque sandboxée.
Pour obtenir une explication plus exhaustive de ce sujet et une présentation de certains types SAPI couramment utilisés, consultez Variables.
Transactions
Comme expliqué ci-dessus, tout appel d'API à une bibliothèque sandboxée est transmis via une couche RPC. Pour pouvoir gérer un échec à ce niveau, vous devez implémenter une gestion des erreurs appropriée. Le module SAPI Transaction fournit le mécanisme nécessaire pour s'assurer que tous les appels à une bibliothèque bac à sable sont effectués sans problème au niveau RPC ou sont renvoyés avec une erreur pertinente.
Pour une explication plus exhaustive de ce sujet, consultez Transactions.
Premiers pas
Consultez notre page Premiers pas pour configurer votre premier projet d'API bac à sable.