La API de Sandboxed (SAPI) se basa en el proyecto Sandbox2, que está bien establecido. En esta página, se explica la arquitectura de diseño de la 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 el aislamiento, así como las APIs necesarias para la comunicación con la versión aislada de las bibliotecas de C/C++.
En este diagrama, se muestra la arquitectura de una biblioteca de C/C++ en zona de pruebas de la SAPI:
La SAPI también proporciona primitivas para la sincronización de memoria manual y automática (basada en atributos de puntero personalizados) (arrays, estructuras) entre las bibliotecas de la SAPI y el código del host.
Por último, una API de Transactions de alto nivel permite supervisar las bibliotecas de la 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 de zona de pruebas principal que utiliza la SAPI. Sandbox2 contiene tres componentes principales: la política de Sandbox, 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 aislada. Esto se logra aclarando qué llamadas al sistema se pueden ejecutar. La SAPI usa el mismo mecanismo que Sandbox2. Consulta la sección sobre la política de zona de pruebas y la página de introducción de Sandbox2 para obtener más información sobre cómo diseñar y definir una política de zona de pruebas.
La SAPI usa una política predeterminada, pero también puedes usar una política de zona de pruebas dedicada. Para ello, defínela en un archivo de encabezado sandbox.h y pásala como argumento en la regla de compilación sapi_library.
Biblioteca con zona de pruebas
Esta es la biblioteca de C/C++ en zona de pruebas que se ejecutará en el entorno de zona de pruebas restringido que proporciona Sandbox2. En última instancia, la biblioteca en zona de pruebas expone la funcionalidad requerida que puede consumir el código host.
La biblioteca de zona de pruebas se compila con la regla de compilación sapi_library, en la que puedes especificar una política de zona de pruebas personalizada que defina el entorno de ejecución restringido. Según la biblioteca, es posible que debas escribir código de wrapper o de stub (consulta libcurl), pero no se espera que cambies el código fuente de la biblioteca de C/C++ mientras preparas la versión de la SAPI.
Objeto de SAPI y stub de RPC
El objeto SAPI es un objeto de C++ que expone la API de la biblioteca en zona de pruebas. Reenvía llamadas desde el código del host al stub de RPC, que está integrado en la biblioteca de SAPI junto con la biblioteca en zona de pruebas.
El sistema de compilación genera automáticamente estos dos elementos con la regla de compilación sapi_library()
. La SAPI admite dos sistemas de compilación: Bazel de Google y CMake.
Código de host
El código del host es lo que implementa la lógica proporcionada por la biblioteca de la SAPI. Es lo que, de otro modo, consumiría la versión sin zona de pruebas de la biblioteca C/C++. Por lo tanto, el código del host llama a las funciones que exporta la biblioteca de la SAPI, pasa datos a la zona de pruebas y recibe datos de ella.
El código del host debe adaptarse para usar la biblioteca de la SAPI. En particular, no es posible llamar a las funciones de la biblioteca porque esta se encuentra en un proceso aislado separado. Por lo tanto, la SAPI proporciona herramientas que crean un objeto de SAPI que reenvía llamadas a una biblioteca de SAPI.
Conceptos
Reglas de compilación de Bazel
El proyecto de la 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++ se ejecute en un entorno de zona de pruebas como Sandboxee de Sandbox2. El resultado de la compilación se puede usar como dependencia para la reglacc_binary()
que se usa para compilar el archivo binario del código del host.sapi_interface()
: Genera automáticamente el encabezado que se puede incluir en el archivo binario del código del host.
Para obtener una explicación más exhaustiva de las reglas de compilación, consulta Reglas de compilación.
Variables
La SAPI proporciona varios tipos especiales, llamados Tipos de SAPI, que recomendamos usar en el Código del host. La razón principal por la que se necesitan los tipos de SAPI es el aislamiento de procesos y, por lo tanto, de memoria entre el código del host y la biblioteca en zona de pruebas.
Para obtener una explicación más exhaustiva de este tema y una descripción general de algunos tipos de SAPI que se usan con frecuencia, consulta Variables.
Transacciones
Como se explicó anteriormente, cualquier llamada a la API de una biblioteca en zona de pruebas se pasa a través de una capa de RPC. Para poder controlar una falla en esta capa, debes implementar el control de errores adecuado. El módulo SAPI Transaction proporciona el mecanismo necesario para garantizar que todas las llamadas a una biblioteca en zona de pruebas se completen sin problemas a nivel de RPC o se devuelvan con un error pertinente.
Para obtener una explicación más exhaustiva sobre este tema, consulta Transacciones.
Cómo comenzar
Lee nuestra página Primeros pasos para configurar tu primer proyecto de API de Sandboxed.