La API de Sandboxed (SAPI) se basa en el proyecto Sandbox2 bien establecido. En esta página, se explica la arquitectura de diseño de SAPI y los conceptos clave.
Descripción general
SAPI está diseñada para proporcionar a los desarrolladores herramientas para preparar bibliotecas de C/C++ para la zona de pruebas, así como las APIs necesarias para la comunicación con la versión de zona de pruebas de las bibliotecas de C/C++.
En este diagrama, se muestra la arquitectura de una biblioteca de C/C++ de zona de pruebas de SAPI:

SAPI también proporciona primitivas para la sincronización de memoria manual y automática (según los atributos de puntero personalizados) (arrays, estructuras) entre las bibliotecas de SAPI y el código de host.
Por último, una API de Transactions de alto nivel permite supervisar las bibliotecas de SAPI y reiniciarlas si fallan (p.ej., debido a incumplimientos de seguridad, fallas o agotamiento de recursos).
Sandbox2
El proyecto de código abierto Sandbox2 es desarrollado y mantenido por ingenieros de seguridad de Google y es la tecnología principal de zona de pruebas que usa SAPI. Sandbox2 contiene tres componentes principales: la política de zona de pruebas, el ejecutor y el Sandboxee.
Política de zona de pruebas
La política de zona de pruebas define el entorno de ejecución restringido para la biblioteca de zona de pruebas. Esto se logra aclarando qué llamadas al sistema se pueden ejecutar. SAPI usa el mismo mecanismo que Sandbox2. Consulta la sección Política de zona de pruebas y la página Cómo comenzar con Sandbox2 para obtener más información sobre cómo diseñar y definir una política de zona de pruebas.
De forma predeterminada, las clases de zona de pruebas de SAPI generadas se inicializan con
DefaultConfig
(sapi::SandboxConfig::DefaultConfig()). DefaultConfig() configura la
zona de pruebas con lo siguiente:
- Una política de Sandbox2 predeterminada compilada con
sapi::Sandbox2Config::DefaultPolicyBuilder() - Límites de tiempo y recursos predeterminados de
sapi::Sandbox2Config::DefaultLimits() - Comunicación de memoria compartida habilitada (vinculada con los permisos de memoria compartida en
DefaultPolicyBuilder()) - Marcas de línea de comandos predeterminadas (
sapi::SandboxConfig::DefaultFlags()) y variables de entorno (sapi::SandboxConfig::DefaultEnvironmentVariables()), que configuran el registro de línea de base y el comportamiento del tiempo de ejecución en el Sandboxee
Para personalizar la política o la configuración de la zona de pruebas, comienza con
sapi::SandboxConfig::DefaultConfig(), modifica el
sapi::SandboxConfig que se muestra y pásalo al constructor de zona de pruebas generado (o
define una subclase de zona de pruebas personalizada en un archivo de encabezado sandbox.h que se pasa a la regla de compilación
sapi_library
). Por ejemplo, puedes compilar una política a partir de
sapi::Sandbox2Config::DefaultPolicyBuilder() y encadenar reglas adicionales (o
construir un
PolicyBuilder
directamente cuando se requiere una configuración más restrictiva). Cuando agregues
marcas o variables de entorno, comienza con sapi::SandboxConfig::DefaultFlags()
o sapi::SandboxConfig::DefaultEnvironmentVariables() para que se
conserven los parámetros de configuración de la línea de base.
Biblioteca de zona de pruebas
Esta es la biblioteca de C/C++ de zona de pruebas que se ejecutará en el entorno de zona de pruebas restringido que proporciona Sandbox2. En última instancia, la biblioteca de zona de pruebas expone la funcionalidad requerida que puede consumir el código de host.
La biblioteca de zona de pruebas se compila con la sapi_library regla de compilación, en la que puedes especificar una política de zona de pruebas personalizada que define el entorno de ejecución restringido. Según la biblioteca, es posible que debas escribir código de wrapper o de código auxiliar (consulta libcurl), pero no se espera que cambies el código fuente de la biblioteca de C/C++ mientras preparas la versión de SAPI.
Objeto SAPI y código auxiliar de RPC
El objeto SAPI es un objeto C++ que expone la API de la biblioteca de zona de pruebas. Reenvía llamadas desde el código de host al código auxiliar de RPC, que está integrado en la biblioteca de SAPI junto con la biblioteca de zona de pruebas.
El sistema de compilación genera automáticamente estos dos elementos con la regla de compilación sapi_library(). SAPI admite dos sistemas de compilación: Bazel de Google
y CMake.
Código de host
El código de host es lo que implementa la lógica que proporciona la biblioteca de SAPI. Es lo que, de lo contrario, consumiría la versión sin zona de pruebas de la biblioteca de C/C++. Por lo tanto, el código de host llama a las funciones exportadas por la biblioteca de SAPI, pasa datos a la zona de pruebas y recibe datos de ella.
El código de host debe adaptarse para usar la biblioteca de SAPI. En particular, no es posible llamar a las funciones de la biblioteca porque esta reside en un proceso de zona de pruebas independiente. Por lo tanto, SAPI proporciona herramientas que crean un objeto SAPI que proxy las llamadas a una biblioteca de SAPI.
Conceptos
Reglas de compilación de Bazel
El proyecto SAPI proporciona dos reglas de compilación de Bazel para la zona de pruebas de una biblioteca de C/C++:
sapi_library(): Crea todos los resultados necesarios para que la biblioteca de C/C++ esté en zona de pruebas como un Sandboxee de Sandbox2. El resultado de la compilación se puede usar como una dependencia para la reglacc_binary()que se usa para compilar el objeto binario del código de host.sapi_interface(): Genera de forma automática el encabezado que se puede incluir en el objeto binario del código de host.
Para obtener una explicación más exhaustiva de las reglas de compilación, consulta Build Rules.
Variables
SAPI proporciona varios tipos especiales, llamados tipos de SAPI, que recomendamos usar en el código de host. El motivo principal por el que se necesitan los tipos de SAPI es el proceso y, por lo tanto, el aislamiento de la memoria entre el código de host y la biblioteca de zona de pruebas.
Para obtener una explicación más exhaustiva de este tema y una descripción general de algunos tipos de SAPI de uso común, consulta Variables.
Transacciones
Como se explicó anteriormente, cualquier llamada a la API a una biblioteca de zona de pruebas se pasa a través de una capa de RPC. Para poder manejar una falla en esta capa, debes implementar el manejo de errores adecuado. El módulo de transacciones de SAPI proporciona el mecanismo necesario para garantizar que todas las llamadas a una biblioteca de zona de pruebas se completen sin problemas a nivel de RPC o se muestren con un error pertinente.
Para obtener una explicación más exhaustiva de este tema, consulta Transacciones.
Cómo comenzar
Lee nuestra página Cómo comenzar para configurar tu primer proyecto de API de Sandboxed.